From 2bdabcc82968b6278945e47998276926ede4f371 Mon Sep 17 00:00:00 2001 From: whitemind Date: Wed, 16 Aug 2023 11:59:42 +0800 Subject: [PATCH] feat: implement changelog page --- packages/app/public/locales/en/changelog.json | 3 + packages/app/public/locales/zh/changelog.json | 3 + packages/app/src/components/Header/index.tsx | 2 +- .../app/src/pages/changelog/index.module.scss | 64 +++++++++++++ .../app/src/pages/changelog/index.page.tsx | 88 ++++++++++++++++++ .../app/src/pages/changelog/neuron-logo.png | Bin 0 -> 16062 bytes 6 files changed, 159 insertions(+), 1 deletion(-) create mode 100644 packages/app/public/locales/en/changelog.json create mode 100644 packages/app/public/locales/zh/changelog.json create mode 100644 packages/app/src/pages/changelog/index.module.scss create mode 100644 packages/app/src/pages/changelog/index.page.tsx create mode 100644 packages/app/src/pages/changelog/neuron-logo.png diff --git a/packages/app/public/locales/en/changelog.json b/packages/app/public/locales/en/changelog.json new file mode 100644 index 00000000..f34ebe2f --- /dev/null +++ b/packages/app/public/locales/en/changelog.json @@ -0,0 +1,3 @@ +{ + "changelog": "Changelog" +} diff --git a/packages/app/public/locales/zh/changelog.json b/packages/app/public/locales/zh/changelog.json new file mode 100644 index 00000000..eea67a52 --- /dev/null +++ b/packages/app/public/locales/zh/changelog.json @@ -0,0 +1,3 @@ +{ + "changelog": "更新日志" +} diff --git a/packages/app/src/components/Header/index.tsx b/packages/app/src/components/Header/index.tsx index 395c2f29..18a836c2 100644 --- a/packages/app/src/components/Header/index.tsx +++ b/packages/app/src/components/Header/index.tsx @@ -16,8 +16,8 @@ export const Header: FC = props => { + Changelog {/* TODO: need real links */} - Changelog Help Center Download Neuron diff --git a/packages/app/src/pages/changelog/index.module.scss b/packages/app/src/pages/changelog/index.module.scss new file mode 100644 index 00000000..8761b4a0 --- /dev/null +++ b/packages/app/src/pages/changelog/index.module.scss @@ -0,0 +1,64 @@ +.page { + .top { + display: flex; + flex-direction: column; + gap: 24px; + } +} + +.neuron { + display: flex; + gap: 12px; + align-items: center; + font-weight: 600; + font-size: 26px; + + .name { + margin-top: 6px; + } +} + +.text1 { + font-weight: 700; + font-size: 40px; +} + +.text2 { + font-size: 20px; + + & > a { + color: #00c891; + } +} + +.release { + display: flex; + gap: 40px; + margin-top: 32px; + padding-top: 48px; + border-top: 1px solid #333; + + &:first-child { + margin-top: 56px; + } + + .left { + flex-shrink: 0; + font-weight: 600; + font-size: 18px; + } + + .right { + & > :first-child { + margin-top: 0; + } + + a { + color: #00c891; + } + + img { + max-width: 100%; + } + } +} diff --git a/packages/app/src/pages/changelog/index.page.tsx b/packages/app/src/pages/changelog/index.page.tsx new file mode 100644 index 00000000..e79e838f --- /dev/null +++ b/packages/app/src/pages/changelog/index.page.tsx @@ -0,0 +1,88 @@ +import { GetStaticProps, type NextPage } from 'next' +import { useTranslation } from 'next-i18next' +import { serverSideTranslations } from 'next-i18next/serverSideTranslations' +import remarkGfm from 'remark-gfm' +import rehypeRaw from 'rehype-raw' +import rehypeSanitize from 'rehype-sanitize' +import ReactMarkdown from 'react-markdown' +import Link from 'next/link' +import Image from 'next/image' +import { ComponentProps, useMemo } from 'react' +import clsx from 'clsx' +import { Release, getReleases } from '../../utils' +import { Page } from '../../components/Page' +import styles from './index.module.scss' +import ImgNeuronLogo from './neuron-logo.png' + +interface PageProps { + releases: Release[] +} + +const Changelog: NextPage = ({ releases }) => { + const { t } = useTranslation('changelog') + + const components: ComponentProps['components'] = useMemo( + () => ({ + // Expectedly, all the links are external (content from GitHub), so there is no need to use next/image. + // eslint-disable-next-line @next/next/no-img-element + img: props => {props.alt, + }), + [], + ) + + return ( + +
+
+ Neuron Logo + Neuron +
+ +
{t('changelog')}
+ +
+ Neuron wallet new features and updates summary, join{' '} + + Github + {' '} + to learn more about the project progress. +
+
+ +
+ {/* TODO: If we were to manually parse the required content from the release here, it would be too complex and not robust, + so let's implement a simple solution for now and have the neuron team provide a file specifically for reading later. */} + {releases.map(release => ( +
+
+ {`${release.tag_name.replace('v', '')} (${release.published_at?.split('T')[0] ?? ''})`} +
+
+ + {release.body?.replace(/^#[^#]*?\(.*?\)\s+/, '') ?? ''} + +
+
+ ))} +
+
+ ) +} + +export const getStaticProps: GetStaticProps = async ({ locale = 'en' }) => { + const releases = await getReleases(10) + const lng = await serverSideTranslations(locale, ['common', 'changelog']) + + const props: PageProps = { + releases, + ...lng, + } + + return { props } +} + +export default Changelog diff --git a/packages/app/src/pages/changelog/neuron-logo.png b/packages/app/src/pages/changelog/neuron-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..10a3d09c0ce836fc42c85da3d44d31ff0b9cf41a GIT binary patch literal 16062 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