Skip to content

Commit a5d34dc

Browse files
committed
feat: subpage-og-image function
1 parent 1384c74 commit a5d34dc

File tree

10 files changed

+109
-8
lines changed

10 files changed

+109
-8
lines changed

apps/web/app/pages/code-of-conduct.vue

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
<script setup lang="ts">
2-
import { useHead } from '#imports'
2+
import { useHead, useRuntimeConfig } from '#imports'
33
import { useColor, useTypography } from '@vuejs-jp/composable'
44
import { useLocaleCurrent } from '~/composables/useLocaleCurrent'
55
import { conferenceTitle, linkUrl, ogCoCDescription } from '~/utils/constants'
66
import { generalOg, twitterOg } from '~/utils/og.constants'
77
8+
const config = useRuntimeConfig()
9+
810
useHead({
911
// eslint-disable-next-line no-unused-vars
1012
titleTemplate: (titleChunk) => `行動規範 | ${conferenceTitle}`,
@@ -13,11 +15,13 @@ useHead({
1315
title: `行動規範 | ${conferenceTitle}`,
1416
description: ogCoCDescription,
1517
url: `${linkUrl}code-of-conduct`,
18+
image: `${config.public.supabaseUrl}/functions/v1/subpage-og-image?title=行動規範`,
1619
}),
1720
...twitterOg({
1821
title: `行動規範 | ${conferenceTitle}`,
1922
description: ogCoCDescription,
2023
url: `${linkUrl}code-of-conduct`,
24+
image: `${config.public.supabaseUrl}/functions/v1/subpage-og-image?title=行動規範`,
2125
}),
2226
],
2327
})

apps/web/app/pages/jobboard.vue

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<script setup lang="ts">
2-
import { useFetch, useHead } from '#imports'
2+
import { useFetch, useHead, useRuntimeConfig } from '#imports'
33
import type { JobInfo } from '@vuejs-jp/model'
44
import { conferenceTitle, linkUrl, ogJobboardDescription } from '~/utils/constants'
55
import { generalOg, twitterOg } from '~/utils/og.constants'
@@ -12,18 +12,22 @@ if (error.value) {
1212
}
1313
const { allJobs } = data.value as Jobs
1414
15+
const config = useRuntimeConfig()
16+
1517
useHead({
1618
titleTemplate: (titleChunk) => `ジョブボード | ${conferenceTitle}`,
1719
meta: [
1820
...generalOg({
1921
title: `ジョブボード | ${conferenceTitle}`,
2022
description: ogJobboardDescription,
2123
url: `${linkUrl}jobboard`,
24+
image: `${config.public.supabaseUrl}/functions/v1/subpage-og-image?title=ジョブボード`,
2225
}),
2326
...twitterOg({
2427
title: `ジョブボード | ${conferenceTitle}`,
2528
description: ogJobboardDescription,
2629
url: `${linkUrl}jobboard`,
30+
image: `${config.public.supabaseUrl}/functions/v1/subpage-og-image?title=ジョブボード`,
2731
}),
2832
],
2933
})

