From 5b91f3381c1611d638e7d7e4ede5e2fefcfac84c Mon Sep 17 00:00:00 2001 From: Colin Spence Date: Thu, 22 Feb 2024 11:28:17 -0700 Subject: [PATCH] Adds new socials; updates logo sparkles; adds a 6th prompt suggestion for better layout --- web/app/Header.tsx | 126 ++++++++++++++++++++++++------------ web/app/favicon.ico | Bin 9257 -> 8312 bytes web/app/page.tsx | 14 ++-- web/components/Icons.tsx | 91 +++++++++++--------------- web/components/Logo.tsx | 54 +++++++++------- web/components/Prompt.tsx | 44 ++++++------- web/components/Strategy.tsx | 73 +++++++++++++++------ 7 files changed, 230 insertions(+), 172 deletions(-) diff --git a/web/app/Header.tsx b/web/app/Header.tsx index 4a22966e..ddc22013 100644 --- a/web/app/Header.tsx +++ b/web/app/Header.tsx @@ -1,8 +1,9 @@ "use client"; +import { SubstackLogo, XLogo } from "@/components/Icons"; import { Logo } from "@/components/Logo"; import truncateEthAddress from "@/utils/ethereum/truncateAddress"; -import { CaretDown, Link } from "@phosphor-icons/react"; +import { CaretDown, DiscordLogo, Link } from "@phosphor-icons/react"; import { useConnectWallet } from "@web3-onboard/react"; import Image from "next/image"; import { useEffect, useRef, useState } from "react"; @@ -11,6 +12,19 @@ function Header() { const [{ wallet }, _, disconnect] = useConnectWallet(); const [showDropdownMenu, setShowDropdownMenu] = useState(false); const dropdownRef = useRef(null); + const [isMobile, setIsMobile] = useState(true); + + useEffect(() => { + const checkScreenSize = () => { + setIsMobile(window.innerWidth < 1024); + }; + + checkScreenSize(); + + window.addEventListener("resize", checkScreenSize); + + return () => window.removeEventListener("resize", checkScreenSize); + }, []); useEffect(() => { function handleClickOutside(event: MouseEvent) { @@ -34,51 +48,79 @@ function Header() { return (
- + - {wallet && ( -
-
setShowDropdownMenu((current) => !current)} - className='text-indigo-600 hover:text-indigo-800 font-bold text-sm cursor-pointer flex space-x-1 items-center p-1 rounded-md hover:bg-indigo-500/20'> -
- {wallet.accounts[0]?.ens?.name ? ( -
- {wallet.accounts[0]?.ens?.avatar && ( - {wallet.accounts[0]?.ens?.name} - )} -
{wallet.accounts[0]?.ens?.name}
-
- ) : ( -
{truncateEthAddress(wallet.accounts[0].address)}
- )} +
+ + {wallet && ( +
+
setShowDropdownMenu((current) => !current)} + className='text-indigo-600 hover:text-indigo-800 font-bold text-sm cursor-pointer flex space-x-1 items-center p-1 rounded-md hover:bg-indigo-500/20'> +
+ {wallet.accounts[0]?.ens?.name ? ( +
+ {wallet.accounts[0]?.ens?.avatar && ( + {wallet.accounts[0]?.ens?.name} + )} +
{wallet.accounts[0]?.ens?.name}
+
+ ) : ( +
{truncateEthAddress(wallet.accounts[0].address)}
+ )} +
+
- -
- {showDropdownMenu ?
-
-
{ - disconnect(wallet); - setShowDropdownMenu(!showDropdownMenu) - }} - > - -
- Disconnect Wallet + {showDropdownMenu ? ( +
+
+
{ + disconnect(wallet); + setShowDropdownMenu(!showDropdownMenu); + }}> + +
Disconnect Wallet
+
-
-
: null} -
- )} + ) : null} +
+ )} +
); } diff --git a/web/app/favicon.ico b/web/app/favicon.ico index 317b42485e3eac5cc53e062adb1a559b5523bec9..8aaec8c99f8f81c662d62fff9822cecc1d99e968 100644 GIT binary patch literal 8312 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

