Skip to content

Commit e6fe619

Browse files
committed
[MNY-223] Update Bridge Page
1 parent c2e5f65 commit e6fe619

File tree

13 files changed

+394
-47
lines changed

13 files changed

+394
-47
lines changed

apps/dashboard/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
"next-themes": "^0.4.6",
4848
"nextjs-toploader": "^1.6.12",
4949
"nuqs": "^2.4.3",
50+
"ogl": "^1.0.11",
5051
"papaparse": "^5.5.3",
5152
"pluralize": "^8.0.0",
5253
"posthog-js": "1.256.1",
Lines changed: 192 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,192 @@
1+
"use client";
2+
/* eslint-disable no-restricted-syntax */
3+
import { Mesh, Program, Renderer, Triangle, Vec2 } from "ogl";
4+
import { useEffect, useRef } from "react";
5+
6+
const vertex = `
7+
attribute vec2 position;
8+
void main(){gl_Position=vec4(position,0.0,1.0);}
9+
`;
10+
11+
const fragment = `
12+
#ifdef GL_ES
13+
precision lowp float;
14+
#endif
15+
uniform vec2 uResolution;
16+
uniform float uTime;
17+
uniform float uHueShift;
18+
uniform float uNoise;
19+
uniform float uScan;
20+
uniform float uScanFreq;
21+
uniform float uWarp;
22+
uniform vec3 uBackgroundColor;
23+
uniform float uBackgroundOpacity;
24+
uniform float uPatternLightness;
25+
#define iTime uTime
26+
#define iResolution uResolution
27+
28+
vec4 buf[8];
29+
float rand(vec2 c){return fract(sin(dot(c,vec2(12.9898,78.233)))*43758.5453);}
30+
31+
mat3 rgb2yiq=mat3(0.299,0.587,0.114,0.596,-0.274,-0.322,0.211,-0.523,0.312);
32+
mat3 yiq2rgb=mat3(1.0,0.956,0.621,1.0,-0.272,-0.647,1.0,-1.106,1.703);
33+
34+
vec3 hueShiftRGB(vec3 col,float deg){
35+
vec3 yiq=rgb2yiq*col;
36+
float rad=radians(deg);
37+
float cosh=cos(rad),sinh=sin(rad);
38+
vec3 yiqShift=vec3(yiq.x,yiq.y*cosh-yiq.z*sinh,yiq.y*sinh+yiq.z*cosh);
39+
return clamp(yiq2rgb*yiqShift,0.0,1.0);
40+
}
41+
42+
vec4 sigmoid(vec4 x){return 1./(1.+exp(-x));}
43+
44+
vec4 cppn_fn(vec2 coordinate,float in0,float in1,float in2){
45+
buf[6]=vec4(coordinate.x,coordinate.y,0.3948333106474662+in0,0.36+in1);
46+
buf[7]=vec4(0.14+in2,sqrt(coordinate.x*coordinate.x+coordinate.y*coordinate.y),0.,0.);
47+
buf[0]=mat4(vec4(6.5404263,-3.6126034,0.7590882,-1.13613),vec4(2.4582713,3.1660357,1.2219609,0.06276096),vec4(-5.478085,-6.159632,1.8701609,-4.7742867),vec4(6.039214,-5.542865,-0.90925294,3.251348))*buf[6]+mat4(vec4(0.8473259,-5.722911,3.975766,1.6522468),vec4(-0.24321538,0.5839259,-1.7661959,-5.350116),vec4(0.,0.,0.,0.),vec4(0.,0.,0.,0.))*buf[7]+vec4(0.21808943,1.1243913,-1.7969975,5.0294676);
48+
buf[1]=mat4(vec4(-3.3522482,-6.0612736,0.55641043,-4.4719114),vec4(0.8631464,1.7432913,5.643898,1.6106541),vec4(2.4941394,-3.5012043,1.7184316,6.357333),vec4(3.310376,8.209261,1.1355612,-1.165539))*buf[6]+mat4(vec4(5.24046,-13.034365,0.009859298,15.870829),vec4(2.987511,3.129433,-0.89023495,-1.6822904),vec4(0.,0.,0.,0.),vec4(0.,0.,0.,0.))*buf[7]+vec4(-5.9457836,-6.573602,-0.8812491,1.5436668);
49+
buf[0]=sigmoid(buf[0]);buf[1]=sigmoid(buf[1]);
50+
buf[2]=mat4(vec4(-15.219568,8.095543,-2.429353,-1.9381982),vec4(-5.951362,4.3115187,2.6393783,1.274315),vec4(-7.3145227,6.7297835,5.2473326,5.9411426),vec4(5.0796127,8.979051,-1.7278991,-1.158976))*buf[6]+mat4(vec4(-11.967154,-11.608155,6.1486754,11.237008),vec4(2.124141,-6.263192,-1.7050359,-0.7021966),vec4(0.,0.,0.,0.),vec4(0.,0.,0.,0.))*buf[7]+vec4(-4.17164,-3.2281182,-4.576417,-3.6401186);
51+
buf[3]=mat4(vec4(3.1832156,-13.738922,1.879223,3.233465),vec4(0.64300746,12.768129,1.9141049,0.50990224),vec4(-0.049295485,4.4807224,1.4733979,1.801449),vec4(5.0039253,13.000481,3.3991797,-4.5561905))*buf[6]+mat4(vec4(-0.1285731,7.720628,-3.1425676,4.742367),vec4(0.6393625,3.714393,-0.8108378,-0.39174938),vec4(0.,0.,0.,0.),vec4(0.,0.,0.,0.))*buf[7]+vec4(-1.1811101,-21.621881,0.7851888,1.2329718);
52+
buf[2]=sigmoid(buf[2]);buf[3]=sigmoid(buf[3]);
53+
buf[4]=mat4(vec4(5.214916,-7.183024,2.7228765,2.6592617),vec4(-5.601878,-25.3591,4.067988,0.4602802),vec4(-10.57759,24.286327,21.102104,37.546658),vec4(4.3024497,-1.9625226,2.3458803,-1.372816))*buf[0]+mat4(vec4(-17.6526,-10.507558,2.2587414,12.462782),vec4(6.265566,-502.75443,-12.642513,0.9112289),vec4(-10.983244,20.741234,-9.701768,-0.7635988),vec4(5.383626,1.4819539,-4.1911616,-4.8444734))*buf[1]+mat4(vec4(12.785233,-16.345072,-0.39901125,1.7955981),vec4(-30.48365,-1.8345358,1.4542528,-1.1118771),vec4(19.872723,-7.337935,-42.941723,-98.52709),vec4(8.337645,-2.7312303,-2.2927687,-36.142323))*buf[2]+mat4(vec4(-16.298317,3.5471997,-0.44300047,-9.444417),vec4(57.5077,-35.609753,16.163465,-4.1534753),vec4(-0.07470326,-3.8656476,-7.0901804,3.1523974),vec4(-12.559385,-7.077619,1.490437,-0.8211543))*buf[3]+vec4(-7.67914,15.927437,1.3207729,-1.6686112);
54+
buf[5]=mat4(vec4(-1.4109162,-0.372762,-3.770383,-21.367174),vec4(-6.2103205,-9.35908,0.92529047,8.82561),vec4(11.460242,-22.348068,13.625772,-18.693201),vec4(-0.3429052,-3.9905605,-2.4626114,-0.45033523))*buf[0]+mat4(vec4(7.3481627,-4.3661838,-6.3037653,-3.868115),vec4(1.5462853,6.5488915,1.9701879,-0.58291394),vec4(6.5858274,-2.2180402,3.7127688,-1.3730392),vec4(-5.7973905,10.134961,-2.3395722,-5.965605))*buf[1]+mat4(vec4(-2.5132585,-6.6685553,-1.4029363,-0.16285264),vec4(-0.37908727,0.53738135,4.389061,-1.3024765),vec4(-0.70647055,2.0111287,-5.1659346,-3.728635),vec4(-13.562562,10.487719,-0.9173751,-2.6487076))*buf[2]+mat4(vec4(-8.645013,6.5546675,-6.3944063,-5.5933375),vec4(-0.57783127,-1.077275,36.91025,5.736769),vec4(14.283112,3.7146652,7.1452246,-4.5958776),vec4(2.7192075,3.6021907,-4.366337,-2.3653464))*buf[3]+vec4(-5.9000807,-4.329569,1.2427121,8.59503);
55+
buf[4]=sigmoid(buf[4]);buf[5]=sigmoid(buf[5]);
56+
buf[6]=mat4(vec4(-1.61102,0.7970257,1.4675229,0.20917463),vec4(-28.793737,-7.1390953,1.5025433,4.656581),vec4(-10.94861,39.66238,0.74318546,-10.095605),vec4(-0.7229728,-1.5483948,0.7301322,2.1687684))*buf[0]+mat4(vec4(3.2547753,21.489103,-1.0194173,-3.3100595),vec4(-3.7316632,-3.3792162,-7.223193,-0.23685838),vec4(13.1804495,0.7916005,5.338587,5.687114),vec4(-4.167605,-17.798311,-6.815736,-1.6451967))*buf[1]+mat4(vec4(0.604885,-7.800309,-7.213122,-2.741014),vec4(-3.522382,-0.12359311,-0.5258442,0.43852118),vec4(9.6752825,-22.853785,2.062431,0.099892326),vec4(-4.3196306,-17.730087,2.5184598,5.30267))*buf[2]+mat4(vec4(-6.545563,-15.790176,-6.0438633,-5.415399),vec4(-43.591583,28.551912,-16.00161,18.84728),vec4(4.212382,8.394307,3.0958717,8.657522),vec4(-5.0237565,-4.450633,-4.4768,-5.5010443))*buf[3]+mat4(vec4(1.6985557,-67.05806,6.897715,1.9004834),vec4(1.8680354,2.3915145,2.5231109,4.081538),vec4(11.158006,1.7294737,2.0738268,7.386411),vec4(-4.256034,-306.24686,8.258898,-17.132736))*buf[4]+mat4(vec4(1.6889864,-4.5852966,3.8534803,-6.3482175),vec4(1.3543309,-1.2640043,9.932754,2.9079645),vec4(-5.2770967,0.07150358,-0.13962056,3.3269649),vec4(28.34703,-4.918278,6.1044083,4.085355))*buf[5]+vec4(6.6818056,12.522166,-3.7075126,-4.104386);
57+
buf[7]=mat4(vec4(-8.265602,-4.7027016,5.098234,0.7509808),vec4(8.6507845,-17.15949,16.51939,-8.884479),vec4(-4.036479,-2.3946867,-2.6055532,-1.9866527),vec4(-2.2167742,-1.8135649,-5.9759874,4.8846445))*buf[0]+mat4(vec4(6.7790847,3.5076547,-2.8191125,-2.7028968),vec4(-5.743024,-0.27844876,1.4958696,-5.0517144),vec4(13.122226,15.735168,-2.9397483,-4.101023),vec4(-14.375265,-5.030483,-6.2599335,2.9848232))*buf[1]+mat4(vec4(4.0950394,-0.94011575,-5.674733,4.755022),vec4(4.3809423,4.8310084,1.7425908,-3.437416),vec4(2.117492,0.16342592,-104.56341,16.949184),vec4(-5.22543,-2.994248,3.8350096,-1.9364246))*buf[2]+mat4(vec4(-5.900337,1.7946124,-13.604192,-3.8060522),vec4(6.6583457,31.911177,25.164474,91.81147),vec4(11.840538,4.1503043,-0.7314397,6.768467),vec4(-6.3967767,4.034772,6.1714606,-0.32874924))*buf[3]+mat4(vec4(3.4992442,-196.91893,-8.923708,2.8142626),vec4(3.4806502,-3.1846354,5.1725626,5.1804223),vec4(-2.4009497,15.585794,1.2863957,2.0252278),vec4(-71.25271,-62.441242,-8.138444,0.50670296))*buf[4]+mat4(vec4(-12.291733,-11.176166,-7.3474145,4.390294),vec4(10.805477,5.6337385,-0.9385842,-4.7348723),vec4(-12.869276,-7.039391,5.3029537,7.5436664),vec4(1.4593618,8.91898,3.5101583,5.840625))*buf[5]+vec4(2.2415268,-6.705987,-0.98861027,-2.117676);
58+
buf[6]=sigmoid(buf[6]);buf[7]=sigmoid(buf[7]);
59+
buf[0]=mat4(vec4(1.6794263,1.3817469,2.9625452,0.),vec4(-1.8834411,-1.4806935,-3.5924516,0.),vec4(-1.3279216,-1.0918057,-2.3124623,0.),vec4(0.2662234,0.23235129,0.44178495,0.))*buf[0]+mat4(vec4(-0.6299101,-0.5945583,-0.9125601,0.),vec4(0.17828953,0.18300213,0.18182953,0.),vec4(-2.96544,-2.5819945,-4.9001055,0.),vec4(1.4195864,1.1868085,2.5176322,0.))*buf[1]+mat4(vec4(-1.2584374,-1.0552157,-2.1688404,0.),vec4(-0.7200217,-0.52666044,-1.438251,0.),vec4(0.15345335,0.15196142,0.272854,0.),vec4(0.945728,0.8861938,1.2766753,0.))*buf[2]+mat4(vec4(-2.4218085,-1.968602,-4.35166,0.),vec4(-22.683098,-18.0544,-41.954372,0.),vec4(0.63792,0.5470648,1.1078634,0.),vec4(-1.5489894,-1.3075932,-2.6444845,0.))*buf[3]+mat4(vec4(-0.49252132,-0.39877754,-0.91366625,0.),vec4(0.95609266,0.7923952,1.640221,0.),vec4(0.30616966,0.15693925,0.8639857,0.),vec4(1.1825981,0.94504964,2.176963,0.))*buf[4]+mat4(vec4(0.35446745,0.3293795,0.59547555,0.),vec4(-0.58784515,-0.48177817,-1.0614829,0.),vec4(2.5271258,1.9991658,4.6846647,0.),vec4(0.13042648,0.08864098,0.30187556,0.))*buf[5]+mat4(vec4(-1.7718065,-1.4033192,-3.3355875,0.),vec4(3.1664357,2.638297,5.378702,0.),vec4(-3.1724713,-2.6107926,-5.549295,0.),vec4(-2.851368,-2.249092,-5.3013067,0.))*buf[6]+mat4(vec4(1.5203838,1.2212278,2.8404984,0.),vec4(1.5210563,1.2651345,2.683903,0.),vec4(2.9789467,2.4364579,5.2347264,0.),vec4(2.2270417,1.8825914,3.8028636,0.))*buf[7]+vec4(-1.5468478,-3.6171484,0.24762098,0.);
60+
buf[0]=sigmoid(buf[0]);
61+
return vec4(buf[0].x,buf[0].y,buf[0].z,1.);
62+
}
63+
64+
void mainImage(out vec4 fragColor,in vec2 fragCoord){
65+
vec2 uv=fragCoord/uResolution.xy*2.-1.;
66+
uv.y*=-1.;
67+
uv+=uWarp*vec2(sin(uv.y*6.283+uTime*0.5),cos(uv.x*6.283+uTime*0.5))*0.05;
68+
fragColor=cppn_fn(uv,0.1*sin(0.3*uTime),0.1*sin(0.69*uTime),0.1*sin(0.44*uTime));
69+
}
70+
71+
void main(){
72+
vec4 col;mainImage(col,gl_FragCoord.xy);
73+
col.rgb=hueShiftRGB(col.rgb,uHueShift);
74+
float scanline_val=sin(gl_FragCoord.y*uScanFreq)*0.5+0.5;
75+
col.rgb*=1.-(scanline_val*scanline_val)*uScan;
76+
col.rgb+=(rand(gl_FragCoord.xy+uTime)-0.5)*uNoise;
77+
78+
// Apply lightness control to pattern
79+
col.rgb = col.rgb * uPatternLightness;
80+
81+
// Use background color as base, then add pattern on top
82+
vec3 finalColor = uBackgroundColor + col.rgb * uBackgroundOpacity;
83+
84+
gl_FragColor=vec4(clamp(finalColor,0.0,1.0),1.0);
85+
}
86+
`;
87+
88+
type Props = {
89+
hueShift?: number;
90+
noiseIntensity?: number;
91+
scanlineIntensity?: number;
92+
speed?: number;
93+
scanlineFrequency?: number;
94+
warpAmount?: number;
95+
resolutionScale?: number;
96+
backgroundColor?: [number, number, number];
97+
backgroundOpacity?: number;
98+
patternLightness?: number;
99+
};
100+
101+
export function DarkVeil({
102+
hueShift = 0,
103+
noiseIntensity = 0,
104+
scanlineIntensity = 0,
105+
speed = 0.5,
106+
scanlineFrequency = 0,
107+
warpAmount = 0,
108+
resolutionScale = 1,
109+
backgroundColor = [0, 0, 0],
110+
backgroundOpacity = 1,
111+
patternLightness = 1.0,
112+
}: Props) {
113+
const ref = useRef<HTMLCanvasElement>(null);
114+
useEffect(() => {
115+
const canvas = ref.current as HTMLCanvasElement;
116+
const parent = canvas.parentElement as HTMLElement;
117+
118+
const renderer = new Renderer({
119+
dpr: Math.min(window.devicePixelRatio, 2),
120+
canvas,
121+
});
122+
123+
const gl = renderer.gl;
124+
const geometry = new Triangle(gl);
125+
126+
const program = new Program(gl, {
127+
vertex,
128+
fragment,
129+
uniforms: {
130+
uTime: { value: 0 },
131+
uResolution: { value: new Vec2() },
132+
uHueShift: { value: hueShift },
133+
uNoise: { value: noiseIntensity },
134+
uScan: { value: scanlineIntensity },
135+
uScanFreq: { value: scanlineFrequency },
136+
uWarp: { value: warpAmount },
137+
uBackgroundColor: { value: backgroundColor },
138+
uBackgroundOpacity: { value: backgroundOpacity },
139+
uPatternLightness: { value: patternLightness },
140+
},
141+
});
142+
143+
const mesh = new Mesh(gl, { geometry, program });
144+
145+
const resize = () => {
146+
const w = parent.clientWidth,
147+
h = parent.clientHeight;
148+
renderer.setSize(w * resolutionScale, h * resolutionScale);
149+
program.uniforms.uResolution.value.set(w, h);
150+
};
151+
152+
window.addEventListener("resize", resize);
153+
resize();
154+
155+
const start = performance.now();
156+
let frame = 0;
157+
158+
const loop = () => {
159+
program.uniforms.uTime.value =
160+
((performance.now() - start) / 1000) * speed;
161+
program.uniforms.uHueShift.value = hueShift;
162+
program.uniforms.uNoise.value = noiseIntensity;
163+
program.uniforms.uScan.value = scanlineIntensity;
164+
program.uniforms.uScanFreq.value = scanlineFrequency;
165+
program.uniforms.uWarp.value = warpAmount;
166+
program.uniforms.uBackgroundColor.value = backgroundColor;
167+
program.uniforms.uBackgroundOpacity.value = backgroundOpacity;
168+
program.uniforms.uPatternLightness.value = patternLightness;
169+
renderer.render({ scene: mesh });
170+
frame = requestAnimationFrame(loop);
171+
};
172+
173+
loop();
174+
175+
return () => {
176+
cancelAnimationFrame(frame);
177+
window.removeEventListener("resize", resize);
178+
};
179+
}, [
180+
hueShift,
181+
noiseIntensity,
182+
scanlineIntensity,
183+
speed,
184+
scanlineFrequency,
185+
warpAmount,
186+
resolutionScale,
187+
backgroundColor,
188+
backgroundOpacity,
189+
patternLightness,
190+
]);
191+
return <canvas ref={ref} className="w-full h-full block" />;
192+
}

