Skip to content

Commit 25e8e18

Browse files
committed
Fix Avatar for Vercel.
1 parent 581ddc0 commit 25e8e18

File tree

3 files changed

+77
-8
lines changed

3 files changed

+77
-8
lines changed

package.json

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,14 @@
1111
},
1212
"type": "module",
1313
"scripts": {
14-
"dev": "next dev",
15-
"dev-turbo": "next dev -p 3001 --turbopack",
14+
"dev": "next dev -p 3001 --turbopack",
1615
"build": "npm-run-all check-env build-db check-db build-tracker build-geo build-app",
17-
"build-turbo": "npm-run-all check-env build-db check-db build-tracker build-geo build-app-turbo",
1816
"start": "next start",
1917
"build-docker": "npm-run-all build-db build-tracker build-geo build-app",
2018
"start-docker": "npm-run-all check-db update-tracker set-routes-manifest start-server",
2119
"start-env": "node scripts/start-env.js",
2220
"start-server": "node server.js",
23-
"build-app": "next build",
24-
"build-app-turbo": "next build --turbo",
21+
"build-app": "next build --turbo",
2522
"build-icons": "svgr ./src/assets --out-dir src/components/svg --typescript",
2623
"build-components": "tsup",
2724
"build-tracker": "rollup -c rollup.tracker.config.js",

pnpm-lock.yaml

Lines changed: 48 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/components/common/Avatar.tsx

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,41 @@ import { getColor, getPastel } from '@/lib/colors';
55

66
const lib = lorelei;
77

8+
// ✅ Modern UTF-8 safe base64 encoder (no deprecated APIs)
9+
function toBase64(str: string): string {
10+
if (typeof window === 'undefined') {
11+
// Server (Node.js)
12+
return Buffer.from(str, 'utf-8').toString('base64');
13+
} else {
14+
// Browser (UTF-8 safe)
15+
const encoder = new TextEncoder();
16+
const bytes = encoder.encode(str);
17+
let binary = '';
18+
const chunkSize = 0x8000;
19+
20+
for (let i = 0; i < bytes.length; i += chunkSize) {
21+
const chunk = bytes.subarray(i, i + chunkSize);
22+
binary += String.fromCharCode(...chunk);
23+
}
24+
25+
return btoa(binary);
26+
}
27+
}
28+
829
export function Avatar({ seed, size = 128, ...props }: { seed: string; size?: number }) {
930
const backgroundColor = getPastel(getColor(seed), 4);
1031

1132
const avatar = useMemo(() => {
12-
return createAvatar(lib, {
33+
const svg = createAvatar(lib, {
1334
...props,
1435
seed,
1536
size,
1637
backgroundColor: [backgroundColor],
17-
}).toDataUri();
18-
}, []);
38+
}).toString();
39+
40+
const base64 = toBase64(svg);
41+
return `data:image/svg+xml;base64,${base64}`;
42+
}, [seed, size, backgroundColor, props]);
1943

2044
return <img src={avatar} alt="Avatar" style={{ borderRadius: '100%', width: size }} />;
2145
}

0 commit comments

Comments
 (0)