idt&W(kxHI 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 PQ2;Q|HPNZi#)SS4j1gK= literal 9257 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 R2vTJaFw`^Et diff --git a/web/app/page.tsx b/web/app/page.tsx index f6ce936b..c2234701 100644 --- a/web/app/page.tsx +++ b/web/app/page.tsx @@ -2,28 +2,30 @@ import React from "react"; import Prompt from "@/components/Prompt"; import { EXAMPLE_PROMPTS } from "@/utils/examplePrompts"; -export const dynamic = 'force-dynamic' +export const dynamic = "force-dynamic"; function generateUniqueIndexes(arrayLength: number, count: number): number[] { if (arrayLength < count) { - throw new Error('Array does not have enough elements to generate unique indexes.'); + throw new Error( + "Array does not have enough elements to generate unique indexes." + ); } const uniqueIndexes = new Set(); while (uniqueIndexes.size < count) { - const randomIndex = Math.floor(Math.random() * arrayLength); - uniqueIndexes.add(randomIndex); + const randomIndex = Math.floor(Math.random() * arrayLength); + uniqueIndexes.add(randomIndex); } return Array.from(uniqueIndexes); } export default function HomePage() { - const promptIdxs = generateUniqueIndexes(EXAMPLE_PROMPTS.length, 5) + const promptIdxs = generateUniqueIndexes(EXAMPLE_PROMPTS.length, 6); return ( -

+
); diff --git a/web/components/Icons.tsx b/web/components/Icons.tsx index 62eb019a..833814e6 100644 --- a/web/components/Icons.tsx +++ b/web/components/Icons.tsx @@ -11,67 +11,25 @@ export const SparkleIcon = ({ size = 32, className }: IconProps) => { - - - - - - - - - - - - - - - - + + ); }; @@ -93,6 +51,31 @@ export const XLogo = ({ size = 16, className }: IconProps) => { ); }; +export const SubstackLogo = ({ size = 16, className }: IconProps) => { + return ( + + + + + + ); +}; + export interface ScoreIconProps extends IconProps { rank: number; } diff --git a/web/components/Logo.tsx b/web/components/Logo.tsx index c8a36d02..3fd12250 100644 --- a/web/components/Logo.tsx +++ b/web/components/Logo.tsx @@ -3,33 +3,41 @@ import { SparkleIcon } from "./Icons"; export interface LogoProps { size?: number; + logomarkSize?: number; className?: string; + wordmark?: boolean; } -export const Logo = ({ size = 179, className }: LogoProps) => { +export const Logo = ({ + size = 179, + wordmark = true, + className, +}: LogoProps) => { return ( -
- - - - - - +
+ + {wordmark && ( + + + + + + )}
); }; diff --git a/web/components/Prompt.tsx b/web/components/Prompt.tsx index 7b846070..61ea4f3a 100644 --- a/web/components/Prompt.tsx +++ b/web/components/Prompt.tsx @@ -10,12 +10,11 @@ import clsx from "clsx"; import { EXAMPLE_PROMPTS } from "@/utils/examplePrompts"; import { toast } from "react-toastify"; - export default function Prompt({ promptIdxs }: { promptIdxs: number[] }) { const [prompt, setPrompt] = useState(""); const [isWaiting, setIsWaiting] = useState(false); const { data: session } = useSession(); - const searchParams = useSearchParams() + const searchParams = useSearchParams(); const router = useRouter(); @@ -34,33 +33,29 @@ export default function Prompt({ promptIdxs }: { promptIdxs: number[] }) { }; useEffect(() => { - const notFoundId = searchParams.get("not-found") + const notFoundId = searchParams.get("not-found"); if (notFoundId) { toast.error(`Run with id ${notFoundId} does not exist`, { autoClose: 5000, - }) - router.replace("/") + }); + router.replace("/"); } - }, [searchParams, router]) + }, [searchParams, router]); return ( <> -
-
-
+
+
+

+ )}> Fund public goods like magic - +

