From 667ab96334e9cdb0502c7febda879da0e72cb4d1 Mon Sep 17 00:00:00 2001 From: tgoky Date: Fri, 2 Feb 2024 14:03:54 +0100 Subject: [PATCH 01/12] chore:update bottombar --- .env.example | 3 - src/components/CustomBottomBar/index.tsx | 83 ++++++++++++++++++++++++ 2 files changed, 83 insertions(+), 3 deletions(-) delete mode 100644 .env.example create mode 100644 src/components/CustomBottomBar/index.tsx diff --git a/.env.example b/.env.example deleted file mode 100644 index 5dd56d5..0000000 --- a/.env.example +++ /dev/null @@ -1,3 +0,0 @@ -VITE_WC_KEY_DEV= -VITE_WC_KEY_PROD= -VITE_ANALYTICS_ID= \ No newline at end of file diff --git a/src/components/CustomBottomBar/index.tsx b/src/components/CustomBottomBar/index.tsx new file mode 100644 index 0000000..c82df1c --- /dev/null +++ b/src/components/CustomBottomBar/index.tsx @@ -0,0 +1,83 @@ +import React, { useState } from 'react' +import styled from 'styled-components/macro' + +import Paper from '../TaskBar/MenuComponents/book.png' +// Import your icons/images here +import Tree from '../TaskBar/MenuComponents/discord.png' +import Setting from '../TaskBar/MenuComponents/settings.png' +import Shutdown from '../TaskBar/MenuComponents/shutdown.png' +import { StartMenuListItem } from '../TaskBar/MenuComponents/startMenuListItem' + +interface CustomBottomBarProps { + setSelected: (selected: string) => void + bottomBarVisible: boolean +} + +const ParentContainer = styled.div` + /* Add any additional styling for the parent container */ + margin-top: 137px; /* Adjust the margin-top value as needed */ +` + +const BottomBarMenuStyled = styled.div` + /* Customize the styling for the menu items */ + background-color: #adaac9; + width: 20%; /* Adjust as needed */ + border-bottom: 2px solid #555; + border-right: 3px solid #090808; +` + +const CustomBottomBar: React.FC = ({ setSelected, bottomBarVisible }) => { + const [showSide, setShowSide] = useState(false) + + const settingsSubMenu = ( +
+ {/* Additional menu items for the "Settings" sub-menu */} + setSelected(selected)} + onShowSide={(showSide) => setShowSide(showSide)} + icon={Setting} + name="Collections" + menu="submenu" + /> + {/* Add more sub-menu items as needed */} +
+ ) + + const menuItems = [ + { menu: 'farm', icon: Tree, name: 'Discord' }, + { menu: 'paper', icon: Paper, name: 'Docs' }, + { + menu: 'cp', + icon: Setting, + name: 'Settings', + haveSub: true, + subMenu: settingsSubMenu, + }, + { menu: 'shutdown', icon: Shutdown, name: 'Connect Wallet' }, + ] + + if (!bottomBarVisible) { + return null // Hide the component if bottomBarVisible is false + } + + return ( + + + {menuItems.map((item, index) => ( + setSelected(selected)} + onShowSide={(showSide) => setShowSide(showSide)} + icon={item.icon} + name={item.name} + menu={item.menu} + subMenu={item.subMenu} + /> + ))} + + + ) +} + +export default CustomBottomBar From 7af837d0457dc9e7d25f1a5440c59d9f28c93538 Mon Sep 17 00:00:00 2001 From: tgoky Date: Fri, 2 Feb 2024 14:26:37 +0100 Subject: [PATCH 02/12] chore:update taskBar component --- .../TaskBar/MenuComponents/appUtils.ts | 42 ++++++ .../TaskBar/MenuComponents/book.png | Bin 0 -> 7814 bytes .../TaskBar/MenuComponents/bottombar.tsx | 96 ++++++++++++++ .../TaskBar/MenuComponents/constant.ts | 49 +++++++ .../TaskBar/MenuComponents/discord.png | Bin 0 -> 27321 bytes .../TaskBar/MenuComponents/settings.png | Bin 0 -> 6706 bytes .../TaskBar/MenuComponents/shutdown.png | Bin 0 -> 2751 bytes .../MenuComponents/startMenuListItem.tsx | 123 ++++++++++++++++++ .../TaskBar/MenuComponents/three.png | Bin 0 -> 2778 bytes .../TaskBar/MenuComponents/useCopyText.tsx | 25 ++++ 10 files changed, 335 insertions(+) create mode 100644 src/components/TaskBar/MenuComponents/appUtils.ts create mode 100644 src/components/TaskBar/MenuComponents/book.png create mode 100644 src/components/TaskBar/MenuComponents/bottombar.tsx create mode 100644 src/components/TaskBar/MenuComponents/constant.ts create mode 100644 src/components/TaskBar/MenuComponents/discord.png create mode 100644 src/components/TaskBar/MenuComponents/settings.png create mode 100644 src/components/TaskBar/MenuComponents/shutdown.png create mode 100644 src/components/TaskBar/MenuComponents/startMenuListItem.tsx create mode 100644 src/components/TaskBar/MenuComponents/three.png create mode 100644 src/components/TaskBar/MenuComponents/useCopyText.tsx diff --git a/src/components/TaskBar/MenuComponents/appUtils.ts b/src/components/TaskBar/MenuComponents/appUtils.ts new file mode 100644 index 0000000..f874f26 --- /dev/null +++ b/src/components/TaskBar/MenuComponents/appUtils.ts @@ -0,0 +1,42 @@ + +const truncateRegex = /^(0x[a-zA-Z0-9]{4})[a-zA-Z0-9]+([a-zA-Z0-9]{4})$/; + +/** + * Truncates an ethereum address to the format 0x0000…0000 + * @param address Full address to truncate + * @returns Truncated address + */ +export const truncateEthAddress = (address: string) => { + const match = address.match(truncateRegex); + if (!match) return address; + return `${match[1]}…${match[2]}`; +}; + +export const thousandSeparator = (value: number) => { + let formattedValue = value?.toLocaleString("en-US", { + style: "decimal", + maximumFractionDigits: 3, + }); + + return formattedValue; + }; + + +export const saveTermsAgreement = ( + address: string +) => { + if (typeof window !== "undefined" && !!address) { + localStorage.setItem(`${address}-terms-agreement`, "true"); + } +}; + +export const getTermsAgreement = ( + address: string +) => { + const objectsString = localStorage.getItem(`${address}-terms-agreement`); + console.log("objectsString", objectsString); + if (objectsString) { + return JSON.parse(objectsString); + } + return "false"; +}; \ No newline at end of file diff --git a/src/components/TaskBar/MenuComponents/book.png b/src/components/TaskBar/MenuComponents/book.png new file mode 100644 index 0000000000000000000000000000000000000000..e9054a3e9c8b06900b8ada14284e7eb12a87e637 GIT binary patch literal 7814 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 literal 0 HcmV?d00001 diff --git a/src/components/TaskBar/MenuComponents/bottombar.tsx b/src/components/TaskBar/MenuComponents/bottombar.tsx new file mode 100644 index 0000000..49af8c2 --- /dev/null +++ b/src/components/TaskBar/MenuComponents/bottombar.tsx @@ -0,0 +1,96 @@ + +import Computer from "../assets/computer.png"; +import Tree from "./three.png"; +import Paper from "./book.png"; +import Setting from "./settings.png"; +import Shutdown from "./shutdown.png"; +import { useState} from "react"; + +import { StartMenuListItem } from "./startMenuListItem"; +import { useCopyText } from "./useCopyText"; +import { truncateEthAddress } from "./appUtils"; +// import { contractAddressLove } from "./constant"; + +interface Props { + setSelected: (selected: string) => void; +} + + +const BottomBar = (props: Props) => { + const [showSide, setShowSide] = useState(false); + + const list = [ + { + menu: "farm", + icon: Tree, + name: "Farm", + }, + { + menu: "paper", + icon: Paper, + name: "Paper", + }, + { + menu: "heartbreak", + icon: "/assets/start-icon.png", + name: "MEMECOIN", + }, + { + menu: "cp", + icon: Setting, + name: "Settings", + haveSub: true, + }, + { + menu: "shutdown", + icon: Shutdown, + name: "Shut Down", + }, + ]; + + + + return ( +
+
+ + {list.map((item, index) => ( + props.setSelected(selected)} + onShowSide={(showSide) => setShowSide(showSide)} + icon={item.icon} + name={item.name} + menu={item.menu} + /> + ))} +
+ + {showSide ? ( +
+
{ + props.setSelected("cp"); + }} + className={`flex flex-row justify-between font-windows hover:text-white hover:bg-[#0A0080] cursor-pointer bg-gray-400 w-[187px] h-[39px] absolute bottom-[40px] right-0 border-r-2 border border-b-2 border-b-black border-r-black border-t-white border-l-white + }`} + > +
+
+ icon +
+
+ + Control Panel + +
+
+
+
+
+ ) : null} +
+ ); +}; +export default BottomBar; diff --git a/src/components/TaskBar/MenuComponents/constant.ts b/src/components/TaskBar/MenuComponents/constant.ts new file mode 100644 index 0000000..78a051d --- /dev/null +++ b/src/components/TaskBar/MenuComponents/constant.ts @@ -0,0 +1,49 @@ +export const contractAddressLoveFarm: string = + process.env.NEXT_PUBLIC_CONTRACT_LOVE_FARM || ""; +export const contractAddressLoveClaim: string = + process.env.NEXT_PUBLIC_CONTRACT_LOVE_CLAIM || ""; +export const rpc_url: string = process.env.NEXT_PUBLIC_JSON_RPC_URL || ""; +export const contractAddressLove: string = + process.env.NEXT_PUBLIC_CONTRACT_LOVE || ""; +export const USDETHPoolAddy: string = + process.env.NEXT_PUBLIC_CONTRACT_USDETHPoolAddy || ""; +export const ETHLOVEPoolAddy: string = + process.env.NEXT_PUBLIC_CONTRACT_ETHLOVEPoolAddy || ""; +export const USDCAddress: string = + process.env.NEXT_PUBLIC_CONTRACT_USDCAddress || ""; +export const ETHLPAddy: string = + process.env.NEXT_PUBLIC_CONTRACT_LOVE_ETH_LP || ""; +export const BE_URL: string = process.env.NEXT_PUBLIC_API || ""; +export const MONGOO_URL: string = process.env.MONGOO_URL || ""; +export const ETHERSCAN_CLAIM_LINK = + "https://etherscan.io/address/0xB22C05CeDbF879a661fcc566B5a759d005Cf7b4C"; +export const ETHERSCAN_FARM_LINK = + "https://etherscan.io/address/0xFb063b1ae6471E6795d6ad1FC7f47c1cAb1f3422"; + +export const UNISWAP_LINK = `https://app.uniswap.org/#/add/v2/${contractAddressLove}/ETH`; +export const BIT_QUERY_LINK = + "https://explorer.bitquery.io/ethereum/token/0xb22c05cedbf879a661fcc566b5a759d005cf7b4c"; +export const DEXSCREENER_LINK = + "https://dexscreener.com/ethereum/0xDD97FCe8441dABf221B330269750B18bA82b0CD6"; +export const LOVE_ETH_LP_LINK = `https://app.uniswap.org/#/add/v2/ETH/${contractAddressLove}`; + +export const contractAddressFaith = + process.env.NEXT_PUBLIC_CONTRACT_FAITH || ""; +export const ETHERSCAN_FAITH_LINK = `https://etherscan.io/address/${contractAddressFaith}`; + +export const LOVE_POOLS = [ + { name: "LOVE-ETH", icon: "/assets/love_eth.svg" }, + { name: "LOVE-USDT", icon: "/assets/love_usdt.svg" }, +]; +export const BLOCKS_PER_YEAR = 2591500; +export const IS_DEV_ENV = process.env.NEXT_PUBLIC_NODE_ENV === "dev"; +export const CHAIN_ID = IS_DEV_ENV ? 5 : 1; +export const USDT_CONTRACT_ADDRESS = IS_DEV_ENV + ? "0xdAC17F958D2ee523a2206206994597C13D831ec7" + : "0xdAC17F958D2ee523a2206206994597C13D831ec7"; +export const HOT_JAR_SITE_ID = 3527265; +export const HOT_JAR_VERSION = 6; +export const TELEGRAM_LINK = ""; +export const TWITTER_LINK = ""; +export const HEARTBREAKER_SOCKET_URL = process.env.NEXT_PUBLIC_SOCKET_URL!; +export const HEARTBREAKER_CONTRACT_ADDRESS = process.env.NEXT_PUBLIC_HEARTBREAKER_CONTRACT_ADDRESS!; diff --git a/src/components/TaskBar/MenuComponents/discord.png b/src/components/TaskBar/MenuComponents/discord.png new file mode 100644 index 0000000000000000000000000000000000000000..440dd9a4338d9b88151ddd09c9e10a20b9e55452 GIT binary patch literal 27321 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 NQhcQX300004b3#c}2nYxW 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