apps/web/app/pages/namecard/index.vue

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<script setup lang="ts">
2-
import { createError, useRuntimeConfig, navigateTo } from '#imports'
2+
import { createError, navigateTo, useFetch, useHead, useRuntimeConfig } from '#imports'
33
import { useI18n } from '#i18n'
44
import { ref } from 'vue'
55
import type { AuthProvider, DialogStatus } from '@vuejs-jp/model'
@@ -9,7 +9,8 @@ import { useAuthSession } from '~/composables/useAuthSession'
99
import { useLocaleCurrent } from '~/composables/useLocaleCurrent'
1010
import MarkDownText from '~/components/MarkDownText.vue'
1111
import CreationProcess from '~/components/namecard/CreationProcess.vue'
12-
import { useFetch } from '#imports'
12+
import { conferenceTitle, linkUrl, ogNamecardEntryDescription } from '~/utils/constants'
13+
import { generalOg, twitterOg } from '~/utils/og.constants'
1314
import type { AttendeeInfo } from '@vuejs-jp/model'
1415
1516
type Attendees = Record<'activatedAttendees', AttendeeInfo>
@@ -32,6 +33,25 @@ const { t } = useI18n()
3233
const { locale } = useLocaleCurrent()
3334
const showDialog = ref(false)
3435
36+
useHead({
37+
// eslint-disable-next-line no-unused-vars
38+
titleTemplate: (titleChunk) => `ネームカード | ${conferenceTitle}`,
39+
meta: [
40+
...generalOg({
41+
title: `ネームカード | ${conferenceTitle}`,
42+
description: ogNamecardEntryDescription,
43+
url: `${linkUrl}namecard`,
44+
image: `${config.public.supabaseUrl}/functions/v1/subpage-og-image?title=ネームカード`,
45+
}),
46+
...twitterOg({
47+
title: `ネームカード | ${conferenceTitle}`,
48+
description: ogNamecardEntryDescription,
49+
url: `${linkUrl}namecard`,
50+
image: `${config.public.supabaseUrl}/functions/v1/subpage-og-image?title=ネームカード`,
51+
}),
52+
],
53+
})
54+
3555
function handleClickButton(type: DialogStatus) {
3656
if (type === 'open') {
3757
showDialog.value = true

apps/web/app/pages/privacy.vue

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
<script setup lang="ts">
2-
import { useHead, useI18n } from '#imports'
3-
import FooterPageSection from '~/components/FooterPageSection.vue'
2+
import { useHead, useI18n, useRuntimeConfig } from '#imports'
43
import MarkDownText from '~/components/MarkDownText.vue'
54
import { useColor, useTypography } from '@vuejs-jp/composable'
65
import { useLocaleCurrent } from '~/composables/useLocaleCurrent'
76
import { conferenceTitle, linkUrl, ogPrivacyDescription } from '~/utils/constants'
87
import { generalOg, twitterOg } from '~/utils/og.constants'
98
9+
const config = useRuntimeConfig()
1010
const { t } = useI18n()
1111
const { path: localePath } = useLocaleCurrent()
1212
const { fontWeight, fontSize } = useTypography()
@@ -20,11 +20,13 @@ useHead({
2020
title: `プライバシーポリシー | ${conferenceTitle}`,
2121
description: ogPrivacyDescription,
2222
url: `${linkUrl}privacy`,
23+
image: `${config.public.supabaseUrl}/functions/v1/subpage-og-image?title=プライバシーポリシー`,
2324
}),
2425
...twitterOg({
2526
title: `プライバシーポリシー | ${conferenceTitle}`,
2627
description: ogPrivacyDescription,
2728
url: `${linkUrl}privacy`,
29+
image: `${config.public.supabaseUrl}/functions/v1/subpage-og-image?title=プライバシーポリシー`,
2830
}),
2931
],
3032
})

apps/web/app/pages/sharemap.vue

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<script setup lang="ts">
2-
import { useFetch, useHead } from '#imports'
2+
import { useFetch, useHead, useRuntimeConfig } from '#imports'
33
import type { PanelerInfo, SpeakerCategory, SpeakerInfo, SponsorCategory, SponsorInfo, StaffCategory, StaffInfo } from '@vuejs-jp/model'
44
import { useLocaleCurrent } from '~/composables/useLocaleCurrent'
55
import { conferenceTitle, linkUrl, ogSharemapDescription } from '~/utils/constants'
@@ -47,6 +47,7 @@ if (error3.value) {
4747
console.error(error3.value)
4848
}
4949
50+
const config = useRuntimeConfig()
5051
const { path: localePath } = useLocaleCurrent()
5152
5253
useHead({
@@ -57,11 +58,13 @@ useHead({
5758
title: `シェアURL | ${conferenceTitle}`,
5859
description: ogSharemapDescription,
5960
url: `${linkUrl}sharemap`,
61+
image: `${config.public.supabaseUrl}/functions/v1/subpage-og-image?title=シェアURL`,
6062
}),
6163
...twitterOg({
6264
title: `シェアURL | ${conferenceTitle}`,
6365
description: ogSharemapDescription,
6466
url: `${linkUrl}sharemap`,
67+
image: `${config.public.supabaseUrl}/functions/v1/subpage-og-image?title=シェアURL`,
6568
}),
6669
],
6770
})

