From 962567dbbf715c3967cb313402c33199d54e3efe Mon Sep 17 00:00:00 2001 From: darthmaim Date: Tue, 10 Dec 2024 12:52:04 +0100 Subject: [PATCH 01/10] Add Wizard's Vault page for wintersday --- .../[language]/festival/wintersday/layout.tsx | 1 + .../wintersday/wizards-vault/page.tsx | 64 +++++++++++++++++++ .../WizardsVaultObjective.module.css | 4 ++ .../WizardsVault/WizardsVaultObjective.tsx | 4 +- apps/web/translations/en.json | 5 +- 5 files changed, 75 insertions(+), 3 deletions(-) create mode 100644 apps/web/app/[language]/festival/wintersday/wizards-vault/page.tsx diff --git a/apps/web/app/[language]/festival/wintersday/layout.tsx b/apps/web/app/[language]/festival/wintersday/layout.tsx index 103d005b3..50f81b643 100644 --- a/apps/web/app/[language]/festival/wintersday/layout.tsx +++ b/apps/web/app/[language]/festival/wintersday/layout.tsx @@ -21,6 +21,7 @@ export default function WintersdayLayout({ children }: LayoutProps) { { segment: 'achievements', label: }, { segment: 'skins', label: }, { segment: 'minis', label: }, + { segment: 'wizards-vault', label: }, ]}/> )} > diff --git a/apps/web/app/[language]/festival/wintersday/wizards-vault/page.tsx b/apps/web/app/[language]/festival/wintersday/wizards-vault/page.tsx new file mode 100644 index 000000000..5be6a9f9b --- /dev/null +++ b/apps/web/app/[language]/festival/wintersday/wizards-vault/page.tsx @@ -0,0 +1,64 @@ +import { Gw2Accounts } from '@/components/Gw2Api/Gw2Accounts'; +import { Trans } from '@/components/I18n/Trans'; +import { PageLayout } from '@/components/Layout/PageLayout'; +import { cache } from '@/lib/cache'; +import { db } from '@/lib/prisma'; +import type { Metadata } from 'next'; +import { requiredScopes } from '../helper'; +import { pageView } from '@/lib/pageView'; +import Link from 'next/link'; +import { WizardsVaultObjective } from '@/components/WizardsVault/WizardsVaultObjective'; +import type { PageProps } from '@/lib/next'; +import { getTranslate } from '@/lib/translate'; +import { Icon } from '@gw2treasures/ui'; +import { Notice } from '@gw2treasures/ui/components/Notice/Notice'; + +const objectiveIds: number[] = [ + // TODO: add objective ids +]; + +const loadData = cache(async function loadData() { + const [objectives] = await Promise.all([ + db.wizardsVaultObjective.findMany({ + where: { OR: [{ id: { in: objectiveIds }}, { name_en: { startsWith: '(Festival)' }, removedFromApi: false }] }, + }) + ]); + + return { objectives }; +}, ['wintersday-wizards-vault-objectives'], { revalidate: 60 * 5 }); + + +export default async function WintersdayAchievementsPage({ params }: PageProps) { + const { language } = await params; + const { objectives } = await loadData(); + await pageView('festival/wintersday/wizwards-vault'); + + return ( + + } authorizationMessage={}/> + +