RlM8p8f%q#?h z9s#Uh!Lm)JMT_23t+Q|6R(ki{r<9TsPdPcVEPCw#N=&p+LBSxXTn30}`EulWng+mG zEri-NfhEquvQ+?VH@03pZQuSH1C*3xfgSP2ef=`Z8rWoOP%!+ z1_c0u-=mBN5vg5`06;nbWn@_B>#qk1Y92v8>er75;Twb+h^nfx5sK*LTg;J~7X?yT zSvHKoUI7qmCM!a&oIHT5PWy0$;!1;y@QCKm{|P*6LX@u=hT=JaNpHMCQ1e;z;fH^O z^BDuXNDje%1K?{Vq#2+#0Q6slwu;B^)hg{Jx*8nrSf)6hP+IynTn#zd*y91h(G~>3 zmIwhUG0b4Kw$tj>a)Pg|%><8Iodu4Muc8GD@&tqN{r6?;Dk|PW_@h{35A|RMar`$e zElu#WGcq!Sh1u<$i22F~E9&d*^y#OKszrx|g_GHwA#5=YafrogH6hEOJxA4p0TLI+ zxu*#eCOEW&YieGC71~1#d}0R9n4!{x0pd{RojZ3ZJUpCc&z`NyKQX&FMA6XDN}qjJ zse+=V#YE-hlN5E~_?_+qF8=_;$pB7pBF$8dGXr8W?eCbxZ}q;L;j9Mdv9@j7CLDRe znIIKFET1@0=%`dxHPhn7=M|4q@!MIp#XkV?fh{Bqc@DdA`8;tLwQ%9WV$LocJa`as zors9JbLaj5mb3&eNB?Hcnk9k2jN-%{m%2I|eg3(8_NS>S27!1bn0x{x1{VY8TY#83 zoEro4nK`UYPT~5E9&41(jW9^t-}g{agG)NwVkGq}c4Dzu5f4(HQH;PNP6y5QIY8y* z<#g!KAs)I2SFSt2i0^s=5T{Z9giC6RZ5N3g{SU=XIid=)rkL!DbSR zHuWslH#ghqo5Kp#+FiIx}X>kmed1 z8Y*Z$o2>&fsgaHydn7%}%#6l193b7h89~><2eh&a*$8ZrYK3?L{=~-VhNc)kpP@y{8!T>Gj=zUk= zoR{|S0w2?JR6GEPeVA|UjG`wDWu48*d8zQfEXpvAE1m1L<#hze z5vW5^DIEzj!!cW`$vtaR&tfON1)wx6c&oT*fRUJ!lOtP~c)-W#P$z-QZVj6Ty#*jG ztKLS1Dj>v1ee*c?+*QOBbZ-TSVux(Y{ciL z_wL=Re0CT&^Kr@6sqS$4FLXD6INP{UoHk^V8L=mcQOf0jF;(~vqmzod(k|9`W%puvyP=QkA<|8nx3kD-2!J_o#eBLI*Ne%&3Q?_>T2PS(IS)$hFHhkons4v_u|{QO1$ zpdP-({LByi?gI=8Fi4*zuHFbRD8QfqgS void; + onShowSide: (showSide: boolean) => void; + icon: any; + name: string; + menu: string; + subMenu?: React.ReactNode; // Allow subMenu to be optional +} + +// Include the Google Font VT323 using createGlobalStyle + + +// Define styled components +const StartMenuListItemContainer = styled.div` + position: relative; + display: flex; + align-items: center; + font-family: 'font-windows'; + cursor: pointer; + padding: 8px; + border-radius: 4px; + position: relative; /* Added position relative */ + + &:hover { + background-color: #39327a; + border: none; /* Add this line to remove the border on hover */ + color: white; + } +`; + +const MenuItemText = styled.div` + font-size: 22px; + margin-left: 16px; /* Adjust margin as needed */ +`; + +const IconContainer = styled.div` + display: flex; + justify-content: center; + align-items: center; + width: 39px; + height: 39px; + + img { + border: none; /* Remove the border */ + } + + &:hover { + img { + border: none; /* Remove the border on hover */ + } + } +`; + +const ArrowContainer = styled.div` + margin-left: auto; /* Move to the right end */ + transform: scale(3.0); /* Adjust the scale as needed */ + margin-top: 6px; +`; + +const SubMenuContainer = styled.div<{ show?: boolean }>` + position: absolute; + top: 0; + left: 100%; /* Position to the right of the menu item */ + display: ${(props) => (props.show ? "block" : "none")}; + background-color: #adaac9; + color: black; + /* Additional styling for the submenu */ +`; + +// Export the functional component +export const StartMenuListItem = ({ + haveSub, + onSelected, + onShowSide, + icon, + name, + menu, + subMenu, +}: IStartMenuListItemProps) => { + const [showSubMenu, setShowSubMenu] = useState(false); + + return ( + <> + + { + if (haveSub) { + setShowSubMenu(true); + onShowSide(true); + } + }} + onMouseLeave={() => { + if (haveSub) { + setShowSubMenu(false); + onShowSide(false); + } + }} + onClick={() => { + if (!haveSub) { + onSelected(menu); + } + }} + > + + icon + + + + + + {haveSub && } + + {subMenu} + + + ); +}; diff --git a/src/components/TaskBar/MenuComponents/three.png b/src/components/TaskBar/MenuComponents/three.png new file mode 100644 index 0000000000000000000000000000000000000000..7a5e1b7da79b556e7078627245efa77df5927c61 GIT binary patch literal 2778 zcmV<03MKW4P)4`4nVHBgynrgQLc2e1v`N@cm{fjf=3Je^|O|AOP*_a43ed$y35j-)nNF zW~Y8>@UFpM20DzQyd^+v?uX}!S600u+J4<8wjYG3bhp%oyMc(B1P;Ym!*XO=rS&iq zxVh3r*wm^LbOIPmydhr5P5mNujeWp=s#tMvmBtp+dvmX7y`c4^;c>Ona$bw*zpY=i zJpsapsGCN*vj&9A%Iwqvp`Os#2ulNHV{_?r#MO^qEqdSRmD2eT+CC2a3@W{nDs3iH zrM(8pHAyXS8!&erFQdh>jlj2o9^fEA?b!=pHABTA^MJ^8spuMW|4Y#9gv0i1E_g{A7SE)(<2d%olImsK6D34G7C*d`M-BLg%56bB{C zJ@+AC4M2IZE@k%>;7Q{ub*#P2;$@xP1_u!GM54;$}j(Wu(moj3Dzu~oQv z1kigc&HfjGr-3&C=2JcY4$$eKdQStmy#5W)UeLQ`A4vc~gt!X$2tenD@2CxX0FD=^ zh_D#r{c1c4!3rLh99G(^af-})M%U)z} z=S(iSXo={hCA$Flhnig-{4h@^P6m_tj?eUwDWMmEf2uMt zG*ZD!2y^|=z&x&Ix7-N4R9X{e z8`@~`-7$dMjhWmkZRVL1$Mwp|zY(BKVbUs%Tj_W>PFYV&)@#_%aBt4a+1BT+b>gph zL4T4?JynYa!Awnfpv1Y4a+Y@+nN&BvV*sHO+hF3mVc;brkA1K_+tTHp!#!2|Wx$NJ zS&d7K-kTY)P*8}i11H8nxG)4$wM~^a3A;TlGtcd5G0$rsE_DF#AJk)bNbR7-P5^W_ zzX{O8qc6>5sC3}2|620d^Z9-3S0xwh*G^NZFp^=Z0JVYvbot&H%FziCm!)Q z4giLSTcvd@X0+Tbdim03S#u3*Upj#T?h&!v+rSK?GRwKwFyE;Z3L!kStBHq=KIEx_ zI@7uoYxX*9{t2TK8MSb0D7Igh+ds{T;F{%`7Ns}^U?1GRc&26cS4^ezZVf}3lBukO zbZ3(p|5ARYH?=3M79Uf9mxhL~nYlR}b z5m%C9xXAEOC%*d{w0viy1@BA_0aD$ZPNx~3jGwTp1rF!Y1pe?ytC$xl%kzjwllB^g zR%uSZdBj6^lAUOyRiuq*6sMM!AE%b1JCmBx)fvj=hHT-$kEIi(93UO&iFi}|zgYj; zOvx73!Aip)5S>(g)A6AHtbJ^@u1|!u4vsz{F7#p4@|w~@Ud1Y1thFv2#FH>ZOpR8A z3vI&SCEbMY!Pzni%k@vfRMp=AWBYlrapq4j4Ev2WuaA9=q6<1gr}y8SpDitLHJ z=ZXAGE|=SnU4m_nD~+45?tR&^(6-sL?WGh6Jw1LEL87aWg8H6Zfl9=bTqF`1$Ye5w zk4v3AEqxY6u`MY9=NoBkd^?#;nmcjTq-#dFxjB60lqtdUKYO;dB>={+VqHEJjc#>< zL3_=b5gxk8^ji>iV4QI9Ss=WA{e-XL?WeOn>6;E6!$&qmqdc&n3k`K&hD&lRme^}H zYDQRh(%BhwtdxGLX$?=5%*Qdu-dfp4y@P4tcf=K$UAc z#+o)}&a7190%Ie`Q0a5=F>Uo~IQcYJ`yID|Vz_UH`c(H*l8zhs1p{QR-@6=PWS<3wBSThg)NXB!kTSI zX!i%d$+G>^PFQ$&T4yBTgb_WsUCT3)u(^iof^glbbXKV}kEiNF!gZ(8AthmcfT#-z z*WDV{DxH9Yk0IXW5e_6>IMecbYx33cXl@R*A=nSKwb}gSB?j;hr2J<+e!$=tPJaC3 zckiRI*pJ@LW?zK2#lufuldpu`;UP~xc-F-;FG|=94-b6Mg9ilihnt$jG~3P=CiQ*% z=M6t6^9BD2hs60Wq5MW?L%rc!A3?nbam0I{Ut;!6!u;M1& literal 0 HcmV?d00001 diff --git a/src/components/TaskBar/MenuComponents/useCopyText.tsx b/src/components/TaskBar/MenuComponents/useCopyText.tsx new file mode 100644 index 0000000..556a631 --- /dev/null +++ b/src/components/TaskBar/MenuComponents/useCopyText.tsx @@ -0,0 +1,25 @@ +import { useState, useEffect } from "react"; + +export const useCopyText = () => { + const [copied, setCopied] = useState(false); + + useEffect(() => { + const interval = setInterval(() => { + setCopied(false); + }, 3000); + + return () => { + clearInterval(interval); + }; + }, [copied]); + + const handleCopy = (text: string) => { + navigator.clipboard.writeText(text); + setCopied(true); + }; + + return { + onCopyText: handleCopy, + copied + }; +}; From bd64f9b3bef83b1de992b4366194cda12f5d70ba Mon Sep 17 00:00:00 2001 From: tgoky Date: Fri, 2 Feb 2024 14:34:26 +0100 Subject: [PATCH 03/12] chore:edit startMenuListItem --- package.json | 1 + src/pages/OperatingSystem/index.tsx | 81 +++++++++++++++++++---------- yarn.lock | 5 ++ 3 files changed, 59 insertions(+), 28 deletions(-) diff --git a/package.json b/package.json index b130d5d..d8b0554 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "react-draggable": "^4.4.5", "react-ga4": "^2.1.0", "react-helmet-async": "^1.3.0", + "react-icons": "^5.0.1", "react-redux": "^8.0.5", "react-router-dom": "^6.11.2", "react-spring": "^9.7.0", diff --git a/src/pages/OperatingSystem/index.tsx b/src/pages/OperatingSystem/index.tsx index 73cf988..25201f3 100644 --- a/src/pages/OperatingSystem/index.tsx +++ b/src/pages/OperatingSystem/index.tsx @@ -1,14 +1,16 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion */ import MiyaLogo from 'assets/134321870.png' +import CreateNew from 'assets/create_new.png?preset=thumbnail&resize=true' import Folder from 'assets/folder.png?preset=thumbnail&resize=true' import FolderOpen from 'assets/folder_open.png?preset=thumbnail&resize=true' -import CreateNew from 'assets/miyamints1.png?preset=thumbnail&resize=true' -import { Fragment, useEffect, useMemo } from 'react' +import { debounce } from 'lodash' +import React, { Fragment, useEffect, useMemo, useState } from 'react' import { Helmet } from 'react-helmet-async' import { useLocation } from 'react-router-dom' import styled from 'styled-components/macro' import { useWindowSize } from 'usehooks-ts' +import CustomBottomBar from '@/components/CustomBottomBar' import DynamicWrapper from '@/components/DynamicWrapper' import OsLoader from '@/components/OsLoader' import TaskBar from '@/components/TaskBar' @@ -75,20 +77,38 @@ const Icons = styled.div` } ` -// const ComponentPage = Pages.components +const BottomBarContainer = styled.div` + width: 100%; /* Adjust the width as needed */ + height: 50px; /* Adjust the height as needed */ + background-color: #c1c1c1; /* Adjust the background color as needed */ + display: flex; + justify-content: space-between; + align-items: center; + padding: 0 20px; /* Adjust the padding as needed */ + position: absolute; + bottom: 0; + left: 0; +` + +const handleSelected = (selectedItem: string) => { + // Perform actions based on the selected item + console.log(`Selected menu item: ${selectedItem}`) + // You can add more logic here based on the selected item +} + const UploaderPage = Pages.uploader -const ManagePage = Pages.manager + +const DesktopIconMemoized = React.memo(DesktopIcon) export default function OperatingSystem() { + const [bottomBarVisible, setBottomBarVisible] = useState(false) const location = useLocation() - /* Responsiveness stuff */ const { width, height } = useWindowSize() const [, isMobile] = useMemo(() => { const result = getMediaKey(width) return [result, ['upToExtraSmall', 'upToSmall'].includes(result)] }, [width]) - /* Redux stuff */ const dispatch = useAppDispatch() const [windows, zindex, fullScreen, minimized] = useWindows() const firstLoad = useAppSelector((state) => state.experience.firstLoad) @@ -109,6 +129,10 @@ export default function OperatingSystem() { ) } + const handleToggleBottomBar = debounce(() => { + setBottomBarVisible((prevVisible) => !prevVisible) + }, 300) // Adjust the debounce time as needed + useEffect(() => { const page = Object.values(Pages).find((p) => p.path === location.pathname) if (!page || !width) return @@ -150,7 +174,7 @@ export default function OperatingSystem() { ) }) - }, [windows, zindex, fullScreen, isMobile, minimized]) + }, [windows, zindex, fullScreen, isMobile, minimized, dispatch]) return (
@@ -177,47 +201,48 @@ export default function OperatingSystem() { >
- handleOpen('home')}> + handleOpen('home')}> MiyaNet
Explorer -
- + handleOpen(UploaderPage?.id as PageKey)} > {UploaderPage?.label} - - handleOpen(ManagePage?.id as PageKey)}> - {ManagePage?.label} - +
+ null}> + My Collections +
- handleOpen('mint')} realignment={'0 -10px 0 0'} > MiyaMints.exe - - {/* - handleOpen(ComponentPage?.id as PageKey)} - > - {ComponentPage?.label} - - */} - null}> - My collections - + + {/* Additional DesktopIcons can be added here */}
+ {bottomBarVisible && ( + console.log(`Selected: ${selectedItem}`)} + /> + )} - handleTaskbar(id)} /> + handleTaskbar(id)} + toggleBottomBar={handleToggleBottomBar} // Pass the toggle function to TaskBar + /> ) diff --git a/yarn.lock b/yarn.lock index 2dc9296..c70014f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10355,6 +10355,11 @@ react-helmet-async@^1.3.0: react-fast-compare "^3.2.0" shallowequal "^1.1.0" +react-icons@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/react-icons/-/react-icons-5.0.1.tgz#1694e11bfa2a2888cab47dcc30154ce90485feee" + integrity sha512-WqLZJ4bLzlhmsvme6iFdgO8gfZP17rfjYEJ2m9RsZjZ+cc4k1hTzknEz63YS1MeT50kVzoa1Nz36f4BEx+Wigw== + react-is@^16.13.1, react-is@^16.7.0: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" From af6abdcb6f4e9b70f023999b42c1af63388263f3 Mon Sep 17 00:00:00 2001 From: tgoky Date: Fri, 2 Feb 2024 14:37:25 +0100 Subject: [PATCH 04/12] chore:taskBar edit --- .../MenuComponents/startMenuListItem.tsx | 56 +++++++++---------- src/components/TaskBar/index.tsx | 13 ++++- 2 files changed, 37 insertions(+), 32 deletions(-) diff --git a/src/components/TaskBar/MenuComponents/startMenuListItem.tsx b/src/components/TaskBar/MenuComponents/startMenuListItem.tsx index c1cf0ef..1e1315e 100644 --- a/src/components/TaskBar/MenuComponents/startMenuListItem.tsx +++ b/src/components/TaskBar/MenuComponents/startMenuListItem.tsx @@ -1,21 +1,20 @@ -import { MdArrowRight } from "react-icons/md"; -import styled, { createGlobalStyle } from "styled-components/macro"; -import { useState } from "react"; +import { useState } from 'react' +import { MdArrowRight } from 'react-icons/md' +import styled from 'styled-components/macro' // Define interface for props interface IStartMenuListItemProps { - haveSub: boolean | undefined; - onSelected: (selected: string) => void; - onShowSide: (showSide: boolean) => void; - icon: any; - name: string; - menu: string; - subMenu?: React.ReactNode; // Allow subMenu to be optional + haveSub: boolean | undefined + onSelected: (selected: string) => void + onShowSide: (showSide: boolean) => void + icon: any + name: string + menu: string + subMenu?: React.ReactNode // Allow subMenu to be optional } // Include the Google Font VT323 using createGlobalStyle - // Define styled components const StartMenuListItemContainer = styled.div` position: relative; @@ -32,12 +31,12 @@ const StartMenuListItemContainer = styled.div` border: none; /* Add this line to remove the border on hover */ color: white; } -`; +` const MenuItemText = styled.div` font-size: 22px; margin-left: 16px; /* Adjust margin as needed */ -`; +` const IconContainer = styled.div` display: flex; @@ -55,23 +54,23 @@ const IconContainer = styled.div` border: none; /* Remove the border on hover */ } } -`; +` const ArrowContainer = styled.div` margin-left: auto; /* Move to the right end */ - transform: scale(3.0); /* Adjust the scale as needed */ + transform: scale(3); /* Adjust the scale as needed */ margin-top: 6px; -`; +` const SubMenuContainer = styled.div<{ show?: boolean }>` position: absolute; top: 0; left: 100%; /* Position to the right of the menu item */ - display: ${(props) => (props.show ? "block" : "none")}; + display: ${(props) => (props.show ? 'block' : 'none')}; background-color: #adaac9; color: black; /* Additional styling for the submenu */ -`; +` // Export the functional component export const StartMenuListItem = ({ @@ -83,27 +82,26 @@ export const StartMenuListItem = ({ menu, subMenu, }: IStartMenuListItemProps) => { - const [showSubMenu, setShowSubMenu] = useState(false); + const [showSubMenu, setShowSubMenu] = useState(false) return ( <> - { if (haveSub) { - setShowSubMenu(true); - onShowSide(true); + setShowSubMenu(true) + onShowSide(true) } }} onMouseLeave={() => { if (haveSub) { - setShowSubMenu(false); - onShowSide(false); + setShowSubMenu(false) + onShowSide(false) } }} onClick={() => { if (!haveSub) { - onSelected(menu); + onSelected(menu) } }} > @@ -113,11 +111,9 @@ export const StartMenuListItem = ({ - - {haveSub && } - + {haveSub && } {subMenu} - ); -}; + ) +} diff --git a/src/components/TaskBar/index.tsx b/src/components/TaskBar/index.tsx index 1f6c2a4..0f99db5 100644 --- a/src/components/TaskBar/index.tsx +++ b/src/components/TaskBar/index.tsx @@ -8,7 +8,6 @@ import { useWaves } from '@/store/experience/hooks' import { ButtonIcon, HighlightButton } from '../Button' import { VerticalSeparator } from '../Separator' -import StartButton from './StartButton' const NoScroll = styled.div` overflow: hidden; @@ -67,10 +66,12 @@ export default function TaskBar({ active, focus, onClick, + toggleBottomBar, // Add this prop }: { active: string[] focus: string | undefined onClick: (id: string) => void + toggleBottomBar: () => void // Add this prop type }) { const [waves, toggleWaves] = useWaves() const { block } = useAccount() @@ -78,9 +79,16 @@ export default function TaskBar({ return ( + + 🖤 Start + - + {active.map((id) => { const page = Pages[id]! @@ -106,6 +114,7 @@ export default function TaskBar({ })} + From 45788a41e3a2e77c5aea0f68794fd77a243e9c03 Mon Sep 17 00:00:00 2001 From: tgoky Date: Fri, 2 Feb 2024 14:44:45 +0100 Subject: [PATCH 05/12] chore:update operating system --- src/pages/OperatingSystem/index.tsx | 76 ++++++++++++----------------- 1 file changed, 31 insertions(+), 45 deletions(-) diff --git a/src/pages/OperatingSystem/index.tsx b/src/pages/OperatingSystem/index.tsx index 25201f3..2f7fdf6 100644 --- a/src/pages/OperatingSystem/index.tsx +++ b/src/pages/OperatingSystem/index.tsx @@ -1,16 +1,15 @@ /* eslint-disable @typescript-eslint/no-non-null-assertion */ import MiyaLogo from 'assets/134321870.png' -import CreateNew from 'assets/create_new.png?preset=thumbnail&resize=true' import Folder from 'assets/folder.png?preset=thumbnail&resize=true' import FolderOpen from 'assets/folder_open.png?preset=thumbnail&resize=true' +import CreateNew from 'assets/miyamints1.png?preset=thumbnail&resize=true' import { debounce } from 'lodash' -import React, { Fragment, useEffect, useMemo, useState } from 'react' +import { Fragment, useEffect, useMemo, useState } from 'react' import { Helmet } from 'react-helmet-async' import { useLocation } from 'react-router-dom' import styled from 'styled-components/macro' import { useWindowSize } from 'usehooks-ts' -import CustomBottomBar from '@/components/CustomBottomBar' import DynamicWrapper from '@/components/DynamicWrapper' import OsLoader from '@/components/OsLoader' import TaskBar from '@/components/TaskBar' @@ -77,38 +76,21 @@ const Icons = styled.div` } ` -const BottomBarContainer = styled.div` - width: 100%; /* Adjust the width as needed */ - height: 50px; /* Adjust the height as needed */ - background-color: #c1c1c1; /* Adjust the background color as needed */ - display: flex; - justify-content: space-between; - align-items: center; - padding: 0 20px; /* Adjust the padding as needed */ - position: absolute; - bottom: 0; - left: 0; -` - -const handleSelected = (selectedItem: string) => { - // Perform actions based on the selected item - console.log(`Selected menu item: ${selectedItem}`) - // You can add more logic here based on the selected item -} - +// const ComponentPage = Pages.components const UploaderPage = Pages.uploader - -const DesktopIconMemoized = React.memo(DesktopIcon) +const ManagePage = Pages.manager export default function OperatingSystem() { const [bottomBarVisible, setBottomBarVisible] = useState(false) const location = useLocation() + /* Responsiveness stuff */ const { width, height } = useWindowSize() const [, isMobile] = useMemo(() => { const result = getMediaKey(width) return [result, ['upToExtraSmall', 'upToSmall'].includes(result)] }, [width]) + /* Redux stuff */ const dispatch = useAppDispatch() const [windows, zindex, fullScreen, minimized] = useWindows() const firstLoad = useAppSelector((state) => state.experience.firstLoad) @@ -129,10 +111,6 @@ export default function OperatingSystem() { ) } - const handleToggleBottomBar = debounce(() => { - setBottomBarVisible((prevVisible) => !prevVisible) - }, 300) // Adjust the debounce time as needed - useEffect(() => { const page = Object.values(Pages).find((p) => p.path === location.pathname) if (!page || !width) return @@ -156,6 +134,10 @@ export default function OperatingSystem() { dispatch(minimizeWindow({ value: id })) } + const handleToggleBottomBar = debounce(() => { + setBottomBarVisible((prevVisible) => !prevVisible) + }, 300) // Adjust the debounce time as needed + const MemoizedWindows = useMemo(() => { return windows.map((window) => { const page = Pages[window]! @@ -174,7 +156,7 @@ export default function OperatingSystem() { ) }) - }, [windows, zindex, fullScreen, isMobile, minimized, dispatch]) + }, [windows, zindex, fullScreen, isMobile, minimized]) return (
@@ -201,40 +183,44 @@ export default function OperatingSystem() { >
- handleOpen('home')}> + handleOpen('home')}> MiyaNet
Explorer -
- + handleOpen(UploaderPage?.id as PageKey)} > {UploaderPage?.label} - + + handleOpen(ManagePage?.id as PageKey)}> + {ManagePage?.label} +
- null}> - My Collections -
- handleOpen('mint')} realignment={'0 -10px 0 0'} > MiyaMints.exe - - {/* Additional DesktopIcons can be added here */} + + {/* + handleOpen(ComponentPage?.id as PageKey)} + > + {ComponentPage?.label} + + */} + null}> + My collections +
- {bottomBarVisible && ( - console.log(`Selected: ${selectedItem}`)} - /> - )} Date: Fri, 2 Feb 2024 15:00:06 +0100 Subject: [PATCH 06/12] chore:update menuItem --- src/components/CustomBottomBar/index.tsx | 18 ++++++++---------- src/pages/OperatingSystem/index.tsx | 15 +++++++++++---- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/src/components/CustomBottomBar/index.tsx b/src/components/CustomBottomBar/index.tsx index c82df1c..c3185d0 100644 --- a/src/components/CustomBottomBar/index.tsx +++ b/src/components/CustomBottomBar/index.tsx @@ -2,7 +2,6 @@ import React, { useState } from 'react' import styled from 'styled-components/macro' import Paper from '../TaskBar/MenuComponents/book.png' -// Import your icons/images here import Tree from '../TaskBar/MenuComponents/discord.png' import Setting from '../TaskBar/MenuComponents/settings.png' import Shutdown from '../TaskBar/MenuComponents/shutdown.png' @@ -14,14 +13,12 @@ interface CustomBottomBarProps { } const ParentContainer = styled.div` - /* Add any additional styling for the parent container */ - margin-top: 137px; /* Adjust the margin-top value as needed */ + margin-top: 137px; ` const BottomBarMenuStyled = styled.div` - /* Customize the styling for the menu items */ background-color: #adaac9; - width: 20%; /* Adjust as needed */ + width: 20%; border-bottom: 2px solid #555; border-right: 3px solid #090808; ` @@ -31,7 +28,6 @@ const CustomBottomBar: React.FC = ({ setSelected, bottomBa const settingsSubMenu = (
- {/* Additional menu items for the "Settings" sub-menu */} setSelected(selected)} @@ -45,16 +41,17 @@ const CustomBottomBar: React.FC = ({ setSelected, bottomBa ) const menuItems = [ - { menu: 'farm', icon: Tree, name: 'Discord' }, - { menu: 'paper', icon: Paper, name: 'Docs' }, + { id: '1', menu: 'farm', icon: Tree, name: 'Discord' }, + { id: '2', menu: 'paper', icon: Paper, name: 'Docs' }, { + id: '3', menu: 'cp', icon: Setting, name: 'Settings', haveSub: true, subMenu: settingsSubMenu, }, - { menu: 'shutdown', icon: Shutdown, name: 'Connect Wallet' }, + { id: '4', menu: 'shutdown', icon: Shutdown, name: 'Connect Wallet' }, ] if (!bottomBarVisible) { @@ -64,8 +61,9 @@ const CustomBottomBar: React.FC = ({ setSelected, bottomBa return ( - {menuItems.map((item, index) => ( + {menuItems.map((item) => ( setSelected(selected)} onShowSide={(showSide) => setShowSide(showSide)} diff --git a/src/pages/OperatingSystem/index.tsx b/src/pages/OperatingSystem/index.tsx index 2f7fdf6..f98e0aa 100644 --- a/src/pages/OperatingSystem/index.tsx +++ b/src/pages/OperatingSystem/index.tsx @@ -10,6 +10,7 @@ import { useLocation } from 'react-router-dom' import styled from 'styled-components/macro' import { useWindowSize } from 'usehooks-ts' +import CustomBottomBar from '@/components/CustomBottomBar' import DynamicWrapper from '@/components/DynamicWrapper' import OsLoader from '@/components/OsLoader' import TaskBar from '@/components/TaskBar' @@ -111,6 +112,10 @@ export default function OperatingSystem() { ) } + const handleToggleBottomBar = debounce(() => { + setBottomBarVisible((prevVisible) => !prevVisible) + }, 300) // Adjust the debounce time as needed + useEffect(() => { const page = Object.values(Pages).find((p) => p.path === location.pathname) if (!page || !width) return @@ -134,10 +139,6 @@ export default function OperatingSystem() { dispatch(minimizeWindow({ value: id })) } - const handleToggleBottomBar = debounce(() => { - setBottomBarVisible((prevVisible) => !prevVisible) - }, 300) // Adjust the debounce time as needed - const MemoizedWindows = useMemo(() => { return windows.map((window) => { const page = Pages[window]! @@ -221,6 +222,12 @@ export default function OperatingSystem() {
+ {bottomBarVisible && ( + console.log(`Selected: ${selectedItem}`)} + /> + )} Date: Fri, 2 Feb 2024 15:03:50 +0100 Subject: [PATCH 07/12] chore:settings:applications --- src/components/CustomBottomBar/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/CustomBottomBar/index.tsx b/src/components/CustomBottomBar/index.tsx index c3185d0..9db4415 100644 --- a/src/components/CustomBottomBar/index.tsx +++ b/src/components/CustomBottomBar/index.tsx @@ -47,7 +47,7 @@ const CustomBottomBar: React.FC = ({ setSelected, bottomBa id: '3', menu: 'cp', icon: Setting, - name: 'Settings', + name: 'Applications', haveSub: true, subMenu: settingsSubMenu, }, From cd77a280548c863e18323c167bf63961a1b54361 Mon Sep 17 00:00:00 2001 From: tgoky Date: Fri, 2 Feb 2024 15:11:10 +0100 Subject: [PATCH 08/12] chore:narrow bottombar --- src/components/CustomBottomBar/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/CustomBottomBar/index.tsx b/src/components/CustomBottomBar/index.tsx index 9db4415..c67d1bc 100644 --- a/src/components/CustomBottomBar/index.tsx +++ b/src/components/CustomBottomBar/index.tsx @@ -13,7 +13,7 @@ interface CustomBottomBarProps { } const ParentContainer = styled.div` - margin-top: 137px; + margin-top: 285px; ` const BottomBarMenuStyled = styled.div` From 86c3ecf65c2e0c470a5d98cfbb0eca3e918b9171 Mon Sep 17 00:00:00 2001 From: tgoky Date: Fri, 2 Feb 2024 15:35:12 +0100 Subject: [PATCH 09/12] chore:startbutton --- src/components/CustomBottomBar/index.tsx | 47 ++++++++++++++++++------ src/components/TaskBar/StartButton.tsx | 27 ++++++-------- 2 files changed, 47 insertions(+), 27 deletions(-) diff --git a/src/components/CustomBottomBar/index.tsx b/src/components/CustomBottomBar/index.tsx index c67d1bc..e99242d 100644 --- a/src/components/CustomBottomBar/index.tsx +++ b/src/components/CustomBottomBar/index.tsx @@ -6,6 +6,7 @@ import Tree from '../TaskBar/MenuComponents/discord.png' import Setting from '../TaskBar/MenuComponents/settings.png' import Shutdown from '../TaskBar/MenuComponents/shutdown.png' import { StartMenuListItem } from '../TaskBar/MenuComponents/startMenuListItem' +import StartButton from '../TaskBar/StartButton' interface CustomBottomBarProps { setSelected: (selected: string) => void @@ -13,7 +14,7 @@ interface CustomBottomBarProps { } const ParentContainer = styled.div` - margin-top: 285px; + margin-top: 255px; ` const BottomBarMenuStyled = styled.div` @@ -25,12 +26,16 @@ const BottomBarMenuStyled = styled.div` const CustomBottomBar: React.FC = ({ setSelected, bottomBarVisible }) => { const [showSide, setShowSide] = useState(false) + const [showConnectWalletModal, setShowConnectWalletModal] = useState(false) const settingsSubMenu = (
setSelected(selected)} + onSelected={(selected) => { + setSelected(selected) + setShowConnectWalletModal(selected === 'C') // Show Connect Wallet modal when 'Connect Wallet' is selected + }} onShowSide={(showSide) => setShowSide(showSide)} icon={Setting} name="Collections" @@ -51,7 +56,9 @@ const CustomBottomBar: React.FC = ({ setSelected, bottomBa haveSub: true, subMenu: settingsSubMenu, }, + { id: '4', menu: 'shutdown', icon: Shutdown, name: 'Connect Wallet' }, + { id: '5', menu: 'startButton', component: , name: 'Start' }, ] if (!bottomBarVisible) { @@ -62,18 +69,34 @@ const CustomBottomBar: React.FC = ({ setSelected, bottomBa {menuItems.map((item) => ( - setSelected(selected)} - onShowSide={(showSide) => setShowSide(showSide)} - icon={item.icon} - name={item.name} - menu={item.menu} - subMenu={item.subMenu} - /> + + {item.component ? ( + item.component + ) : ( + { + setSelected(selected) + setShowConnectWalletModal(selected === 'C') + }} + onShowSide={(showSide) => setShowSide(showSide)} + icon={item.icon} + name={item.name} + menu={item.menu} + subMenu={item.subMenu} + /> + )} + ))} + + {/* Connect Wallet modal content */} + {showConnectWalletModal && ( +
+ {/* Add your Connect Wallet modal content here */} + Connect Wallet Modal +
+ )}
) } diff --git a/src/components/TaskBar/StartButton.tsx b/src/components/TaskBar/StartButton.tsx index f02caac..04ad764 100644 --- a/src/components/TaskBar/StartButton.tsx +++ b/src/components/TaskBar/StartButton.tsx @@ -3,7 +3,7 @@ import { ConnectButton } from '@rainbow-me/rainbowkit' import { HighlightButton } from '../Button' export default function StartButton() { - // const { disconnect } = useDisconnect() + // const { disconnect } = useDisconnect(); return ( <> @@ -11,6 +11,7 @@ export default function StartButton() { {({ account, chain, openChainModal, openConnectModal, mounted }) => { const ready = mounted const connected = ready && account && chain + return (
{connected && !chain?.unsupported && <>} {(() => { + const buttonStyle = { + height: '100%', + paddingLeft: 6, + paddingRight: 10, + width: '100%', // Set the width to 100% for a wider button + } + if (!connected) { return ( - + 🖤 Start ) @@ -40,11 +44,7 @@ export default function StartButton() { if (chain.unsupported) { return ( - + Wrong network ) @@ -52,10 +52,7 @@ export default function StartButton() { return (
- + 🖤 Start
From 6f01283df0866a062b2e720a70bf5dc7ef0275e9 Mon Sep 17 00:00:00 2001 From: tgoky Date: Fri, 2 Feb 2024 15:44:07 +0100 Subject: [PATCH 10/12] chore:mints --- src/components/CustomBottomBar/index.tsx | 4 ++-- src/components/TaskBar/StartButton.tsx | 9 +++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/components/CustomBottomBar/index.tsx b/src/components/CustomBottomBar/index.tsx index e99242d..9ce687f 100644 --- a/src/components/CustomBottomBar/index.tsx +++ b/src/components/CustomBottomBar/index.tsx @@ -14,7 +14,7 @@ interface CustomBottomBarProps { } const ParentContainer = styled.div` - margin-top: 255px; + margin-top: 265px; ` const BottomBarMenuStyled = styled.div` @@ -57,7 +57,7 @@ const CustomBottomBar: React.FC = ({ setSelected, bottomBa subMenu: settingsSubMenu, }, - { id: '4', menu: 'shutdown', icon: Shutdown, name: 'Connect Wallet' }, + { id: '4', menu: 'shutdown', icon: Shutdown, name: 'Mints' }, { id: '5', menu: 'startButton', component: , name: 'Start' }, ] diff --git a/src/components/TaskBar/StartButton.tsx b/src/components/TaskBar/StartButton.tsx index 04ad764..499d42f 100644 --- a/src/components/TaskBar/StartButton.tsx +++ b/src/components/TaskBar/StartButton.tsx @@ -28,16 +28,17 @@ export default function StartButton() { {connected && !chain?.unsupported && <>} {(() => { const buttonStyle = { - height: '100%', + height: '400%', paddingLeft: 6, paddingRight: 10, - width: '100%', // Set the width to 100% for a wider button + width: '100%', + // Set the width to 100% for a wider button } if (!connected) { return ( - 🖤 Start + Click to Connect Wallet ) } @@ -53,7 +54,7 @@ export default function StartButton() { return (
- 🖤 Start + Click to Connect Wallet
) From 84f2c7f7ac29bb7c9e6458ff40edc1925261afea Mon Sep 17 00:00:00 2001 From: tgoky Date: Wed, 7 Feb 2024 13:02:51 +0100 Subject: [PATCH 11/12] chore:clen up --- .../TaskBar/MenuComponents/bottombar.tsx | 60 ++++++++----------- .../TaskBar/MenuComponents/constant.ts | 49 --------------- 2 files changed, 26 insertions(+), 83 deletions(-) delete mode 100644 src/components/TaskBar/MenuComponents/constant.ts diff --git a/src/components/TaskBar/MenuComponents/bottombar.tsx b/src/components/TaskBar/MenuComponents/bottombar.tsx index 49af8c2..b47f99b 100644 --- a/src/components/TaskBar/MenuComponents/bottombar.tsx +++ b/src/components/TaskBar/MenuComponents/bottombar.tsx @@ -1,59 +1,50 @@ +import { useState } from 'react' -import Computer from "../assets/computer.png"; -import Tree from "./three.png"; -import Paper from "./book.png"; -import Setting from "./settings.png"; -import Shutdown from "./shutdown.png"; -import { useState} from "react"; - -import { StartMenuListItem } from "./startMenuListItem"; -import { useCopyText } from "./useCopyText"; -import { truncateEthAddress } from "./appUtils"; -// import { contractAddressLove } from "./constant"; +import Paper from './book.png' +import Setting from './settings.png' +import Shutdown from './shutdown.png' +import { StartMenuListItem } from './startMenuListItem' +import Tree from './three.png' interface Props { - setSelected: (selected: string) => void; + setSelected: (selected: string) => void } - const BottomBar = (props: Props) => { - const [showSide, setShowSide] = useState(false); + const [showSide, setShowSide] = useState(false) const list = [ { - menu: "farm", + menu: 'farm', icon: Tree, - name: "Farm", + name: 'Farm', }, { - menu: "paper", + menu: 'paper', icon: Paper, - name: "Paper", + name: 'Paper', }, { - menu: "heartbreak", - icon: "/assets/start-icon.png", - name: "MEMECOIN", + menu: 'heartbreak', + icon: '/assets/start-icon.png', + name: 'MEMECOIN', }, { - menu: "cp", + menu: 'cp', icon: Setting, - name: "Settings", + name: 'Settings', haveSub: true, }, { - menu: "shutdown", + menu: 'shutdown', icon: Shutdown, - name: "Shut Down", + name: 'Shut Down', }, - ]; - - + ] return (
- {list.map((item, index) => ( {
{ - props.setSelected("cp"); + props.setSelected('cp') }} className={`flex flex-row justify-between font-windows hover:text-white hover:bg-[#0A0080] cursor-pointer bg-gray-400 w-[187px] h-[39px] absolute bottom-[40px] right-0 border-r-2 border border-b-2 border-b-black border-r-black border-t-white border-l-white }`} >
- icon + icon
@@ -91,6 +82,7 @@ const BottomBar = (props: Props) => {
) : null}
- ); -}; -export default BottomBar; + ) +} + +export default BottomBar diff --git a/src/components/TaskBar/MenuComponents/constant.ts b/src/components/TaskBar/MenuComponents/constant.ts deleted file mode 100644 index 78a051d..0000000 --- a/src/components/TaskBar/MenuComponents/constant.ts +++ /dev/null @@ -1,49 +0,0 @@ -export const contractAddressLoveFarm: string = - process.env.NEXT_PUBLIC_CONTRACT_LOVE_FARM || ""; -export const contractAddressLoveClaim: string = - process.env.NEXT_PUBLIC_CONTRACT_LOVE_CLAIM || ""; -export const rpc_url: string = process.env.NEXT_PUBLIC_JSON_RPC_URL || ""; -export const contractAddressLove: string = - process.env.NEXT_PUBLIC_CONTRACT_LOVE || ""; -export const USDETHPoolAddy: string = - process.env.NEXT_PUBLIC_CONTRACT_USDETHPoolAddy || ""; -export const ETHLOVEPoolAddy: string = - process.env.NEXT_PUBLIC_CONTRACT_ETHLOVEPoolAddy || ""; -export const USDCAddress: string = - process.env.NEXT_PUBLIC_CONTRACT_USDCAddress || ""; -export const ETHLPAddy: string = - process.env.NEXT_PUBLIC_CONTRACT_LOVE_ETH_LP || ""; -export const BE_URL: string = process.env.NEXT_PUBLIC_API || ""; -export const MONGOO_URL: string = process.env.MONGOO_URL || ""; -export const ETHERSCAN_CLAIM_LINK = - "https://etherscan.io/address/0xB22C05CeDbF879a661fcc566B5a759d005Cf7b4C"; -export const ETHERSCAN_FARM_LINK = - "https://etherscan.io/address/0xFb063b1ae6471E6795d6ad1FC7f47c1cAb1f3422"; - -export const UNISWAP_LINK = `https://app.uniswap.org/#/add/v2/${contractAddressLove}/ETH`; -export const BIT_QUERY_LINK = - "https://explorer.bitquery.io/ethereum/token/0xb22c05cedbf879a661fcc566b5a759d005cf7b4c"; -export const DEXSCREENER_LINK = - "https://dexscreener.com/ethereum/0xDD97FCe8441dABf221B330269750B18bA82b0CD6"; -export const LOVE_ETH_LP_LINK = `https://app.uniswap.org/#/add/v2/ETH/${contractAddressLove}`; - -export const contractAddressFaith = - process.env.NEXT_PUBLIC_CONTRACT_FAITH || ""; -export const ETHERSCAN_FAITH_LINK = `https://etherscan.io/address/${contractAddressFaith}`; - -export const LOVE_POOLS = [ - { name: "LOVE-ETH", icon: "/assets/love_eth.svg" }, - { name: "LOVE-USDT", icon: "/assets/love_usdt.svg" }, -]; -export const BLOCKS_PER_YEAR = 2591500; -export const IS_DEV_ENV = process.env.NEXT_PUBLIC_NODE_ENV === "dev"; -export const CHAIN_ID = IS_DEV_ENV ? 5 : 1; -export const USDT_CONTRACT_ADDRESS = IS_DEV_ENV - ? "0xdAC17F958D2ee523a2206206994597C13D831ec7" - : "0xdAC17F958D2ee523a2206206994597C13D831ec7"; -export const HOT_JAR_SITE_ID = 3527265; -export const HOT_JAR_VERSION = 6; -export const TELEGRAM_LINK = ""; -export const TWITTER_LINK = ""; -export const HEARTBREAKER_SOCKET_URL = process.env.NEXT_PUBLIC_SOCKET_URL!; -export const HEARTBREAKER_CONTRACT_ADDRESS = process.env.NEXT_PUBLIC_HEARTBREAKER_CONTRACT_ADDRESS!; From af695c0459d8a35a6b06f47cb487144ea658ce3a Mon Sep 17 00:00:00 2001 From: tgoky Date: Sat, 10 Feb 2024 08:03:16 +0100 Subject: [PATCH 12/12] chore:init --- .../TaskBar/MenuComponents/appUtils.ts | 42 ------------------- .../TaskBar/MenuComponents/useCopyText.tsx | 25 ----------- 2 files changed, 67 deletions(-) delete mode 100644 src/components/TaskBar/MenuComponents/appUtils.ts delete mode 100644 src/components/TaskBar/MenuComponents/useCopyText.tsx diff --git a/src/components/TaskBar/MenuComponents/appUtils.ts b/src/components/TaskBar/MenuComponents/appUtils.ts deleted file mode 100644 index f874f26..0000000 --- a/src/components/TaskBar/MenuComponents/appUtils.ts +++ /dev/null @@ -1,42 +0,0 @@ - -const truncateRegex = /^(0x[a-zA-Z0-9]{4})[a-zA-Z0-9]+([a-zA-Z0-9]{4})$/; - -/** - * Truncates an ethereum address to the format 0x0000…0000 - * @param address Full address to truncate - * @returns Truncated address - */ -export const truncateEthAddress = (address: string) => { - const match = address.match(truncateRegex); - if (!match) return address; - return `${match[1]}…${match[2]}`; -}; - -export const thousandSeparator = (value: number) => { - let formattedValue = value?.toLocaleString("en-US", { - style: "decimal", - maximumFractionDigits: 3, - }); - - return formattedValue; - }; - - -export const saveTermsAgreement = ( - address: string -) => { - if (typeof window !== "undefined" && !!address) { - localStorage.setItem(`${address}-terms-agreement`, "true"); - } -}; - -export const getTermsAgreement = ( - address: string -) => { - const objectsString = localStorage.getItem(`${address}-terms-agreement`); - console.log("objectsString", objectsString); - if (objectsString) { - return JSON.parse(objectsString); - } - return "false"; -}; \ No newline at end of file diff --git a/src/components/TaskBar/MenuComponents/useCopyText.tsx b/src/components/TaskBar/MenuComponents/useCopyText.tsx deleted file mode 100644 index 556a631..0000000 --- a/src/components/TaskBar/MenuComponents/useCopyText.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { useState, useEffect } from "react"; - -export const useCopyText = () => { - const [copied, setCopied] = useState(false); - - useEffect(() => { - const interval = setInterval(() => { - setCopied(false); - }, 3000); - - return () => { - clearInterval(interval); - }; - }, [copied]); - - const handleCopy = (text: string) => { - navigator.clipboard.writeText(text); - setCopied(true); - }; - - return { - onCopyText: handleCopy, - copied - }; -};