Hey is a decentralized and permissionless social media app built with Lens Protocol 馃尶
1import {
2 BRAND_COLOR,
3 STATIC_IMAGES_URL,
4 TRANSFORMS
5} from "@hey/data/constants";
6import escapeHtml from "@hey/helpers/escapeHtml";
7import getAvatar from "@hey/helpers/getAvatar";
8import normalizeDescription from "@hey/helpers/normalizeDescription";
9import { GroupDocument, type GroupFragment } from "@hey/indexer";
10import type { Context } from "hono";
11import { html } from "hono/html";
12import generateOg from "./ogUtils";
13
14const getGroup = async (ctx: Context) => {
15 const { address } = ctx.req.param();
16
17 return generateOg({
18 buildHtml: (group: GroupFragment) => {
19 const name = group.metadata?.name || "Group";
20 const title = `${name} on Hey`;
21 const description = normalizeDescription(
22 group?.metadata?.description,
23 title
24 );
25 const avatar = getAvatar(group, TRANSFORMS.AVATAR_BIG);
26
27 const escTitle = escapeHtml(title);
28 const escDescription = escapeHtml(description);
29 const escName = escapeHtml(name);
30
31 return html`
32 <html>
33 <head>
34 <meta charSet="utf-8" />
35 <meta name="viewport" content="width=device-width" />
36 <meta http-equiv="content-language" content="en-US" />
37 <meta name="theme-color" content="${BRAND_COLOR}" />
38 <title>${escTitle}</title>
39 <meta name="description" content="${escDescription}" />
40 <meta property="og:title" content="${escTitle}" />
41 <meta property="og:description" content="${escDescription}" />
42 <meta property="og:type" content="profile" />
43 <meta property="og:site_name" content="Hey" />
44 <meta property="og:url" content="https://hey.xyz/g/${group.address}" />
45 <meta property="og:image" content="${avatar}" />
46 <meta property="og:logo" content="${STATIC_IMAGES_URL}/app-icon/0.png" />
47 <meta name="twitter:card" content="summary" />
48 <meta name="twitter:title" content="${escTitle}" />
49 <meta name="twitter:description" content="${escDescription}" />
50 <meta name="twitter:image" content="${avatar}" />
51 <meta name="twitter:site" content="@heydotxyz" />
52 <link rel="icon" href="https://hey.xyz/favicon.ico" />
53 <link rel="canonical" href="https://hey.xyz/g/${group.address}" />
54 </head>
55 <body>
56 <img src="${avatar}" alt="${escTitle}" height="100" width="100" />
57 <h1>${escName}</h1>
58 <h2>${escDescription}</h2>
59 </body>
60 </html>
61 `;
62 },
63 ctx,
64 extractData: (data) => data.group as GroupFragment | null,
65 query: GroupDocument,
66 variables: { request: { group: address } }
67 });
68};
69
70export default getGroup;