apps/web/app/pages/tokusho.vue

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
<script setup lang="ts">
2-
import { useHead } from '#imports'
2+
import { useHead, useRuntimeConfig } from '#imports'
33
import { useColor, useTypography } from '@vuejs-jp/composable'
44
import { useLocaleCurrent } from '~/composables/useLocaleCurrent'
55
import { conferenceTitle, linkUrl, ogTokushoDescription } from '~/utils/constants'
66
import { generalOg, twitterOg } from '~/utils/og.constants'
77
8+
const config = useRuntimeConfig()
9+
810
useHead({
911
// eslint-disable-next-line no-unused-vars
1012
titleTemplate: (titleChunk) => `特定商取引法に基づく表記 | ${conferenceTitle}`,
@@ -13,11 +15,13 @@ useHead({
1315
title: `特定商取引法に基づく表記 | ${conferenceTitle}`,
1416
description: ogTokushoDescription,
1517
url: `${linkUrl}tokusho`,
18+
image: `${config.public.supabaseUrl}/functions/v1/subpage-og-image?title=特定商取引法に基づく表記`,
1619
}),
1720
...twitterOg({
1821
title: `特定商取引法に基づく表記 | ${conferenceTitle}`,
1922
description: ogTokushoDescription,
2023
url: `${linkUrl}tokusho`,
24+
image: `${config.public.supabaseUrl}/functions/v1/subpage-og-image?title=特定商取引法に基づく表記`,
2125
}),
2226
],
2327
})

apps/web/app/utils/constants.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ export const ogSponsorDescription = 'Vue Fes Japan 2024 のスポンサー情報
2020

2121
export const ogStaffDescription = 'Vue Fes Japan 2024 のスタッフ情報です。'
2222

23+
export const ogNamecardEntryDescription = 'Vue Fes Japan 2024 のネームカード作成はこちら。'
24+
2325
export const ogNamecardDescription = 'さんのネームカードです。'
2426

2527
export const ogJobboardDescription = 'Vue Fes Japan 2024 のジョブボードです。'
Binary file not shown.
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import React from 'https://esm.sh/[email protected]'
2+
import { ImageResponse } from 'https://deno.land/x/[email protected]/mod.ts'
3+
4+
const FONT_URL = 'https://jjdlwtezpdclgxxagxpj.supabase.co/storage/v1/object/public/common_asset/fonts/NotoSansCJKjp-Bold.otf'
5+
const font = fetch(new URL(FONT_URL, import.meta.url)).then((res) => res.arrayBuffer())
6+
7+
export default async function handler(req: Request) {
8+
const params = new URLSearchParams(req.url.split('?')[1])
9+
10+
const fontData = await font
11+
12+
const title = params.get('title') ?? ''
13+
14+
return new ImageResponse(
15+
(
16+
<div
17+
style={{
18+
background: 'url(https://i.imgur.com/kpZdYv8.png)',
19+
width: '100%',
20+
paddingTop: '107px',
21+
position: 'relative',
22+
textAlign: 'center',
23+
fontFamily: '\'din-2014\', \'游ゴシック体\', YuGothic, \'游ゴシック\', \'Yu Gothic\', sans-serif',
24+
}}
25+
>
26+
<div
27+
style={{
28+
color: '#35495e',
29+
fontSize: '80px',
30+
fontWeight: '900',
31+
position: 'absolute',
32+
top: '40%',
33+
left: '4px',
34+
maxHeight: '1.5em',
35+
justifyContent: 'center',
36+
margin: '10px 80px 0',
37+
overflow: 'hidden',
38+
lineHeight: '150%',
39+
}}
40+
>
41+
{title}
42+
</div>
43+
</div>
44+
),
45+
{
46+
width: 1200,
47+
height: 630,
48+
fonts: [
49+
{
50+
name: 'noto-sans-cjk-jp',
51+
data: fontData,
52+
style: 'normal',
53+
},
54+
],
55+
},
56+
)
57+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import handler from './handler.tsx'
2+
3+
console.log('Hello from Functions!')
4+
5+
Deno.serve(handler)

0 commit comments

Comments
 (0)