Skip to content

Commit 850c7fb

Browse files
beta page
1 parent ac4a35e commit 850c7fb

13 files changed

Lines changed: 265 additions & 41 deletions

File tree

app/[locale]/download/Download.module.css

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,3 +71,30 @@
7171
font-weight: bold;
7272
padding: 0 4px;
7373
}
74+
75+
.prerelease-entry {
76+
@apply mx-4 mb-4 p-6 flex flex-col md:flex-row md:items-center md:justify-between gap-5;
77+
border-radius: 18px;
78+
border: 1px solid rgba(0, 92, 175, 0.18);
79+
background:
80+
radial-gradient(circle at 18% 20%, rgba(0, 92, 175, 0.16), transparent 28%),
81+
linear-gradient(135deg, rgba(0, 92, 175, 0.10), rgba(181, 73, 91, 0.08));
82+
box-shadow: 0 18px 45px rgba(0, 92, 175, 0.10);
83+
}
84+
85+
.prerelease-title {
86+
@apply text-2xl font-semibold text-terre;
87+
}
88+
89+
.prerelease-description {
90+
@apply text-gray-700 leading-relaxed;
91+
}
92+
93+
.prerelease-list {
94+
@apply mt-3 list-disc list-inside text-gray-700 space-y-1;
95+
}
96+
97+
.prerelease-kicker {
98+
@apply text-sm font-semibold tracking-wider uppercase;
99+
color: #B5495B;
100+
}

app/[locale]/download/components/DownloadWebgal.tsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@ import Link from 'next/link'
88
import { RiGithubFill } from 'react-icons/ri'
99
import styles from '../Download.module.css'
1010