apps/dashboard/src/@/components/blocks/color-mode-toggle.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@ import { MoonIcon, SunIcon } from "lucide-react";
44
import { useTheme } from "next-themes";
55
import { ClientOnly } from "@/components/blocks/client-only";
66
import { Button } from "@/components/ui/button";
7+
import { cn } from "@/lib/utils";
78
import { Skeleton } from "../ui/skeleton";
89

9-
export function ToggleThemeButton() {
10+
export function ToggleThemeButton(props: { className?: string }) {
1011
const { setTheme, theme } = useTheme();
1112

1213
return (
@@ -15,7 +16,10 @@ export function ToggleThemeButton() {
1516
>
1617
<Button
1718
aria-label="Toggle theme"
18-
className="h-auto w-auto rounded-full border border-border bg-background p-2"
19+
className={cn(
20+
"h-auto w-auto rounded-full border border-border bg-background p-2",
21+
props.className,
22+
)}
1923
onClick={() => {
2024
setTheme(theme === "dark" ? "light" : "dark");
2125
}}
Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@ import { useId, useState } from "react";
44
import { Button } from "@/components/ui/button";
55
import { DynamicHeight } from "@/components/ui/DynamicHeight";
66
import { cn } from "@/lib/utils";
7-
import type { ChainSeo } from "../../apis/chain-seo";
87

9-
export function FaqSection(props: { faqs: ChainSeo["faqs"] }) {
8+
export function FaqSection(props: {
9+
faqs: Array<{ title: string; description: string }>;
10+
}) {
1011
return (
1112
<div className="py-10">
1213
<section className="">

apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/(chainPage)/apis/chain-seo.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import "server-only";
22
import { unstable_cache } from "next/cache";
33

4-
export type ChainSeo = {
4+
type ChainSeo = {
55
title: string;
66
description: string;
77
og: {

apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/(chainPage)/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { CircleAlertIcon } from "lucide-react";
22
import { getRawAccount } from "@/api/account/get-account";
3+
import { FaqSection } from "@/components/blocks/faq-section";
34
import { getClientThirdwebClient } from "@/constants/thirdweb-client.client";
45
import { getChain, getCustomChainMetadata } from "../../utils";
56
import { fetchChainSeo } from "./apis/chain-seo";
@@ -8,7 +9,6 @@ import { ChainOverviewSection } from "./components/server/ChainOverviewSection";
89
import { ChainCTA } from "./components/server/cta-card";
910
import { ExplorersSection } from "./components/server/explorer-section";
1011
import { FaucetSection } from "./components/server/FaucetSection";
11-
import { FaqSection } from "./components/server/faq-section";
1212
import { SupportedProductsSection } from "./components/server/SupportedProductsSection";
1313

1414
type Props = {

apps/dashboard/src/app/(app)/(dashboard)/tokens/components/token-page.tsx

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { useQuery } from "@tanstack/react-query";
44
import { Input } from "@workspace/ui/components/input";
55
import { cn } from "@workspace/ui/lib/utils";
66
import { ActivityIcon, SearchIcon, TrendingUpIcon } from "lucide-react";
7-
import { useState } from "react";
7+
import { useCallback, useState } from "react";
88
import { Bridge } from "thirdweb";
99
import { BridgeNetworkSelector } from "@/components/blocks/NetworkSelectors";
1010
import { Button } from "@/components/ui/button";
@@ -15,20 +15,30 @@ const client = getClientThirdwebClient();
1515

1616
const pageSize = 20;
1717

18+
type Filter =
19+
| { type: "filter"; value: "volume" | "market_cap" }
20+
| { type: "search"; value: string };
21+
1822
export function TokenPage(props: { chains: Bridge.chains.Result }) {
1923
const [page, setPage] = useState(1);
2024
const [chainId, setChainId] = useState(1);
21-
const [search, setSearch] = useState("");
22-
const [sortBy, setSortBy] = useState<"volume" | "market_cap">("volume");
25+
const [filter, _setFilter] = useState<Filter>({
26+
type: "filter",
27+
value: "volume",
28+
});
29+
30+
const setFilter = useCallback((filter: Filter) => {
31+
_setFilter(filter);
32+
setPage(1);
33+
}, []);
2334

2435
const tokensQuery = useQuery({
2536
queryKey: [
2637
"tokens",
2738
{
2839
page,
2940
chainId,
30-
sortBy,
31-
search,
41+
filter,
3242
},
3343
],
3444
queryFn: () => {
@@ -37,8 +47,8 @@ export function TokenPage(props: { chains: Bridge.chains.Result }) {
3747
chainId: chainId,
3848
limit: pageSize,
3949
offset: (page - 1) * pageSize,
40-
sortBy: search ? undefined : sortBy,
41-
query: search ? search : undefined,
50+
sortBy: filter.type === "filter" ? filter.value : undefined,
51+
query: filter.type === "search" ? filter.value : undefined,
4252
});
4353
},
4454
refetchOnMount: false,
@@ -62,19 +72,19 @@ export function TokenPage(props: { chains: Bridge.chains.Result }) {
6272
<SortButton
6373
label="Popular"
6474
onClick={() => {
65-
setSortBy("market_cap");
66-
setSearch("");
75+
setFilter({ type: "filter", value: "market_cap" });
6776
}}
68-
isSelected={sortBy === "market_cap" && !search}
77+
isSelected={
78+
filter.type === "filter" && filter.value === "market_cap"
79+
}
6980
icon={ActivityIcon}
7081
/>
7182
<SortButton
7283
label="Trending"
7384
onClick={() => {
74-
setSortBy("volume");
75-
setSearch("");
85+
setFilter({ type: "filter", value: "volume" });
7686
}}
77-
isSelected={sortBy === "volume" && !search}
87+
isSelected={filter.type === "filter" && filter.value === "volume"}
7888
icon={TrendingUpIcon}
7989
/>
8090
</div>
@@ -83,9 +93,11 @@ export function TokenPage(props: { chains: Bridge.chains.Result }) {
8393
<SearchIcon className="size-4 absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground" />
8494
<Input
8595
placeholder="Search Tokens"
86-
value={search}
96+
value={filter.type === "search" ? filter.value : ""}
8797
className="rounded-xl bg-card flex-1 pl-9"
88-
onChange={(e) => setSearch(e.target.value)}
98+
onChange={(e) =>
99+
setFilter({ type: "search", value: e.target.value })
100+
}
89101
/>
90102
</div>
91103
</div>
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
"use client";
2+
3+
import { useTheme } from "next-themes";
4+
import { DarkVeil } from "@/components/DarkVeil";
5+
6+
const bgBackground: Record<string, [number, number, number]> = {
7+
dark: [0, 0, 0],
8+
light: [250 / 255, 250 / 255, 250 / 255],
9+
};
10+
11+
const hues = {
12+
light: 65,
13+
dark: -85,
14+
};
15+
16+
const patternLightnesss = {
17+
light: -1,
18+
dark: 0.8,
19+
};
20+
21+
export function BridgeVeil() {
22+
const theme = useTheme();
23+
const isLight = theme.theme === "light";
24+
const patternLightness = isLight
25+
? patternLightnesss.light
26+
: patternLightnesss.dark;
27+
const hueShift = isLight ? hues.light : hues.dark;
28+
return (
29+
<DarkVeil
30+
backgroundColor={bgBackground[isLight ? "light" : "dark"]}
31+
patternLightness={patternLightness}
32+
hueShift={hueShift}
33+
warpAmount={0.5}
34+
/>
35+
);
36+
}

0 commit comments

Comments
 (0)