+ + {objectives.length > 0 ? objectives.map((objective) => ( + + )) : ( + No Wizard's Vault objectives for wintersday are available in the Guild Wars 2 API yet. + )} + +

+ {' '} + Visit the Wizard's Vault page to view all your active Wizard's Vault objectives. +

+ +
+ ); +} + +export async function generateMetadata({ params }: PageProps): Promise { + const { language } = await params; + const t = getTranslate(language); + + return { + title: t('navigation.wizardsVault') + } +} diff --git a/apps/web/components/WizardsVault/WizardsVaultObjective.module.css b/apps/web/components/WizardsVault/WizardsVaultObjective.module.css index 07a515b20..4e102aaac 100644 --- a/apps/web/components/WizardsVault/WizardsVaultObjective.module.css +++ b/apps/web/components/WizardsVault/WizardsVaultObjective.module.css @@ -1,3 +1,7 @@ +.wrapper + .wrapper { + margin-top: 64px; +} + .objective { background-color: var(--color-background-light); border: 1px solid var(--color-border-dark); diff --git a/apps/web/components/WizardsVault/WizardsVaultObjective.tsx b/apps/web/components/WizardsVault/WizardsVaultObjective.tsx index dae608445..fb03a3d21 100644 --- a/apps/web/components/WizardsVault/WizardsVaultObjective.tsx +++ b/apps/web/components/WizardsVault/WizardsVaultObjective.tsx @@ -13,7 +13,7 @@ interface WizardsVaultObjectiveProps { export const WizardsVaultObjective: FC = ({ objective, language }) => { return ( - <> +
{localizedName(objective, language)} @@ -23,6 +23,6 @@ export const WizardsVaultObjective: FC = ({ objectiv
- +
); }; diff --git a/apps/web/translations/en.json b/apps/web/translations/en.json index 76f6a21a8..53e2ff37a 100644 --- a/apps/web/translations/en.json +++ b/apps/web/translations/en.json @@ -317,5 +317,8 @@ "festival.wintersday.minis": "Minis", "festival.wintersday.minis.description": "These minis are only available during wintersday.", "festival.wintersday.minis.authorize": "You need to authorize gw2treasures.com to be able to see your accounts mini unlocks.", - "festival.wintersday.minis.login": "You need to login to be able to see your accounts mini unlocks." + "festival.wintersday.minis.login": "You need to login to be able to see your accounts mini unlocks.", + "festival.wintersday.wizards-vault.description": "These are all the Wizard's Vault objectives only active during Wintersday.", + "festival.wintersday.wizards-vault.authorize": "You need to authorize gw2treasures.com to be able to see your accounts Wizard's Vault progress.", + "festival.wintersday.wizards-vault.login": "You need to login to be able to see your accounts Wizard's Vault progress." } From d60474f1de2d15ac35c3086e07c40f3750b11285 Mon Sep 17 00:00:00 2001 From: darthmaim Date: Tue, 10 Dec 2024 12:52:14 +0100 Subject: [PATCH 02/10] Translate wintersday page titles --- .../festival/wintersday/achievements/page.tsx | 13 ++++++++++--- .../[language]/festival/wintersday/minis/page.tsx | 13 ++++++++++--- .../[language]/festival/wintersday/skins/page.tsx | 13 ++++++++++--- 3 files changed, 30 insertions(+), 9 deletions(-) diff --git a/apps/web/app/[language]/festival/wintersday/achievements/page.tsx b/apps/web/app/[language]/festival/wintersday/achievements/page.tsx index 3505ed8cd..d966ec52b 100644 --- a/apps/web/app/[language]/festival/wintersday/achievements/page.tsx +++ b/apps/web/app/[language]/festival/wintersday/achievements/page.tsx @@ -13,6 +13,7 @@ import { Notice } from '@gw2treasures/ui/components/Notice/Notice'; import type { Metadata } from 'next'; import { requiredScopes } from '../helper'; import { pageView } from '@/lib/pageView'; +import { getTranslate } from '@/lib/translate'; const achievementIds = [ 5005, @@ -89,6 +90,12 @@ export default async function WintersdayAchievementsPage({ params }: PageProps) ); } -export const metadata: Metadata = { - title: 'Achievements' -}; +export async function generateMetadata({ params }: PageProps): Promise { + const { language } = await params; + const t = getTranslate(language); + + return { + title: t('navigation.achievements') + } +} + diff --git a/apps/web/app/[language]/festival/wintersday/minis/page.tsx b/apps/web/app/[language]/festival/wintersday/minis/page.tsx index d0a50c890..731a4a645 100644 --- a/apps/web/app/[language]/festival/wintersday/minis/page.tsx +++ b/apps/web/app/[language]/festival/wintersday/minis/page.tsx @@ -8,6 +8,8 @@ import { db } from '@/lib/prisma'; import type { Metadata } from 'next'; import { requiredScopes } from '../helper'; import { pageView } from '@/lib/pageView'; +import { getTranslate } from '@/lib/translate'; +import type { PageProps } from '@/lib/next'; const miniIds = [ 115, // Mini Princess Doll @@ -76,6 +78,11 @@ export default async function WintersdayAchievementsPage() { ); } -export const metadata: Metadata = { - title: 'Minis' -}; +export async function generateMetadata({ params }: PageProps): Promise { + const { language } = await params; + const t = getTranslate(language); + + return { + title: t('festival.wintersday.minis') + } +} diff --git a/apps/web/app/[language]/festival/wintersday/skins/page.tsx b/apps/web/app/[language]/festival/wintersday/skins/page.tsx index 776df9014..00ceb963f 100644 --- a/apps/web/app/[language]/festival/wintersday/skins/page.tsx +++ b/apps/web/app/[language]/festival/wintersday/skins/page.tsx @@ -8,6 +8,8 @@ import { db } from '@/lib/prisma'; import type { Metadata } from 'next'; import { requiredScopes } from '../helper'; import { pageView } from '@/lib/pageView'; +import type { PageProps } from '@/lib/next'; +import { getTranslate } from '@/lib/translate'; const skinIds = [ // weapons @@ -103,6 +105,11 @@ export default async function WintersdayAchievementsPage() { ); } -export const metadata: Metadata = { - title: 'Skins' -}; +export async function generateMetadata({ params }: PageProps): Promise { + const { language } = await params; + const t = getTranslate(language); + + return { + title: t('navigation.skins') + } +} From f3f223e1c3ccd2fd5742dfb3feab740be3c471d9 Mon Sep 17 00:00:00 2001 From: darthmaim Date: Tue, 10 Dec 2024 13:23:04 +0100 Subject: [PATCH 03/10] Add common classes to `@gw2treasures/ui` --- packages/ui/common.module.css | 3 +++ packages/ui/index.ts | 3 +++ packages/ui/package.json | 1 + packages/ui/tsconfig.json | 1 + 4 files changed, 8 insertions(+) create mode 100644 packages/ui/common.module.css diff --git a/packages/ui/common.module.css b/packages/ui/common.module.css new file mode 100644 index 000000000..101ddcf4c --- /dev/null +++ b/packages/ui/common.module.css @@ -0,0 +1,3 @@ +.nowrap { + white-space: nowrap; +} diff --git a/packages/ui/index.ts b/packages/ui/index.ts index 9fb20bbf5..55f7f0760 100644 --- a/packages/ui/index.ts +++ b/packages/ui/index.ts @@ -5,3 +5,6 @@ export * from './icons'; // lib export * from './lib'; + +import commonStyles from './common.module.css'; +export { commonStyles }; diff --git a/packages/ui/package.json b/packages/ui/package.json index 744b271a4..63b68b93d 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -12,6 +12,7 @@ "icons/", "lib/", "reset.module.css", + "common.module.css", "index.ts", "types.d.ts", "tsconfig.json", diff --git a/packages/ui/tsconfig.json b/packages/ui/tsconfig.json index 0eecfe634..092f92dbf 100644 --- a/packages/ui/tsconfig.json +++ b/packages/ui/tsconfig.json @@ -4,6 +4,7 @@ "next-env.d.ts", "**/*.ts", "**/*.tsx", + "**/*.module.css", ".next/types/**/*.ts" ], } From 50b9593f023115a81ad6c81fe96bfda29030628f Mon Sep 17 00:00:00 2001 From: darthmaim Date: Tue, 10 Dec 2024 13:23:25 +0100 Subject: [PATCH 04/10] Make sure account names don't wrap --- apps/web/components/Gw2Api/Gw2AccountName.tsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/web/components/Gw2Api/Gw2AccountName.tsx b/apps/web/components/Gw2Api/Gw2AccountName.tsx index 0d97c18b8..fec7d2ab2 100644 --- a/apps/web/components/Gw2Api/Gw2AccountName.tsx +++ b/apps/web/components/Gw2Api/Gw2AccountName.tsx @@ -1,6 +1,7 @@ import type { FC } from 'react'; import type { Gw2Account } from './types'; import { Tip } from '@gw2treasures/ui/components/Tip/Tip'; +import commonStyles from '@gw2treasures/ui/common.module.css'; interface Gw2AccountNameProps { account: Gw2Account; @@ -10,16 +11,16 @@ interface Gw2AccountNameProps { export const Gw2AccountName: FC = ({ account, long }) => { // if the account does not have a displayName, always just return the name if(!account.displayName) { - return account.name; + return {account.name}; } if(long) { - return `${account.displayName} (${account.name})`; + return {account.displayName} ({account.name}); } return ( - {account.displayName} + {account.displayName} ); }; From 8ef7b9bd6d4eb9b6d146b0bbc5e4de0ac358a5c8 Mon Sep 17 00:00:00 2001 From: darthmaim Date: Tue, 10 Dec 2024 13:24:13 +0100 Subject: [PATCH 05/10] Change account name column in `ItemInventoryTable` to small This ensures that the account name column has the same width if multiple tables are used on a single page --- apps/web/components/Item/ItemInventoryTable.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/components/Item/ItemInventoryTable.tsx b/apps/web/components/Item/ItemInventoryTable.tsx index 04a0620ba..f60439096 100644 --- a/apps/web/components/Item/ItemInventoryTable.tsx +++ b/apps/web/components/Item/ItemInventoryTable.tsx @@ -39,7 +39,7 @@ export const ItemInventoryTable: FC = ({ itemId }) => { - Account + AccountLocationCount From 8451dfe4babdbb9b015cd1e1f2b9f9a91dbdab02 Mon Sep 17 00:00:00 2001 From: darthmaim Date: Tue, 10 Dec 2024 13:25:10 +0100 Subject: [PATCH 06/10] Allow `ReactNode` as children of `Gw2Account` component Sometimes the component is just used for the notifications and the children fetches the accounts itself. --- apps/web/components/Gw2Api/Gw2Accounts.tsx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/apps/web/components/Gw2Api/Gw2Accounts.tsx b/apps/web/components/Gw2Api/Gw2Accounts.tsx index 813a4679a..23ccbc860 100644 --- a/apps/web/components/Gw2Api/Gw2Accounts.tsx +++ b/apps/web/components/Gw2Api/Gw2Accounts.tsx @@ -11,7 +11,7 @@ import { useUser } from '../User/use-user'; import { Gw2AccountLoginNotice } from './Gw2AccountLoginNotice'; export interface Gw2AccountsProps { - children?: (accounts: Gw2Account[], scopes: Scope[]) => ReactElement; + children?: ((accounts: Gw2Account[], scopes: Scope[]) => ReactElement) | ReactNode; requiredScopes: Scope[]; optionalScopes?: Scope[]; options?: GetAccountsOptions; @@ -58,5 +58,9 @@ const Gw2AccountsInternal: FC = ({ children, requiredScopes, o ); } - return children?.(accounts.accounts, accounts.scopes); + if(typeof children === 'function') { + return children?.(accounts.accounts, accounts.scopes); + } + + return children; }; From 413e2dd60170c1747dfe733ac297f3139b5d29ff Mon Sep 17 00:00:00 2001 From: darthmaim Date: Tue, 10 Dec 2024 13:25:32 +0100 Subject: [PATCH 07/10] Add item inventories to wintersday page --- .../festival/wintersday/(index)/page.tsx | 30 +++++++++++++++++++ apps/web/translations/en.json | 2 ++ 2 files changed, 32 insertions(+) diff --git a/apps/web/app/[language]/festival/wintersday/(index)/page.tsx b/apps/web/app/[language]/festival/wintersday/(index)/page.tsx index ab3b5d84e..0a847eb89 100644 --- a/apps/web/app/[language]/festival/wintersday/(index)/page.tsx +++ b/apps/web/app/[language]/festival/wintersday/(index)/page.tsx @@ -1,4 +1,6 @@ +import { Gw2Accounts } from '@/components/Gw2Api/Gw2Accounts'; import { Trans } from '@/components/I18n/Trans'; +import { ItemInventoryTable } from '@/components/Item/ItemInventoryTable'; import { ItemTable } from '@/components/ItemTable/ItemTable'; import { ItemTableColumnsButton } from '@/components/ItemTable/ItemTableColumnsButton'; import { ItemTableContext } from '@/components/ItemTable/ItemTableContext'; @@ -6,6 +8,11 @@ import { PageLayout } from '@/components/Layout/PageLayout'; import { pageView } from '@/lib/pageView'; import { Headline } from '@gw2treasures/ui/components/Headline/Headline'; import type { Metadata } from 'next'; +import { requiredScopes } from '../helper'; +import { db } from '@/lib/prisma'; +import { linkProperties } from '@/lib/linkProperties'; +import { cache } from '@/lib/cache'; +import { ItemLink } from '@/components/Item/ItemLink'; const itemIds = [ 86601, @@ -13,7 +20,20 @@ const itemIds = [ 77604, ]; +const loadData = cache(async function loadData() { + const [items] = await Promise.all([ + db.item.findMany({ + where: { id: { in: itemIds }}, + select: linkProperties + }) + ]); + + return { items }; +}, ['wintersday-items'], { revalidate: 60 * 60 }); + + export default async function WintersdayPage() { + const { items } = await loadData(); await pageView('festival/wintersday'); return ( @@ -23,6 +43,16 @@ export default async function WintersdayPage() { } id="items"> + + } authorizationMessage={}> + {items.map((item) => ( + <> + + + + ))} + + ); } diff --git a/apps/web/translations/en.json b/apps/web/translations/en.json index 53e2ff37a..d69d2cc53 100644 --- a/apps/web/translations/en.json +++ b/apps/web/translations/en.json @@ -308,6 +308,8 @@ "fractal.volcanic": "Volcanic", "festival.wintersday": "Wintersday", "festival.wintersday.description": "Bells are ringing, snowballs are flying, and Toymaster Tixx’s fantastic golem-shaped airship is hovering over Divinity’s Reach—the traditional Tyrian celebration of Wintersday is here again!", + "festival.wintersday.items.authorize": "You need to authorize gw2treasures.com to be able to see your accounts inventories.", + "festival.wintersday.items.login": "You need to login to be able to see your accounts inventories.", "festival.wintersday.achievements.description": "These achievements are only available during wintersday.", "festival.wintersday.achievements.authorize": "You need to authorize gw2treasures.com to be able to see your accounts achievement progress.", "festival.wintersday.achievements.login": "You need to login to be able to see your accounts achievement progress.", From 666d25fb6890338583b3ac600ac70c699454f3f7 Mon Sep 17 00:00:00 2001 From: darthmaim Date: Tue, 10 Dec 2024 13:35:55 +0100 Subject: [PATCH 08/10] Update wintersday description --- .../festival/wintersday/(index)/page.tsx | 16 +++++++++++++--- apps/web/translations/en.json | 3 ++- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/apps/web/app/[language]/festival/wintersday/(index)/page.tsx b/apps/web/app/[language]/festival/wintersday/(index)/page.tsx index 0a847eb89..3710ef83d 100644 --- a/apps/web/app/[language]/festival/wintersday/(index)/page.tsx +++ b/apps/web/app/[language]/festival/wintersday/(index)/page.tsx @@ -13,6 +13,8 @@ import { db } from '@/lib/prisma'; import { linkProperties } from '@/lib/linkProperties'; import { cache } from '@/lib/cache'; import { ItemLink } from '@/components/Item/ItemLink'; +import type { PageProps } from '@/lib/next'; +import { getTranslate } from '@/lib/translate'; const itemIds = [ 86601, @@ -39,6 +41,7 @@ export default async function WintersdayPage() { return ( +

} id="items"> @@ -57,6 +60,13 @@ export default async function WintersdayPage() { ); } -export const metadata: Metadata = { - title: 'Wintersday' -}; +export async function generateMetadata({ params }: PageProps): Promise { + const { language } = await params; + const t = getTranslate(language); + + return { + title: { + absolute: `${t('festival.wintersday')} · gw2treasures.com` + } + } +} diff --git a/apps/web/translations/en.json b/apps/web/translations/en.json index d69d2cc53..8aa310d08 100644 --- a/apps/web/translations/en.json +++ b/apps/web/translations/en.json @@ -307,7 +307,8 @@ "fractal.urban_battleground": "Urban Battleground", "fractal.volcanic": "Volcanic", "festival.wintersday": "Wintersday", - "festival.wintersday.description": "Bells are ringing, snowballs are flying, and Toymaster Tixx’s fantastic golem-shaped airship is hovering over Divinity’s Reach—the traditional Tyrian celebration of Wintersday is here again!", + "festival.wintersday.intro": "Bells are ringing, snowballs are flying, and Toymaster Tixx’s fantastic golem-shaped airship is hovering over Divinity’s Reach—the traditional Tyrian celebration of Wintersday is here again!", + "festival.wintersday.description": "Keep track of your progress on all your accounts during Wintersday on gw2treasures.com.", "festival.wintersday.items.authorize": "You need to authorize gw2treasures.com to be able to see your accounts inventories.", "festival.wintersday.items.login": "You need to login to be able to see your accounts inventories.", "festival.wintersday.achievements.description": "These achievements are only available during wintersday.", From 2a8ab7b01b821a15701f070beafeaa8ee4859109 Mon Sep 17 00:00:00 2001 From: darthmaim Date: Tue, 10 Dec 2024 13:42:10 +0100 Subject: [PATCH 09/10] Add german translations --- apps/web/app/[language]/festival/wintersday/layout.tsx | 2 +- apps/web/translations/de.json | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/apps/web/app/[language]/festival/wintersday/layout.tsx b/apps/web/app/[language]/festival/wintersday/layout.tsx index 50f81b643..dbeaa9f60 100644 --- a/apps/web/app/[language]/festival/wintersday/layout.tsx +++ b/apps/web/app/[language]/festival/wintersday/layout.tsx @@ -14,7 +14,7 @@ const endsAt = new Date('2025-01-02T17:00:00.000Z'); export default function WintersdayLayout({ children }: LayoutProps) { return ( - Time remaining: }>Wintersday)} skipLayout + Time remaining: }>)} skipLayout navBar={( }, diff --git a/apps/web/translations/de.json b/apps/web/translations/de.json index f5b671eaa..99b14797d 100644 --- a/apps/web/translations/de.json +++ b/apps/web/translations/de.json @@ -295,5 +295,13 @@ "fractal.uncategorized": "Nicht kategorisiert", "fractal.underground_facility": "Untergrundeinrichtung", "fractal.urban_battleground": "Urbanes Schlachtfeld", - "fractal.volcanic": "Vulkanisches Fraktal" + "fractal.volcanic": "Vulkanisches Fraktal", + "festival.wintersday": "Wintertag", + "festival.wintersday.intro": "Die Glocken klingen, Schneebälle fliegen und das fantastische Golem-Luftschiff von Spielzeugmacher Tixx macht Halt über Götterfels – in Tyria wird einmal mehr das traditionelle Wintertag-Fest gefeiert.", + "festival.wintersday.description": "Verfolge während des Wintertags deine Fortschritte auf allen deinen Konten auf gw2treasures.com.", + "festival.wintersday.achievements.description": "Diese Erfolge sind nur während des Wintertags verfügbar.", + "festival.wintersday.skins.description": "Diese Skins sind nur während des Wintertags verfügbar.", + "festival.wintersday.minis": "Miniaturen", + "festival.wintersday.minis.description": "Diese Miniaturen sind nur während des Wintertags verfügbar.", + "festival.wintersday.wizards-vault.description": "Diese Aufgaben im Gewölbe des Zauberers sind nur während dest Wintertags verfügbar." } From 696896597686a0ae1e8a1a0cdf525c72e2723a6f Mon Sep 17 00:00:00 2001 From: darthmaim Date: Tue, 10 Dec 2024 13:47:23 +0100 Subject: [PATCH 10/10] Fix lint issues --- .../app/[language]/festival/wintersday/(index)/page.tsx | 7 ++++--- .../[language]/festival/wintersday/achievements/page.tsx | 2 +- apps/web/app/[language]/festival/wintersday/minis/page.tsx | 2 +- apps/web/app/[language]/festival/wintersday/skins/page.tsx | 2 +- .../[language]/festival/wintersday/wizards-vault/page.tsx | 6 +++--- 5 files changed, 10 insertions(+), 9 deletions(-) diff --git a/apps/web/app/[language]/festival/wintersday/(index)/page.tsx b/apps/web/app/[language]/festival/wintersday/(index)/page.tsx index 3710ef83d..2e64f7b04 100644 --- a/apps/web/app/[language]/festival/wintersday/(index)/page.tsx +++ b/apps/web/app/[language]/festival/wintersday/(index)/page.tsx @@ -15,6 +15,7 @@ import { cache } from '@/lib/cache'; import { ItemLink } from '@/components/Item/ItemLink'; import type { PageProps } from '@/lib/next'; import { getTranslate } from '@/lib/translate'; +import { Fragment } from 'react'; const itemIds = [ 86601, @@ -49,10 +50,10 @@ export default async function WintersdayPage() { } authorizationMessage={}> {items.map((item) => ( - <> + - + ))} @@ -68,5 +69,5 @@ export async function generateMetadata({ params }: PageProps): Promise title: { absolute: `${t('festival.wintersday')} · gw2treasures.com` } - } + }; } diff --git a/apps/web/app/[language]/festival/wintersday/achievements/page.tsx b/apps/web/app/[language]/festival/wintersday/achievements/page.tsx index d966ec52b..7b8c1c736 100644 --- a/apps/web/app/[language]/festival/wintersday/achievements/page.tsx +++ b/apps/web/app/[language]/festival/wintersday/achievements/page.tsx @@ -96,6 +96,6 @@ export async function generateMetadata({ params }: PageProps): Promise return { title: t('navigation.achievements') - } + }; } diff --git a/apps/web/app/[language]/festival/wintersday/minis/page.tsx b/apps/web/app/[language]/festival/wintersday/minis/page.tsx index 731a4a645..ac3b508d2 100644 --- a/apps/web/app/[language]/festival/wintersday/minis/page.tsx +++ b/apps/web/app/[language]/festival/wintersday/minis/page.tsx @@ -84,5 +84,5 @@ export async function generateMetadata({ params }: PageProps): Promise return { title: t('festival.wintersday.minis') - } + }; } diff --git a/apps/web/app/[language]/festival/wintersday/skins/page.tsx b/apps/web/app/[language]/festival/wintersday/skins/page.tsx index 00ceb963f..060c9841d 100644 --- a/apps/web/app/[language]/festival/wintersday/skins/page.tsx +++ b/apps/web/app/[language]/festival/wintersday/skins/page.tsx @@ -111,5 +111,5 @@ export async function generateMetadata({ params }: PageProps): Promise return { title: t('navigation.skins') - } + }; } diff --git a/apps/web/app/[language]/festival/wintersday/wizards-vault/page.tsx b/apps/web/app/[language]/festival/wintersday/wizards-vault/page.tsx index 5be6a9f9b..86d8aac68 100644 --- a/apps/web/app/[language]/festival/wintersday/wizards-vault/page.tsx +++ b/apps/web/app/[language]/festival/wintersday/wizards-vault/page.tsx @@ -40,9 +40,9 @@ export default async function WintersdayAchievementsPage({ params }: PageProps)

{objectives.length > 0 ? objectives.map((objective) => ( - + )) : ( - No Wizard's Vault objectives for wintersday are available in the Guild Wars 2 API yet. + No Wizard's Vault objectives for wintersday are available in the Guild Wars 2 API yet. )}

@@ -60,5 +60,5 @@ export async function generateMetadata({ params }: PageProps): Promise return { title: t('navigation.wizardsVault') - } + }; }