11-
const DownloadWebgal = () => {
11+
const DownloadWebgal = ({ prerelease = false }: { prerelease?: boolean }) => {
1212

1313
const webgalUrl = 'https://github.com/OpenWebGAL/WebGAL'
14-
const webgalApiUrl = 'https://api.github.com/repos/OpenWebGAL/WebGAL/releases/latest'
15-
const webgalAssets = useWebgalAssets(webgalApiUrl)
14+
const webgalApiUrl = prerelease ? 'https://api.github.com/repos/OpenWebGAL/WebGAL/releases' : 'https://api.github.com/repos/OpenWebGAL/WebGAL/releases/latest'
15+
const webgalAssets = useWebgalAssets(webgalApiUrl, prerelease)
1616
const locale = useLocale()
1717
const releaseIndex = i18n.locales.findIndex(item => item.code === locale)
1818
const t = useTranslations('download')
@@ -26,7 +26,7 @@ const DownloadWebgal = () => {
2626

2727
return (
2828
<div className={styles.card}>
29-
<h2 className={`${styles['card-title']} border-webgal`}>{t('webgal')}</h2>
29+
<h2 className={`${styles['card-title']} border-webgal`}>{prerelease ? t('webgalPrerelease') : t('webgal')}</h2>
3030
<div className={styles['card-info']}>
3131
<p><strong>{t('version')}:</strong> {webgalAssets?.version ? webgalAssets?.version : t('fetching')}</p>
3232
<p><strong>{t('releaseTime')}:</strong> {webgalAssets?.releaseTime ? webgalAssets?.releaseTime.split('T')[0] : t('fetching')} </p>
@@ -40,11 +40,11 @@ const DownloadWebgal = () => {
4040
</div>
4141
<div className={styles['card-button-gourp']}>
4242
<Button>
43-
<Link href={webgalUrl} target={'_blank'} ><RiGithubFill />GitHub</Link>
43+
<Link href={webgalAssets?.releaseUrl ?? webgalUrl} target={'_blank'} ><RiGithubFill />GitHub</Link>
4444
</Button>
4545
</div>
4646
</div>
4747
)
4848
}
4949

50-
export default DownloadWebgal
50+
export default DownloadWebgal

app/[locale]/download/components/DownloadWebgalTerre.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,17 @@ import styles from '../Download.module.css'
88
import { useLocale, useTranslations } from 'next-intl'
99
import { i18n } from '@/i18n'
1010

11-
const DownloadWebgalTerre = () => {
11+
const DownloadWebgalTerre = ({ prerelease = false }: { prerelease?: boolean }) => {
1212

1313
const webgalTerreUrl = 'https://github.com/OpenWebGAL/WebGAL_Terre/releases'
14-
const webgalTerreApiUrl = 'https://api.github.com/repos/OpenWebGAL/WebGAL_Terre/releases/latest'
14+
const webgalTerreApiUrl = prerelease ? 'https://api.github.com/repos/OpenWebGAL/WebGAL_Terre/releases' : 'https://api.github.com/repos/OpenWebGAL/WebGAL_Terre/releases/latest'
1515

1616
const t = useTranslations('download')
1717
const locale = useLocale()
1818

1919
const releaseIndex = i18n.locales.findIndex(item => item.code === locale)
2020

21-
const webgalTerreAssets = useWebgalTerreAssets(webgalTerreApiUrl)
21+
const webgalTerreAssets = useWebgalTerreAssets(webgalTerreApiUrl, prerelease)
2222

2323
const releaseNote =
2424
webgalTerreAssets?.releaseNote[releaseIndex]
@@ -51,7 +51,7 @@ const DownloadWebgalTerre = () => {
5151

5252
return (
5353
<div className={styles.card}>
54-
<h2 className={`${styles['card-title']} border-terre`}>{t('webgalTerre')}</h2>
54+
<h2 className={`${styles['card-title']} border-terre`}>{prerelease ? t('webgalTerrePrerelease') : t('webgalTerre')}</h2>
5555
<div className={styles['card-info']}>
5656
{/* <div className={styles.corner}>
5757
<p className={`${styles['corner-text']} bg-terre`}>{t('recommend')}</p>
@@ -71,7 +71,7 @@ const DownloadWebgalTerre = () => {
7171
</div>
7272
<div className={styles['card-button-gourp']}>
7373
<Button terre>
74-
<Link href={webgalTerreUrl} target={'_blank'}><RiGithubFill />{t('gitHubReleases')}</Link>
74+
<Link href={webgalTerreAssets?.releaseUrl ?? webgalTerreUrl} target={'_blank'}><RiGithubFill />{t('gitHubReleases')}</Link>
7575
</Button>
7676
{
7777
downloadUrls &&
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
'use client'
2+
3+
import Button from '@/components/Button/Button'
4+
import { useLocale, useTranslations } from 'next-intl'
5+
import Link from 'next/link'
6+
import { RiFlaskFill } from 'react-icons/ri'
7+
import styles from '../Download.module.css'
8+
9+
const PrereleaseEntry = () => {
10+
const locale = useLocale()
11+
const t = useTranslations('download.prereleaseEntry')
12+
13+
return (
14+
<section className={styles['prerelease-entry']}>
15+
<div>
16+
<p className={styles['prerelease-kicker']}>{t('kicker')}</p>
17+
<h2 className={styles['prerelease-title']}>{t('title')}</h2>
18+
<p className={styles['prerelease-description']}>{t('description')}</p>
19+
<ul className={styles['prerelease-list']}>
20+
<li>{t('feature0')}</li>
21+
<li>{t('feature1')}</li>
22+
{/* <li>{t('feature2')}</li> */}
23+
</ul>
24+
</div>
25+
<Button terre>
26+
<Link href={`/${locale}/download/prerelease/`}><RiFlaskFill />{t('action')}</Link>
27+
</Button>
28+
</section>
29+
)
30+
}
31+
32+
export default PrereleaseEntry

app/[locale]/download/page.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,13 @@ import ReadFirst from './components/ReadFirst'
77
import License from './components/License'
88
import { siteConfig } from '@/site.config'
99
import Container from '@/components/Container/Container'
10+
import PrereleaseEntry from './components/PrereleaseEntry'
1011

1112
const Download = () => {
1213
return (
1314
<Container>
1415
<DownloadTitle />
16+
<PrereleaseEntry />
1517
<ReadFirst />
1618
<DownloadWebgalTerre />
1719
<DownloadWebgal />
@@ -45,4 +47,4 @@ export async function generateMetadata({ params: { locale } }: { params: { local
4547
],
4648
},
4749
}
48-
}
50+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import { createTranslator } from 'next-intl'
2+
import DownloadWebgalTerre from '../components/DownloadWebgalTerre'
3+
import DownloadWebgal from '../components/DownloadWebgal'
4+
import SystemRequirements from '../components/SystemRequirements'
5+
import ReadFirst from '../components/ReadFirst'
6+
import License from '../components/License'
7+
import { siteConfig } from '@/site.config'
8+
import Container from '@/components/Container/Container'
9+
10+
const PrereleaseDownload = async ({ params: { locale } }: { params: { locale: string } }) => {
11+
const messages = (await import(`/locales/${locale}.json`)).default
12+
const t = createTranslator({ locale, messages })
13+
14+
return (
15+
<Container>
16+
<div className='pt-8 pb-4 px-4'>
17+
<h1 className='text-2xl font-semibold'>{t('download.prereleasePage.title')}</h1>
18+
<p className='pt-2 text-gray-700'>{t('download.prereleasePage.description')}</p>
19+
</div>
20+
<ReadFirst />
21+
<DownloadWebgalTerre prerelease />
22+
<DownloadWebgal prerelease />
23+
<SystemRequirements />
24+
<License />
25+
</Container>
26+
)
27+
}
28+
29+
export default PrereleaseDownload
30+
31+
export async function generateMetadata({ params: { locale } }: { params: { locale: string } }) {
32+
const messages = (await import(`/locales/${locale}.json`)).default
33+
34+
const t = createTranslator({ locale, messages })
35+
36+
return {
37+
metadataBase: new URL(siteConfig.baseUrl),
38+
title: t('metadata.downloadPrerelease.title'),
39+
description: t('metadata.downloadPrerelease.description'),
40+
openGraph: {
41+
title: t('metadata.downloadPrerelease.title'),
42+
description: t('metadata.downloadPrerelease.description'),
43+
url: `/${locale}/download/prerelease`,
44+
images: [
45+
{
46+
url: '/images/opengraph-image.png',
47+
width: 512,
48+
height: 512,
49+
},
50+
],
51+
},
52+
}
53+
}

app/download/prerelease/page.tsx

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import Redirect from '@/components/Redirect/Redirect'
2+
import { siteConfig } from '@/site.config'
3+
import type { Metadata } from 'next'
4+
5+
export const metadata: Metadata = {
6+
metadataBase: new URL(siteConfig.baseUrl),
7+
title: 'WebGAL Pre-release Download',
8+
description: 'WebGAL Pre-release Download',
9+
openGraph: {
10+
title: 'WebGAL Pre-release Download',
11+
description: 'WebGAL Pre-release Download',
12+
url: '/download/prerelease/',
13+
images: [
14+
{
15+
url: '/images/opengraph-image.png',
16+
width: 512,
17+
height: 512,
18+
},
19+
],
20+
},
21+
}
22+
23+
const PrereleaseDownloadRedirect = () => {
24+
return (
25+
<main>
26+
<div>
27+
<Redirect title='WebGAL Pre-release Download' url='/download/prerelease/' />
28+
</div>
29+
</main>
30+
)
31+
}
32+
33+
export default PrereleaseDownloadRedirect

hooks/useWebgalAssets.ts

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,30 @@ import { WebgalAssets } from '@/types'
22
import { parseReleaseNotes } from '@/utils'
33
import { useEffect, useState } from 'react'
44

5-
const useWebgalAssets = (webgalApiUrl: string) => {
5+
const useWebgalAssets = (webgalApiUrl: string, prerelease = false) => {
66

77
const [webgalAssets, setWebgalAssets] = useState<WebgalAssets>()
88

99
useEffect(() => {
1010
try {
1111
fetch(webgalApiUrl)
1212
.then(response => response.json())
13-
.then(async data => setWebgalAssets(
14-
{
15-
version: data.tag_name,
16-
releaseTime: data.published_at,
17-
releaseNote: await parseReleaseNotes(data.body),
18-
}
19-
))
13+
.then(async data => {
14+
const release = prerelease && Array.isArray(data)
15+
? data.find(item => item.prerelease)
16+
: data
17+
18+
if (!release) return
19+
20+
setWebgalAssets(
21+
{
22+
version: release.tag_name,
23+
releaseTime: release.published_at,
24+
releaseNote: await parseReleaseNotes(release.body),
25+
releaseUrl: release.html_url,
26+
}
27+
)
28+
})
2029
} catch (error) {
2130
console.error(error)
2231
}
@@ -25,4 +34,4 @@ const useWebgalAssets = (webgalApiUrl: string) => {
2534
return webgalAssets
2635
}
2736

28-
export default useWebgalAssets
37+
export default useWebgalAssets

hooks/useWebgalTerreAssets.ts

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,32 +2,41 @@ import { WebgalTerreAssets } from '@/types'
22
import { findAssetsUrl, parseReleaseNotes } from '@/utils'
33
import { useState, useEffect } from 'react'
44

5-
const useWebgalTerreAssets = (webgalTerreApiUrl: string) => {
5+
const useWebgalTerreAssets = (webgalTerreApiUrl: string, prerelease = false) => {
66

77
const [webgalTerreAssets, setWebgalTerreAssets] = useState<WebgalTerreAssets>()
88

99
useEffect(() => {
1010
try {
1111
fetch(webgalTerreApiUrl)
1212
.then(response => response.json())
13-
.then(async data => setWebgalTerreAssets(
14-
{
15-
version: data.tag_name,
16-
releaseTime: data.published_at,
17-
releaseNote: await parseReleaseNotes(data.body),
18-
downloadUrl: [
19-
{ platform: 'windows', url: findAssetsUrl(data.assets, 'Windows.*.zip') },
20-
{ platform: 'windowsSetup', url: findAssetsUrl(data.assets, 'Windows_Setup.*.exe') },
21-
{ platform: 'windowsArm64', url: findAssetsUrl(data.assets, 'Windows_Arm64.*.zip') },
22-
{ platform: 'windowsArm64Setup', url: findAssetsUrl(data.assets, 'Windows_Arm64_Setup.*.exe') },
23-
{ platform: 'macos', url: findAssetsUrl(data.assets, 'mac.*.zip') },
24-
{ platform: 'macosIntel', url: findAssetsUrl(data.assets, 'Mac_Intel.*.zip') },
25-
{ platform: 'linux', url: findAssetsUrl(data.assets, 'Linux.*.zip') },
26-
{ platform: 'linuxArm64', url: findAssetsUrl(data.assets, 'Linux_Arm64.*.zip') },
27-
{ platform: 'android', url: findAssetsUrl(data.assets, 'Android.*.apk') }
28-
]
29-
}
30-
))
13+
.then(async data => {
14+
const release = prerelease && Array.isArray(data)
15+
? data.find(item => item.prerelease)
16+
: data
17+
18+
if (!release) return
19+
20+
setWebgalTerreAssets(
21+
{
22+
version: release.tag_name,
23+
releaseTime: release.published_at,
24+
releaseNote: await parseReleaseNotes(release.body),
25+
releaseUrl: release.html_url,
26+
downloadUrl: [
27+
{ platform: 'windows', url: findAssetsUrl(release.assets, 'Windows.*.zip') },
28+
{ platform: 'windowsSetup', url: findAssetsUrl(release.assets, 'Windows_Setup.*.exe') },
29+
{ platform: 'windowsArm64', url: findAssetsUrl(release.assets, 'Windows_Arm64.*.zip') },
30+
{ platform: 'windowsArm64Setup', url: findAssetsUrl(release.assets, 'Windows_Arm64_Setup.*.exe') },
31+
{ platform: 'macos', url: findAssetsUrl(release.assets, 'mac.*.zip') },
32+
{ platform: 'macosIntel', url: findAssetsUrl(release.assets, 'Mac_Intel.*.zip') },
33+
{ platform: 'linux', url: findAssetsUrl(release.assets, 'Linux.*.zip') },
34+
{ platform: 'linuxArm64', url: findAssetsUrl(release.assets, 'Linux_Arm64.*.zip') },
35+
{ platform: 'android', url: findAssetsUrl(release.assets, 'Android.*.apk') }
36+
]
37+
}
38+
)
39+
})
3140
} catch (error) {
3241
console.error(error)
3342
}
@@ -36,4 +45,4 @@ const useWebgalTerreAssets = (webgalTerreApiUrl: string) => {
3645
return webgalTerreAssets
3746
}
3847

39-
export default useWebgalTerreAssets
48+
export default useWebgalTerreAssets

locales/en.json

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@
1515
"blog": {
1616
"title": "Blog",
1717
"description": "WebGAL blog page"
18+
},
19+
"downloadPrerelease": {
20+
"title": "WebGAL Pre-release Download",
21+
"description": "Download beta pre-release builds of WebGAL and WebGAL Terre"
1822
}
1923
},
2024
"common": {
@@ -115,6 +119,21 @@
115119
"part0": "If you are developing in Visual Studio Code, you can install the",
116120
"part1": "plugin for syntax highlighting"
117121
}
122+
},
123+
"webgalPrerelease": "WebGAL Pre-release",
124+
"webgalTerrePrerelease": "WebGAL Terre Pre-release",
125+
"prereleaseEntry": {
126+
"kicker": "4.6 Beta pre-release",
127+
"title": "Try WebGAL 4.6 early",
128+
"description": "Pre-release builds let you test new features before the stable release. They may still change, so production projects should prefer the stable version.",
129+
"feature0": "New Terre user data directory layout, removing manual migration for future upgrades.",
130+
"feature1": "Major improvements to WebGAL performance flow, fast preview, and stage state management.",
131+
"feature2": "Beta builds are published as GitHub Release pre-releases.",
132+
"action": "Download pre-release"
133+
},
134+
"prereleasePage": {
135+
"title": "WebGAL 4.6 Beta Pre-release",
136+
"description": "This page shows the latest GitHub Release pre-release builds for early testing of 4.6 features."
118137
}
119138
},
120139
"license": {

0 commit comments

Comments
 (0)