Skip to content

Commit fdc24b1

Browse files
committed
feat: og-image
1 parent 8ea3a0c commit fdc24b1

File tree

6 files changed

+376
-11
lines changed

6 files changed

+376
-11
lines changed

angular-hub/index.html

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,6 @@
66
<base href="/" />
77
<meta name="viewport" content="width=device-width, initial-scale=1" />
88
<meta property="og:title" content="Angular Hub" />
9-
<meta
10-
property="og:image"
11-
content="https://angular-hub.com/assets/images/og-image.webp"
12-
/>
139
<meta
1410
property="og:description"
1511
content="Curated list of Angular events and communities"

angular-hub/src/app/pages/index.page.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,14 @@ export const routeMeta: RouteMeta = {
2525
name: 'description',
2626
content: 'Curated list of Angular Events',
2727
},
28+
{
29+
property: 'og:title',
30+
content: 'Title of the page',
31+
},
32+
{
33+
property: 'og:image',
34+
content: '/api/v1/og-image?title=Developer',
35+
},
2836
],
2937
};
3038

42.3 KB
Loading
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import { ImageResponse } from '@analogjs/content/og';
2+
import { Event } from '../../../models/event.model';
3+
4+
export default defineEventHandler(async (event) => {
5+
const data = await fetch('http://localhost:4200/api/v1/events/upcoming');
6+
const events: Event[] = await data.json();
7+
const eventLength = events.length;
8+
const topEvents = events.slice(0, 3);
9+
10+
const fontFile = await fetch(
11+
'https://og-playground.vercel.app/inter-latin-ext-700-normal.woff',
12+
);
13+
const fontData: ArrayBuffer = await fontFile.arrayBuffer();
14+
const query = getQuery(event); // query params
15+
16+
const template = `
17+
<div tw="bg-gray-50 flex flex-col w-full h-full items-center justify-center">
18+
<h2 class="text-5xl">${eventLength} upcoming events</h2>
19+
${topEvents.map((event) => `${event.name}`)}
20+
</div>
21+
`;
22+
23+
const cards = `
24+
${topEvents.map((event) => {
25+
return `<h4 class="text-xl font-bold my-1">
26+
${event.name}
27+
</h4>
28+
<div class="flex gap-4 mb-2">
29+
<div class="flex justify-center items-center w-20 h-20">
30+
<img
31+
class="rounded-xl"
32+
[src]="${event.community?.logo}"
33+
aria-hidden="true"
34+
height="70"
35+
width="70"
36+
alt=""
37+
/>
38+
</div>
39+
<div class="flex-1">
40+
<span class="font-bold text-primary" itemprop="date">
41+
${event.date}
42+
${event.endDate ? '- ' + event.endDate : ''}
43+
</span>
44+
</div>
45+
</div>`;
46+
})}
47+
`;
48+
49+
return new ImageResponse(template, {
50+
debug: true, // disable caching
51+
fonts: [
52+
{
53+
name: 'Inter Latin',
54+
data: fontData,
55+
style: 'normal',
56+
},
57+
],
58+
});
59+
});

package.json

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,18 @@
3535
"marked": "^5.0.2",
3636
"marked-gfm-heading-id": "^3.1.0",
3737
"marked-highlight": "^2.0.1",
38+
"marked-mangle": "^1.1.7",
3839
"mermaid": "^10.2.4",
3940
"primeicons": "^7.0.0",
4041
"primeng": "^17.18.7",
4142
"prismjs": "^1.29.0",
4243
"rxjs": "~7.8.0",
44+
"satori": "^0.10.14",
45+
"satori-html": "^0.3.2",
46+
"sharp": "^0.33.5",
4347
"tslib": "^2.6.3",
4448
"valibot": "^0.35.0",
45-
"zone.js": "0.14.7",
46-
"marked-mangle": "^1.1.7"
49+
"zone.js": "0.14.7"
4750
},
4851
"devDependencies": {
4952
"@analogjs/platform": "1.8.0-beta.2",

0 commit comments

Comments
 (0)