-
+
-
-
- Some ideas: -
-
+
+
Some ideas:
+
{promptIdxs.map((index) => { const prompt = EXAMPLE_PROMPTS[index]; return (
- ) + ); })}
diff --git a/web/components/Strategy.tsx b/web/components/Strategy.tsx index 981b303d..684046c7 100644 --- a/web/components/Strategy.tsx +++ b/web/components/Strategy.tsx @@ -8,7 +8,11 @@ import { useConnectWallet, useSetChain } from "@web3-onboard/react"; import Dropdown from "./Dropdown"; import { ArrowRight } from "@phosphor-icons/react/dist/ssr"; import { useRouter, useSearchParams } from "next/navigation"; -import { NetworkName, SUPPORTED_NETWORKS, getNetworkNameFromChainId } from "@/utils/ethereum"; +import { + NetworkName, + SUPPORTED_NETWORKS, + getNetworkNameFromChainId, +} from "@/utils/ethereum"; import useSession from "@/hooks/useSession"; import { startRun } from "@/app/actions"; import { @@ -25,6 +29,7 @@ import Image from "next/image"; import { pluralize } from "@/utils/pluralize"; import { findMostRepeatedString } from "@/utils/findMostRepeatedString"; import { useTweetShare } from "@/hooks/useTweetShare"; +import clsx from "clsx"; export default function Strategy(props: { fetchedStrategies: StrategiesWithProjects; @@ -37,22 +42,31 @@ export default function Strategy(props: { const [balance, setBalance] = useState(); const [isRegenerating, setIsRegenerating] = useState(false); const [showSuccessModal, setShowSuccessModal] = useState(false); - const searchParams = useSearchParams() + const searchParams = useSearchParams(); const overwrites = { - weights: searchParams.get("weights") ? searchParams.get("weights")?.split(",") : null, - projects: searchParams.get("projects") ? searchParams.get("projects")?.split(",") : null - } - - let networkName = findMostRepeatedString(props.fetchedStrategies.map(x => x.networks).flat()) as NetworkName + weights: searchParams.get("weights") + ? searchParams.get("weights")?.split(",") + : null, + projects: searchParams.get("projects") + ? searchParams.get("projects")?.split(",") + : null, + }; + + let networkName = findMostRepeatedString( + props.fetchedStrategies.map((x) => x.networks).flat() + ) as NetworkName; if (searchParams.get("network")) { try { - networkName = getNetworkNameFromChainId(Number(searchParams.get("network"))) + networkName = getNetworkNameFromChainId( + Number(searchParams.get("network")) + ); } catch (e) { // don't do anything, since the user might pass an unsupported network id through URL } } - const [selectedNetwork, setSelectedNetwork] = useState(networkName); + const [selectedNetwork, setSelectedNetwork] = + useState(networkName); const { execute: executeDonation, getBalance, @@ -77,12 +91,18 @@ export default function Strategy(props: { updateToken: updateToken, selectedToken, } = useToken(selectedNetwork); - - const { strategies, handleAmountUpdate, handleNetworkUpdate } = strategiesHandler; + + const { strategies, handleAmountUpdate, handleNetworkUpdate } = + strategiesHandler; const selectedStrategiesLength = strategies.filter((x) => x.selected).length; - const tweetUrl = useTweetShare(props.runId, strategies, selectedNetwork, props.prompt) + const tweetUrl = useTweetShare( + props.runId, + strategies, + selectedNetwork, + props.prompt + ); const [isFundingPending, setIsFundingPending] = useState(false); - + useEffect(() => { setBalance((currentBalance) => { if (currentBalance) return null; @@ -109,8 +129,7 @@ export default function Strategy(props: { if (!selectedToken || !wallet) { setIsFundingPending(false); return; - }; - + } const balance = await getBalance(wallet, selectedToken); @@ -137,7 +156,7 @@ export default function Strategy(props: { recipient: strategy.recipients[networkIndex], }; }); - + const amounts = donations .map((x) => Number(x.amount)) .filter((x) => x > 0); @@ -213,8 +232,13 @@ export default function Strategy(props: {
Filter by:
n !== selectedNetwork).map(n => ({ value: n, image: `/chains/${n}.png` }))} - field={{ value: selectedNetwork, image: `/chains/${selectedNetwork}.png` }} + items={props.networks + .filter((n) => n !== selectedNetwork) + .map((n) => ({ value: n, image: `/chains/${n}.png` }))} + field={{ + value: selectedNetwork, + image: `/chains/${selectedNetwork}.png`, + }} onChange={(newValue) => { if (props.networks.length === 1) { return; @@ -227,7 +251,11 @@ export default function Strategy(props: {
-
+
{wallet ? ( <>
@@ -243,7 +271,7 @@ export default function Strategy(props: { x.name !== selectedToken.name) - .map((x) => ({ value : x.name }))} + .map((x) => ({ value: x.name }))} field={{ value: selectedToken.name }} onChange={async (newToken) => await updateToken(newToken) @@ -275,7 +303,10 @@ export default function Strategy(props: {