Files
web/apps/scandic-web/components/Current/Footer/index.tsx
Anton Gunnarsson cbf9e7b7c2 Merged in chore/next15 (pull request #1999)
chore (SW-834): Upgrade to Next 15

* wip: apply codemod and upgrade swc plugin

* wip: design-system to react 19, fix issues from async (search)params

* wip: fix remaining issues from codemod

serverClient is now async because context use headers()
getLang is now async because it uses headers()

* Minor cleanup

* Inline react-material-symbols package

Package is seemingly not maintained any more and doesn't support
React 19. This copies the package source into `design-system`,
makes the necessary changes for 19 and export it for others to use.

* Fix missing awaits

* Disable modal exit animations

Enabling modal exit animations via isExiting prop is causing
modals to be rendered in "hidden" state and never unmount.
Seems to be an issue with react-aria-components,
see https://github.com/adobe/react-spectrum/issues/7563.
Can probably be fixed by rewriting to a solution similar to
https://react-spectrum.adobe.com/react-aria/examples/framer-modal-sheet.html

* Remove unstable cache implementation and use in memory cache locally

* Fix ref type in SelectFilter

* Use cloneElement to add key prop to element


Approved-by: Linus Flood
2025-06-02 11:11:50 +00:00

170 lines
6.0 KiB
TypeScript

/* eslint-disable formatjs/no-literal-string-in-jsx */
import { getCurrentFooter } from "@/lib/trpc/memoizedRequests"
import Image from "@/components/Image"
import { getLang } from "@/i18n/serverContext"
import Navigation from "./Navigation"
import styles from "./footer.module.css"
export default async function Footer() {
const lang = await getLang()
const footerData = await getCurrentFooter(lang)
if (!footerData) {
return null
}
return (
<footer className={styles.container}>
<div className={styles.content}>
<h2 className={styles.contentHeading}>
<Image
alt={footerData.logoConnection.edges[0].node.title}
data-nosvgsrc="/_static/img/scandic-logotype-white.png" // what here?
height={23}
src={footerData.logoConnection.edges[0].node.url}
width={102.17}
/>
<span className={styles.hiddenAccessible}>Scandic</span>
</h2>
<ul className={styles.footerSections}>
{footerData.navigation.map((group) => (
<li className={styles.footerLink} key={group.title}>
<div className={styles.footerLinkHeader}>{group.title}</div>
</li>
))}
</ul>
<div>
<Navigation linkGroups={footerData.navigation} />
<div className={styles.contentBottom}>
<p className={styles.contentBottomTitle}>
{footerData.about.title}
</p>
<div>
<p className={styles.footerAboutText}>{footerData.about.text}</p>
<p className={styles.contentBottomTitle}>
{footerData.app_downloads.title}
</p>
<table className={styles.appDownloadTable}>
<tbody>
<tr className={styles.tableRow}>
<td
className={styles.tableData}
style={{ textAlign: "right" }}
>
<a
title="Appstore"
href={footerData.app_downloads.app_store.href}
target="_blank"
rel="noopener"
>
<Image
alt={
footerData.app_downloads.app_store.imageConnection
.edges[0].node.title
}
height={45}
src={
footerData.app_downloads.app_store.imageConnection
.edges[0].node.url
}
width={135}
/>
</a>
</td>
<td
className={styles.tableData}
style={{ textAlign: "left" }}
>
<a
title="Google Play"
href={footerData.app_downloads.google_play.href}
target="_blank"
rel="noopener"
>
<Image
alt={
footerData.app_downloads.google_play.imageConnection
.edges[0].node.title
}
height={45}
src={
footerData.app_downloads.google_play.imageConnection
.edges[0].node.url
}
width={135}
/>
</a>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div className={styles.sectionContainer}>
<h3 className={styles.sectionTitle}>
{footerData.social_media.title}
</h3>
<section className={styles.socialMediaIconsContainer}>
<a
href={footerData.social_media.facebook.href}
rel="noopener"
target="_blank"
className={styles.socialMediaIconLink}
title="Scandic on Facebook"
>
<svg
focusable="false"
className={styles.socialMediaIcon}
viewBox="0 0 150 150"
role="img"
aria-labelledby="social-icons facebook-icon"
>
<title id="facebook-icon">
{footerData.social_media.facebook.title}
</title>
<use xlinkHref="/_static/img/icons/sprites.svg#icon-facebook"></use>
</svg>
</a>
<a
href={footerData.social_media.instagram.href}
rel="noopener"
target="_blank"
className={styles.socialMediaIconLink}
title="Scandic on Instagram"
>
<svg
focusable="false"
className={styles.socialMediaIcon}
viewBox="0 0 150 150"
role="img"
aria-labelledby="social-icons instagram-icon"
>
<title id="instagram-icon">
{footerData.social_media.instagram.title}
</title>
<use xlinkHref="/_static/img/icons/sprites.svg#icon-instagram"></use>
</svg>
</a>
</section>
</div>
<div className={styles.sectionContainer}>
<h3 className={styles.sectionTitle}>
{footerData.trip_advisor.title}
</h3>
<Image
alt="Trip Advisor logotype"
height={24}
src={footerData.trip_advisor.logoConnection.edges[0].node.url}
width={160}
/>
</div>
</div>
</div>
</footer>
)
}