From 46220d34c09472cb53b8e2a377b46339bbf95e3e Mon Sep 17 00:00:00 2001 From: Sandino Scheidegger Date: Fri, 6 Dec 2024 23:07:19 +0100 Subject: [PATCH 1/9] Basic structure for a new page (sections, assets, text file) --- shared/locales/en/website-techstack.json | 23 ++++++++++++++++ .../(website)/techstack/(sections)/hero.tsx | 26 +++++++++++++++++++ .../techstack/(sections)/techlist.tsx | 18 +++++++++++++ .../[region]/(website)/techstack/page.tsx | 12 +++++++++ 4 files changed, 79 insertions(+) create mode 100644 shared/locales/en/website-techstack.json create mode 100644 website/src/app/[lang]/[region]/(website)/techstack/(sections)/hero.tsx create mode 100644 website/src/app/[lang]/[region]/(website)/techstack/(sections)/techlist.tsx create mode 100644 website/src/app/[lang]/[region]/(website)/techstack/page.tsx diff --git a/shared/locales/en/website-techstack.json b/shared/locales/en/website-techstack.json new file mode 100644 index 000000000..eb64b28b0 --- /dev/null +++ b/shared/locales/en/website-techstack.json @@ -0,0 +1,23 @@ +{ + "metadata": { + "title": "Social Income", + "description": "Our Techstack", + "og-image": "/assets/metadata/og/default.jpg", + "twitter-image": "/assets/metadata/twitter/default.jpg" + }, + "hero": { + "title-1": [ + { + "text": "Hello ", + "color": "accent" + }, + { + "text": "Hallo." + } + ], + "subtitle": "Guten Tag" + }, + "cards": { + "title-1": "Vercel" + } +} diff --git a/website/src/app/[lang]/[region]/(website)/techstack/(sections)/hero.tsx b/website/src/app/[lang]/[region]/(website)/techstack/(sections)/hero.tsx new file mode 100644 index 000000000..abc378116 --- /dev/null +++ b/website/src/app/[lang]/[region]/(website)/techstack/(sections)/hero.tsx @@ -0,0 +1,26 @@ +import { DefaultParams } from '@/app/[lang]/[region]'; +import { Translator } from '@socialincome/shared/src/utils/i18n'; +import { Typography } from '@socialincome/ui'; +import { FontColor } from '@socialincome/ui/src/interfaces/color'; + +export async function Hero({ lang }: DefaultParams) { + const translator = await Translator.getInstance({ + language: lang, + namespaces: ['website-techstack'], + }); + + return ( +
+
+ {translator.t<{ text: string; color?: FontColor }[]>('hero.title-1').map((title, index) => ( + + {title.text}{' '} + + ))} +
+ + {translator.t('hero.subtitle')} + +
+ ) +} \ No newline at end of file diff --git a/website/src/app/[lang]/[region]/(website)/techstack/(sections)/techlist.tsx b/website/src/app/[lang]/[region]/(website)/techstack/(sections)/techlist.tsx new file mode 100644 index 000000000..2d25b49a9 --- /dev/null +++ b/website/src/app/[lang]/[region]/(website)/techstack/(sections)/techlist.tsx @@ -0,0 +1,18 @@ +import { DefaultParams } from '@/app/[lang]/[region]'; +import { Translator } from '@socialincome/shared/src/utils/i18n'; +import { Typography } from '@socialincome/ui'; + +export async function TechList({ lang }: DefaultParams) { + const translator = await Translator.getInstance({ + language: lang, + namespaces: ['website-techstack'], + }); + + return ( +
+ + {translator.t('cards.title-1')} + +
+ ); +} \ No newline at end of file diff --git a/website/src/app/[lang]/[region]/(website)/techstack/page.tsx b/website/src/app/[lang]/[region]/(website)/techstack/page.tsx new file mode 100644 index 000000000..16d0e7e23 --- /dev/null +++ b/website/src/app/[lang]/[region]/(website)/techstack/page.tsx @@ -0,0 +1,12 @@ +import { DefaultPageProps } from '@/app/[lang]/[region]'; +import { Hero } from './(sections)/hero'; +import { TechList } from './(sections)/techlist'; + +export default async function Page({ params: { lang, region } }: DefaultPageProps) { + return ( +
+ + +
+ ); +} \ No newline at end of file From cd066b791e628e06ec68f4c9d640c8fb4e09b054 Mon Sep 17 00:00:00 2001 From: ssandino Date: Fri, 6 Dec 2024 22:10:54 +0000 Subject: [PATCH 2/9] Prettified Code! --- shared/locales/en/website-techstack.json | 42 +++++++++---------- .../(website)/techstack/(sections)/hero.tsx | 4 +- .../techstack/(sections)/techlist.tsx | 8 ++-- .../[region]/(website)/techstack/page.tsx | 2 +- 4 files changed, 28 insertions(+), 28 deletions(-) diff --git a/shared/locales/en/website-techstack.json b/shared/locales/en/website-techstack.json index eb64b28b0..e0ba6189d 100644 --- a/shared/locales/en/website-techstack.json +++ b/shared/locales/en/website-techstack.json @@ -1,23 +1,23 @@ { - "metadata": { - "title": "Social Income", - "description": "Our Techstack", - "og-image": "/assets/metadata/og/default.jpg", - "twitter-image": "/assets/metadata/twitter/default.jpg" - }, - "hero": { - "title-1": [ - { - "text": "Hello ", - "color": "accent" - }, - { - "text": "Hallo." - } - ], - "subtitle": "Guten Tag" - }, - "cards": { - "title-1": "Vercel" - } + "metadata": { + "title": "Social Income", + "description": "Our Techstack", + "og-image": "/assets/metadata/og/default.jpg", + "twitter-image": "/assets/metadata/twitter/default.jpg" + }, + "hero": { + "title-1": [ + { + "text": "Hello ", + "color": "accent" + }, + { + "text": "Hallo." + } + ], + "subtitle": "Guten Tag" + }, + "cards": { + "title-1": "Vercel" + } } diff --git a/website/src/app/[lang]/[region]/(website)/techstack/(sections)/hero.tsx b/website/src/app/[lang]/[region]/(website)/techstack/(sections)/hero.tsx index abc378116..42ca42031 100644 --- a/website/src/app/[lang]/[region]/(website)/techstack/(sections)/hero.tsx +++ b/website/src/app/[lang]/[region]/(website)/techstack/(sections)/hero.tsx @@ -22,5 +22,5 @@ export async function Hero({ lang }: DefaultParams) { {translator.t('hero.subtitle')} - ) -} \ No newline at end of file + ); +} diff --git a/website/src/app/[lang]/[region]/(website)/techstack/(sections)/techlist.tsx b/website/src/app/[lang]/[region]/(website)/techstack/(sections)/techlist.tsx index 2d25b49a9..5809b9d12 100644 --- a/website/src/app/[lang]/[region]/(website)/techstack/(sections)/techlist.tsx +++ b/website/src/app/[lang]/[region]/(website)/techstack/(sections)/techlist.tsx @@ -10,9 +10,9 @@ export async function TechList({ lang }: DefaultParams) { return (
- - {translator.t('cards.title-1')} - + + {translator.t('cards.title-1')} +
); -} \ No newline at end of file +} diff --git a/website/src/app/[lang]/[region]/(website)/techstack/page.tsx b/website/src/app/[lang]/[region]/(website)/techstack/page.tsx index 16d0e7e23..25527d350 100644 --- a/website/src/app/[lang]/[region]/(website)/techstack/page.tsx +++ b/website/src/app/[lang]/[region]/(website)/techstack/page.tsx @@ -9,4 +9,4 @@ export default async function Page({ params: { lang, region } }: DefaultPageProp ); -} \ No newline at end of file +} From f0abc70005759a408f87f5ec61abae93700a2d07 Mon Sep 17 00:00:00 2001 From: Lukas Vonlanthen Date: Sun, 15 Dec 2024 22:06:33 +0100 Subject: [PATCH 3/9] Add tech list --- shared/locales/en/website-techstack.json | 135 +++++++++++++++++- .../public/assets/tech/google-nonprofit.png | Bin 0 -> 29626 bytes .../techstack/(sections)/techcard.tsx | 61 ++++++++ .../techstack/(sections)/techlist.tsx | 22 ++- 4 files changed, 206 insertions(+), 12 deletions(-) create mode 100644 website/public/assets/tech/google-nonprofit.png create mode 100644 website/src/app/[lang]/[region]/(website)/techstack/(sections)/techcard.tsx diff --git a/shared/locales/en/website-techstack.json b/shared/locales/en/website-techstack.json index e0ba6189d..8f66523f4 100644 --- a/shared/locales/en/website-techstack.json +++ b/shared/locales/en/website-techstack.json @@ -8,16 +8,137 @@ "hero": { "title-1": [ { - "text": "Hello ", - "color": "accent" + "text": "To work efficiently and effectively, " }, { - "text": "Hallo." + "text": "we rely on the right tools.", + "color": "accent" } ], - "subtitle": "Guten Tag" + "subtitle": "At Social Income, donated tech and software play a crucial role in driving our mission forward." + }, + "badges": { + "donated": "Donated" }, - "cards": { - "title-1": "Vercel" - } + "cards": [ + { + "title": "Google Suite", + "description": "We use the tools to organize and communicate. Thanks to Google Nonprofit, this is free for us.", + "link": "https://www.google.com/nonprofits/", + "logo": "google-nonprofit.png", + "donated": true + }, + { + "title": "GitHub", + "description": "We use GitHub to collaborate on code; without it, maintaining an open-source approach would be difficult.", + "link": "https://socialimpact.github.com/", + "logo": "", + "donated": false + }, + { + "title": "Codemagic", + "description": "We use Codemagic to simplify app builds and reduce deployment complexity.", + "link": "https://codemagic.io/start/", + "logo": "", + "donated": false + }, + { + "title": "Linktree", + "description": "We use Linktree to keep all our social media links in one accessible place.", + "link": "https://linktr.ee/", + "logo": "", + "donated": false + }, + { + "title": "Twilio", + "description": "We use Twilio to send newsletters and transactional emails to donors, ensuring reliable communication.", + "link": "https://twilio.org/", + "logo": "", + "donated": false + }, + { + "title": "Algolia", + "description": "We use Algolia to enable fast and accurate search within our admin tool.", + "link": "https://www.algolia.com/", + "logo": "", + "donated": false + }, + { + "title": "JetBrains", + "description": "We use JetBrains to write code and review open-source contributions efficiently.", + "link": "https://www.jetbrains.com/", + "logo": "", + "donated": false + }, + { + "title": "1Password", + "description": "We use 1Password to keep our team’s credentials secure and easy to access when needed.", + "link": "https://1password.com/", + "logo": "", + "donated": false + }, + { + "title": "Mux", + "description": "We use Mux to provide fast and adaptable video experiences to website users.", + "link": "https://www.mux.com/", + "logo": "", + "donated": false + }, + { + "title": "Sentry", + "description": "We use Sentry to monitor, identify, and fix issues across all our tools, improving reliability.", + "link": "https://sentry.io/", + "logo": "", + "donated": false + }, + { + "title": "Unica77", + "description": "We use Unica77, a donated font by Lineto, to give our platform a distinctive and professional look.", + "link": "https://lineto.com/typefaces/unica77", + "logo": "", + "donated": false + }, + { + "title": "FireCMS", + "description": "We use FireCMS to manage our Firestore data and run the admin tool seamlessly.", + "link": "https://firecms.co/", + "logo": "", + "donated": false + }, + { + "title": "Storybook", + "description": "We use Storybook to maintain a consistent and cohesive design across components.", + "link": "https://storybook.js.org/", + "logo": "", + "donated": false + }, + { + "title": "Tailwind CSS", + "description": "We use Tailwind CSS to style quickly and flexibly, adapting to our evolving needs.", + "link": "https://tailwindcss.com/", + "logo": "", + "donated": false + }, + { + "title": "Shadcn", + "description": "We use Shadcn components because they offer a great balance of simplicity and versatility.", + "link": "https://ui.shadcn.com/", + "logo": "", + "donated": false + }, + { + "title": "TypeScript", + "description": "We use TypeScript to write safer and more maintainable code with fewer bugs.", + "link": "https://www.typescriptlang.org/", + "logo": "", + "donated": false + }, + { + "title": "Next.js", + "description": "We use Next.js to deploy our website as fast as possible.", + "link": "https://nextjs.org/", + "logo": "", + "donated": false + } + ] } diff --git a/website/public/assets/tech/google-nonprofit.png b/website/public/assets/tech/google-nonprofit.png new file mode 100644 index 0000000000000000000000000000000000000000..05bc203815a5306bfc11945fe6b2694d7e190823 GIT binary patch literal 29626 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 ZAnf^6F(DS2gzs + + {!!logo && ( +
+ {title} +
+ )} +
+ {donated && ( + + + {translations.badgeDonated} + + + )} + + + + {title} + + + + + {description} + +
+ + + ); +} diff --git a/website/src/app/[lang]/[region]/(website)/techstack/(sections)/techlist.tsx b/website/src/app/[lang]/[region]/(website)/techstack/(sections)/techlist.tsx index 5809b9d12..d7305ff00 100644 --- a/website/src/app/[lang]/[region]/(website)/techstack/(sections)/techlist.tsx +++ b/website/src/app/[lang]/[region]/(website)/techstack/(sections)/techlist.tsx @@ -1,6 +1,14 @@ import { DefaultParams } from '@/app/[lang]/[region]'; +import TechCard from '@/app/[lang]/[region]/(website)/techstack/(sections)/techcard'; import { Translator } from '@socialincome/shared/src/utils/i18n'; -import { Typography } from '@socialincome/ui'; + +type TechEntryJSON = { + title: string; + description: string; + link: string; + logo: string; + donated: boolean; +}; export async function TechList({ lang }: DefaultParams) { const translator = await Translator.getInstance({ @@ -8,11 +16,15 @@ export async function TechList({ lang }: DefaultParams) { namespaces: ['website-techstack'], }); + const techArray: TechEntryJSON[] = translator.t('cards'); + return ( -
- - {translator.t('cards.title-1')} - +
+
+ {techArray.map((techEntry, index) => ( + + ))} +
); } From 758f7b6dac447aa77509bb5a7841ad6aff2247e0 Mon Sep 17 00:00:00 2001 From: Lukas Vonlanthen Date: Tue, 17 Dec 2024 21:51:29 +0100 Subject: [PATCH 4/9] Add tabs to filter list by donated tech It was necessary to replace `Translator.getInstance` with `useTranslator` and add `'use client'`, otherwise there were issues with client/server components and async/await. Not sure if this is the correct way to solve this, but it seems to work. --- shared/locales/en/website-techstack.json | 4 ++ .../techstack/(sections)/techlist.tsx | 40 ++++++++++++++----- 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/shared/locales/en/website-techstack.json b/shared/locales/en/website-techstack.json index 8f66523f4..635f2d730 100644 --- a/shared/locales/en/website-techstack.json +++ b/shared/locales/en/website-techstack.json @@ -17,6 +17,10 @@ ], "subtitle": "At Social Income, donated tech and software play a crucial role in driving our mission forward." }, + "tabs": { + "tech-stack": "Tech Stack", + "donated-tech": "Donated Tech" + }, "badges": { "donated": "Donated" }, diff --git a/website/src/app/[lang]/[region]/(website)/techstack/(sections)/techlist.tsx b/website/src/app/[lang]/[region]/(website)/techstack/(sections)/techlist.tsx index d7305ff00..53c6d236c 100644 --- a/website/src/app/[lang]/[region]/(website)/techstack/(sections)/techlist.tsx +++ b/website/src/app/[lang]/[region]/(website)/techstack/(sections)/techlist.tsx @@ -1,6 +1,10 @@ +'use client'; + import { DefaultParams } from '@/app/[lang]/[region]'; import TechCard from '@/app/[lang]/[region]/(website)/techstack/(sections)/techcard'; -import { Translator } from '@socialincome/shared/src/utils/i18n'; +import { useTranslator } from '@/hooks/useTranslator'; +import { Tabs, TabsList, TabsTrigger } from '@socialincome/ui'; +import { useState } from 'react'; type TechEntryJSON = { title: string; @@ -10,20 +14,36 @@ type TechEntryJSON = { donated: boolean; }; -export async function TechList({ lang }: DefaultParams) { - const translator = await Translator.getInstance({ - language: lang, - namespaces: ['website-techstack'], - }); +export function TechList({ lang }: DefaultParams) { + const [isDonated, setIsDonated] = useState(false); + + const translator = useTranslator(lang, 'website-techstack'); + const techArray: TechEntryJSON[] | undefined = translator?.t('cards'); - const techArray: TechEntryJSON[] = translator.t('cards'); + const handleTabChange = (value: string) => { + setIsDonated(value === 'donated'); + }; return (
+
+ + + {translator?.t('tabs.tech-stack')} + {translator?.t('tabs.donated-tech')} + + +
- {techArray.map((techEntry, index) => ( - - ))} + {techArray + ?.filter((t) => !isDonated || t.donated) + .map((techEntry, index) => ( + + ))}
); From a872130bfd315e22b93a8ac7983d479fb7349746 Mon Sep 17 00:00:00 2001 From: lvonlanthen Date: Tue, 17 Dec 2024 20:55:45 +0000 Subject: [PATCH 5/9] Prettified Code! --- .../[lang]/[region]/(website)/techstack/(sections)/techcard.tsx | 2 +- .../[lang]/[region]/(website)/techstack/(sections)/techlist.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/website/src/app/[lang]/[region]/(website)/techstack/(sections)/techcard.tsx b/website/src/app/[lang]/[region]/(website)/techstack/(sections)/techcard.tsx index b561627f7..40d5fcee9 100644 --- a/website/src/app/[lang]/[region]/(website)/techstack/(sections)/techcard.tsx +++ b/website/src/app/[lang]/[region]/(website)/techstack/(sections)/techcard.tsx @@ -4,7 +4,7 @@ import Link from 'next/link'; type TechCardTranslations = { badgeDonated: string; -} +}; type TechCardProps = { title: string; diff --git a/website/src/app/[lang]/[region]/(website)/techstack/(sections)/techlist.tsx b/website/src/app/[lang]/[region]/(website)/techstack/(sections)/techlist.tsx index 53c6d236c..3b9ce0a8d 100644 --- a/website/src/app/[lang]/[region]/(website)/techstack/(sections)/techlist.tsx +++ b/website/src/app/[lang]/[region]/(website)/techstack/(sections)/techlist.tsx @@ -28,7 +28,7 @@ export function TechList({ lang }: DefaultParams) {
- + {translator?.t('tabs.tech-stack')} {translator?.t('tabs.donated-tech')} From d2c7e3fb36275ca0dfa8c03290ce89571adf1360 Mon Sep 17 00:00:00 2001 From: Lukas Vonlanthen Date: Tue, 31 Dec 2024 11:06:33 +0100 Subject: [PATCH 6/9] Add loading state for tech list During initial render or while translation is loading, the `translator` or `techArray` variables might still be null. In this case, display a loading spinner that will be replaced with the actual content once it is available. Based on https://github.com/socialincome-san/public/pull/976#discussion_r1889233562 --- .../(website)/techstack/(sections)/techlist.tsx | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/website/src/app/[lang]/[region]/(website)/techstack/(sections)/techlist.tsx b/website/src/app/[lang]/[region]/(website)/techstack/(sections)/techlist.tsx index 3b9ce0a8d..60e6f7e05 100644 --- a/website/src/app/[lang]/[region]/(website)/techstack/(sections)/techlist.tsx +++ b/website/src/app/[lang]/[region]/(website)/techstack/(sections)/techlist.tsx @@ -5,6 +5,7 @@ import TechCard from '@/app/[lang]/[region]/(website)/techstack/(sections)/techc import { useTranslator } from '@/hooks/useTranslator'; import { Tabs, TabsList, TabsTrigger } from '@socialincome/ui'; import { useState } from 'react'; +import { SpinnerIcon } from '@/components/logos/spinner-icon'; type TechEntryJSON = { title: string; @@ -24,6 +25,16 @@ export function TechList({ lang }: DefaultParams) { setIsDonated(value === 'donated'); }; + if (!translator || !techArray) { + return ( +
+
+ +
+
+ ); + } + return (
@@ -36,11 +47,11 @@ export function TechList({ lang }: DefaultParams) {
{techArray - ?.filter((t) => !isDonated || t.donated) + .filter((t) => !isDonated || t.donated) .map((techEntry, index) => ( ))} From eaf5f871d8a8c550e2f9c76417f10f86be9b14d2 Mon Sep 17 00:00:00 2001 From: Lukas Vonlanthen Date: Tue, 31 Dec 2024 11:07:37 +0100 Subject: [PATCH 7/9] Enable image optimization for better performance https://github.com/socialincome-san/public/pull/976#discussion_r1889233568 --- .../[lang]/[region]/(website)/techstack/(sections)/techcard.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/website/src/app/[lang]/[region]/(website)/techstack/(sections)/techcard.tsx b/website/src/app/[lang]/[region]/(website)/techstack/(sections)/techcard.tsx index 40d5fcee9..eba30dd07 100644 --- a/website/src/app/[lang]/[region]/(website)/techstack/(sections)/techcard.tsx +++ b/website/src/app/[lang]/[region]/(website)/techstack/(sections)/techcard.tsx @@ -32,7 +32,6 @@ export default function TechCard({ title, description, link, logo, donated, tran className="mx-auto w-1/2 rounded-sm sm:w-full" width="48" height="48" - unoptimized />
)} From 63124415a23efaa052245801a28130450f3371f0 Mon Sep 17 00:00:00 2001 From: lvonlanthen Date: Tue, 31 Dec 2024 10:10:39 +0000 Subject: [PATCH 8/9] Prettified Code! --- .../[lang]/[region]/(website)/techstack/(sections)/techlist.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/website/src/app/[lang]/[region]/(website)/techstack/(sections)/techlist.tsx b/website/src/app/[lang]/[region]/(website)/techstack/(sections)/techlist.tsx index 60e6f7e05..817f60ca7 100644 --- a/website/src/app/[lang]/[region]/(website)/techstack/(sections)/techlist.tsx +++ b/website/src/app/[lang]/[region]/(website)/techstack/(sections)/techlist.tsx @@ -2,10 +2,10 @@ import { DefaultParams } from '@/app/[lang]/[region]'; import TechCard from '@/app/[lang]/[region]/(website)/techstack/(sections)/techcard'; +import { SpinnerIcon } from '@/components/logos/spinner-icon'; import { useTranslator } from '@/hooks/useTranslator'; import { Tabs, TabsList, TabsTrigger } from '@socialincome/ui'; import { useState } from 'react'; -import { SpinnerIcon } from '@/components/logos/spinner-icon'; type TechEntryJSON = { title: string; From 3db2d98bc347e2c86e4bd7bc423a0bf886b09a28 Mon Sep 17 00:00:00 2001 From: Lukas Vonlanthen Date: Thu, 2 Jan 2025 12:13:58 +0100 Subject: [PATCH 9/9] Omit unused `region` property The property `region` is not used by the child components and does not need to be passed along. --- .../[lang]/[region]/(website)/techstack/(sections)/hero.tsx | 4 ++-- .../[region]/(website)/techstack/(sections)/techlist.tsx | 4 ++-- .../src/app/[lang]/[region]/(website)/techstack/page.tsx | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/website/src/app/[lang]/[region]/(website)/techstack/(sections)/hero.tsx b/website/src/app/[lang]/[region]/(website)/techstack/(sections)/hero.tsx index 42ca42031..06ff19076 100644 --- a/website/src/app/[lang]/[region]/(website)/techstack/(sections)/hero.tsx +++ b/website/src/app/[lang]/[region]/(website)/techstack/(sections)/hero.tsx @@ -1,9 +1,9 @@ -import { DefaultParams } from '@/app/[lang]/[region]'; +import { WebsiteLanguage } from '@/i18n'; import { Translator } from '@socialincome/shared/src/utils/i18n'; import { Typography } from '@socialincome/ui'; import { FontColor } from '@socialincome/ui/src/interfaces/color'; -export async function Hero({ lang }: DefaultParams) { +export async function Hero({ lang }: { lang: WebsiteLanguage }) { const translator = await Translator.getInstance({ language: lang, namespaces: ['website-techstack'], diff --git a/website/src/app/[lang]/[region]/(website)/techstack/(sections)/techlist.tsx b/website/src/app/[lang]/[region]/(website)/techstack/(sections)/techlist.tsx index 817f60ca7..aab21ee5e 100644 --- a/website/src/app/[lang]/[region]/(website)/techstack/(sections)/techlist.tsx +++ b/website/src/app/[lang]/[region]/(website)/techstack/(sections)/techlist.tsx @@ -1,9 +1,9 @@ 'use client'; -import { DefaultParams } from '@/app/[lang]/[region]'; import TechCard from '@/app/[lang]/[region]/(website)/techstack/(sections)/techcard'; import { SpinnerIcon } from '@/components/logos/spinner-icon'; import { useTranslator } from '@/hooks/useTranslator'; +import { WebsiteLanguage } from '@/i18n'; import { Tabs, TabsList, TabsTrigger } from '@socialincome/ui'; import { useState } from 'react'; @@ -15,7 +15,7 @@ type TechEntryJSON = { donated: boolean; }; -export function TechList({ lang }: DefaultParams) { +export function TechList({ lang }: { lang: WebsiteLanguage }) { const [isDonated, setIsDonated] = useState(false); const translator = useTranslator(lang, 'website-techstack'); diff --git a/website/src/app/[lang]/[region]/(website)/techstack/page.tsx b/website/src/app/[lang]/[region]/(website)/techstack/page.tsx index 25527d350..24aadeb4b 100644 --- a/website/src/app/[lang]/[region]/(website)/techstack/page.tsx +++ b/website/src/app/[lang]/[region]/(website)/techstack/page.tsx @@ -2,11 +2,11 @@ import { DefaultPageProps } from '@/app/[lang]/[region]'; import { Hero } from './(sections)/hero'; import { TechList } from './(sections)/techlist'; -export default async function Page({ params: { lang, region } }: DefaultPageProps) { +export default async function Page({ params: { lang } }: DefaultPageProps) { return (
- - + +
); }