diff --git a/src/typescript/frontend/src/app/loading/page.tsx b/src/typescript/frontend/src/app/loading/page.tsx
new file mode 100644
index 000000000..70189e4ce
--- /dev/null
+++ b/src/typescript/frontend/src/app/loading/page.tsx
@@ -0,0 +1,9 @@
+"use client";
+
+import React from "react";
+
+import LoadingComponent from "components/loading";
+
+export default function Loading() {
+ return ;
+}
diff --git a/src/typescript/frontend/src/components/emoji-picker/ColoredBytesIndicator.tsx b/src/typescript/frontend/src/components/emoji-picker/ColoredBytesIndicator.tsx
index ce96434f8..c0f95ae2b 100644
--- a/src/typescript/frontend/src/components/emoji-picker/ColoredBytesIndicator.tsx
+++ b/src/typescript/frontend/src/components/emoji-picker/ColoredBytesIndicator.tsx
@@ -1,7 +1,7 @@
import { sumBytes } from "@sdk/utils/sum-emoji-bytes";
import { useEmojiPicker } from "context/emoji-picker-context";
import { MAX_NUM_CHAT_EMOJIS, MAX_SYMBOL_LENGTH } from "components/pages/emoji-picker/const";
-import { AnimatedStatusIndicator } from "components/pages/launch-emojicoin/animated-status-indicator";
+import { AnimatedLoadingBoxes } from "components/pages/launch-emojicoin/animated-loading-boxes";
import { motion } from "framer-motion";
import { useEffect, useState } from "react";
@@ -52,7 +52,7 @@ export const MarketValidityIndicator = ({
Too many bytes
) : null
) : typeof registered === "undefined" ? (
-
+
) : registered ? (
Already Registered
) : (
diff --git a/src/typescript/frontend/src/components/loading.tsx b/src/typescript/frontend/src/components/loading.tsx
index 7112c916e..9de27272c 100644
--- a/src/typescript/frontend/src/components/loading.tsx
+++ b/src/typescript/frontend/src/components/loading.tsx
@@ -1,47 +1,70 @@
"use client";
+// cspell:word unpathify
-import React, { useEffect } from "react";
-import AnimatedStatusIndicator, {
- type StaggerSpeed,
-} from "./pages/launch-emojicoin/animated-status-indicator";
-import { getRandomSymbolEmoji, type SymbolEmojiData } from "@sdk/emoji_data";
+import React, { useEffect, useMemo } from "react";
+import AnimatedStatusIndicator from "./pages/launch-emojicoin/animated-emoji-circle";
+import { getRandomSymbolEmoji, SYMBOL_EMOJI_DATA, type SymbolEmojiData } from "@sdk/emoji_data";
+import { usePathname } from "next/navigation";
+import { EMOJI_PATH_INTRA_SEGMENT_DELIMITER, ONE_SPACE } from "utils/pathname-helpers";
+
+const unpathify = (pathEmojiName: string) =>
+ SYMBOL_EMOJI_DATA.byName(pathEmojiName.replaceAll(EMOJI_PATH_INTRA_SEGMENT_DELIMITER, ONE_SPACE));
export const Loading = ({
emojis,
- numSquares,
- animationSpeed,
+ numEmojis,
}: {
emojis?: SymbolEmojiData[];
- numSquares?: number;
- animationSpeed?: StaggerSpeed;
+ numEmojis?: number;
}) => {
- const emojiCycle = emojis ?? Array.from({ length: 20 }, getRandomSymbolEmoji);
- const [{ name, emoji }, setEmoji] = React.useState(emojiCycle[0]);
+ const pathname = usePathname();
+ // Use the emojis in the path if we're on the `market` page.
+ const emojisInPath = pathname
+ .split("/market/")
+ .at(1)
+ ?.split(";")
+ .map(unpathify)
+ .filter((e) => typeof e !== "undefined");
+
+ const emojiCycle = useMemo(() => {
+ if (emojisInPath?.length || emojis?.length) {
+ // Note the `emojis!` below is because TypeScript can't infer that it's defined, but it definitely is.
+ return emojisInPath?.length ? emojisInPath : emojis!;
+ }
+ return Array.from({ length: 20 }, getRandomSymbolEmoji);
+ }, [emojisInPath, emojis]);
+
+ const [emojiName, setEmojiName] = React.useState(emojiCycle[0].name);
+ const [emoji, setEmoji] = React.useState(emojiCycle[0].emoji);
useEffect(() => {
const interval = setInterval(() => {
emojiCycle.unshift(emojiCycle.pop()!);
- setEmoji(emojiCycle[0]);
- }, 3000);
+ setEmoji(emojiCycle[0].emoji);
+ setEmojiName(emojiCycle[0].name);
+ }, 420.69);
return () => clearInterval(interval);
/* eslint-disable-next-line react-hooks/exhaustive-deps */
}, []);
+ const centered = "absolute left-0 right-0 ms-auto me-auto w-fit";
+
return (
<>
>
diff --git a/src/typescript/frontend/src/components/pages/emojicoin/components/desktop-grid/index.tsx b/src/typescript/frontend/src/components/pages/emojicoin/components/desktop-grid/index.tsx
index 165931b90..28c7a3f80 100644
--- a/src/typescript/frontend/src/components/pages/emojicoin/components/desktop-grid/index.tsx
+++ b/src/typescript/frontend/src/components/pages/emojicoin/components/desktop-grid/index.tsx
@@ -33,7 +33,7 @@ const DesktopGrid = (props: GridProps) => {
className="bg-black z-10 border-t border-solid border-t-dark-gray"
>
- }>
+ }>
{
+ const emojis = useMemo(() => Array.from({ length: numEmojis }), [numEmojis]).map(() =>
+ getRandomSymbolEmoji()
+ );
+ const degrees = 360 / numEmojis;
+
+ return (
+
+ {emojis.map((emoji, i) => (
+
+
+ {emoji.emoji}
+
+
+
+
+
+ ))}
+
+ );
+};
+
+export default React.memo(AnimatedStatusIndicator);
diff --git a/src/typescript/frontend/src/components/pages/launch-emojicoin/animated-status-indicator/index.tsx b/src/typescript/frontend/src/components/pages/launch-emojicoin/animated-loading-boxes/index.tsx
similarity index 96%
rename from src/typescript/frontend/src/components/pages/launch-emojicoin/animated-status-indicator/index.tsx
rename to src/typescript/frontend/src/components/pages/launch-emojicoin/animated-loading-boxes/index.tsx
index 54a3b904e..4d848fbbd 100644
--- a/src/typescript/frontend/src/components/pages/launch-emojicoin/animated-status-indicator/index.tsx
+++ b/src/typescript/frontend/src/components/pages/launch-emojicoin/animated-loading-boxes/index.tsx
@@ -52,7 +52,7 @@ const useStaggerAnimation = ({
return scope;
};
-export const AnimatedStatusIndicator = ({
+export const AnimatedLoadingBoxes = ({
numSquares = 14,
delay,
speed,
@@ -100,4 +100,4 @@ export const AnimatedStatusIndicator = ({
);
};
-export default React.memo(AnimatedStatusIndicator);
+export default React.memo(AnimatedLoadingBoxes);
diff --git a/src/typescript/frontend/src/components/pages/launch-emojicoin/memoized-launch/index.tsx b/src/typescript/frontend/src/components/pages/launch-emojicoin/memoized-launch/index.tsx
index 32bc5a4a2..6ebe222bc 100644
--- a/src/typescript/frontend/src/components/pages/launch-emojicoin/memoized-launch/index.tsx
+++ b/src/typescript/frontend/src/components/pages/launch-emojicoin/memoized-launch/index.tsx
@@ -3,7 +3,6 @@ import { MarketValidityIndicator } from "components/emoji-picker/ColoredBytesInd
import EmojiPickerWithInput from "components/emoji-picker/EmojiPickerWithInput";
import { AnimatePresence, motion } from "framer-motion";
import React, { useEffect, useMemo } from "react";
-import AnimatedStatusIndicator from "../animated-status-indicator";
import { useEmojiPicker } from "context/emoji-picker-context";
import { translationFunction } from "context/language-context";
import { useRegisterMarket } from "../hooks/use-register-market";
@@ -15,6 +14,7 @@ import { toCoinDecimalString } from "lib/utils/decimals";
import { MARKET_REGISTRATION_DEPOSIT, ONE_APT_BIGINT } from "@sdk/const";
import Info from "components/info";
import { filterBigEmojis } from "components/pages/emoji-picker/EmojiPicker";
+import { useScramble } from "use-scramble";
const labelClassName = "whitespace-nowrap body-sm md:body-lg text-light-gray uppercase font-forma";
@@ -68,6 +68,15 @@ export const MemoizedLaunchAnimation = ({
}
};
+ const { ref } = useScramble({
+ text: "Building your emojicoin...",
+ overdrive: false,
+ overflow: true,
+ playOnMount: true,
+ scramble: 10,
+ tick: 9,
+ });
+
return (
{/* Input */}
@@ -198,10 +207,9 @@ export const MemoizedLaunchAnimation = ({
animate={{ opacity: 1 }}
className="absolute flex flex-col justify-center items-center w-full h-full gap-6"
>
- Building your emojicoin...
-
+
+ Building your emojicoin...
+
)}
diff --git a/src/typescript/frontend/src/components/pages/pools/components/liquidity/index.tsx b/src/typescript/frontend/src/components/pages/pools/components/liquidity/index.tsx
index 84ef50b4b..24f7d4650 100644
--- a/src/typescript/frontend/src/components/pages/pools/components/liquidity/index.tsx
+++ b/src/typescript/frontend/src/components/pages/pools/components/liquidity/index.tsx
@@ -23,7 +23,7 @@ import {
import { Arrows } from "components/svg";
import type { EntryFunctionTransactionBuilder } from "@sdk/emojicoin_dot_fun/payload-builders";
import { useSearchParams } from "next/navigation";
-import AnimatedStatusIndicator from "components/pages/launch-emojicoin/animated-status-indicator";
+import AnimatedStatusIndicator from "components/pages/launch-emojicoin/animated-emoji-circle";
import { TypeTag } from "@aptos-labs/ts-sdk";
import Info from "components/info";
import { type AnyNumberString } from "@sdk/types/types";
@@ -98,7 +98,7 @@ const Liquidity: React.FC = ({ market, geoblocked }) => {
searchParams.get("remove") !== null ? "remove" : "add"
);
- const loadingComponent = useMemo(() => , []);
+ const loadingComponent = useMemo(() => , []);
const {
aptos,