From 734ee2a8e4af51d986b8ffcd55251b7179f43440 Mon Sep 17 00:00:00 2001 From: ttmx Date: Wed, 3 Apr 2024 11:52:23 +0000 Subject: [PATCH] Planner page --- .../[locale]/(frontend)/planner/loading.js | 9 ++++ .../(frontend)/planner/opengraph-image.js | 40 ++++++++++++++ .../app/[locale]/(frontend)/planner/page.js | 40 ++++++++++++++ .../FrontendPlanner/FrontendPlanner.js | 14 +++++ .../FrontendPlannerVideo.js | 52 +++++++++++++++++++ .../FrontendPlannerVideo.module.css | 15 ++++++ nextjs/translations/pt.json | 5 ++ 7 files changed, 175 insertions(+) create mode 100644 nextjs/app/[locale]/(frontend)/planner/loading.js create mode 100644 nextjs/app/[locale]/(frontend)/planner/opengraph-image.js create mode 100644 nextjs/app/[locale]/(frontend)/planner/page.js create mode 100644 nextjs/components/FrontendPlanner/FrontendPlanner.js create mode 100644 nextjs/components/FrontendPlannerVideo/FrontendPlannerVideo.js create mode 100644 nextjs/components/FrontendPlannerVideo/FrontendPlannerVideo.module.css diff --git a/nextjs/app/[locale]/(frontend)/planner/loading.js b/nextjs/app/[locale]/(frontend)/planner/loading.js new file mode 100644 index 00000000..86f07c74 --- /dev/null +++ b/nextjs/app/[locale]/(frontend)/planner/loading.js @@ -0,0 +1,9 @@ +/* * */ + +import Loader from '@/components/Loader/Loader'; + +/* * */ + +export default function Loading() { + return ; +} diff --git a/nextjs/app/[locale]/(frontend)/planner/opengraph-image.js b/nextjs/app/[locale]/(frontend)/planner/opengraph-image.js new file mode 100644 index 00000000..b2b71b27 --- /dev/null +++ b/nextjs/app/[locale]/(frontend)/planner/opengraph-image.js @@ -0,0 +1,40 @@ +/* * */ + +import fs from 'fs'; +import { ImageResponse } from 'next/og'; +import OpenGraphDefault from 'opengraph/OpenGraphDefault'; +import OpenGraphLinesDefault from 'opengraph/OpenGraphLinesDefault'; +import OpenGraphLinesDynamic from 'opengraph/OpenGraphLinesDynamic'; + +/* * */ + +export const alt = 'Perguntas frequentes'; +export const size = { width: 1200, height: 630 }; +export const contentType = 'image/png'; + +/* * */ + +export default async function Image({ params }) { + // + + // + // A. Setup fonts + + const customFonts = [ + { name: 'Inter', style: 'normal', weight: 500, data: fs.readFileSync(`${process.cwd()}/assets/fonts/Inter-Medium.ttf`).buffer }, + { name: 'Inter', style: 'normal', weight: 600, data: fs.readFileSync(`${process.cwd()}/assets/fonts/Inter-SemiBold.ttf`).buffer }, + { name: 'Inter', style: 'normal', weight: 700, data: fs.readFileSync(`${process.cwd()}/assets/fonts/Inter-Bold.ttf`).buffer }, + ]; + + // + // B. Fetch data + + // const lineData = await fetch(params.line_id?.length && `https://api.carrismetropolitana.pt/lines/${params.line_id}`).then((res) => res.json()); + + // + // D. Render dynamic component + + return new ImageResponse(, { ...size, fonts: customFonts }); + + // +} diff --git a/nextjs/app/[locale]/(frontend)/planner/page.js b/nextjs/app/[locale]/(frontend)/planner/page.js new file mode 100644 index 00000000..ff8f1ba6 --- /dev/null +++ b/nextjs/app/[locale]/(frontend)/planner/page.js @@ -0,0 +1,40 @@ +/* * */ + +import { OneFullColumn } from '@/components/Layouts/Layouts'; +import FrontendPlanner from '@/components/FrontendPlanner/FrontendPlanner'; + +/* * */ + +export async function generateMetadata({ params }) { + // + + // A. Fetch line data + + // B. Render the titles + switch (params.locale) { + case 'pt': + return { title: 'Perguntas frequentes', description: 'Esclareça as dúvidas frequentes' }; + default: + case 'en': + return { title: 'Frequently asked questions', description: 'Clarify your frequently asked questions' }; + } + + // +} + +/* * */ + +export default function Page({ params }) { + // + + // + // A. Render components + + return ( + + + + ); + + // +} diff --git a/nextjs/components/FrontendPlanner/FrontendPlanner.js b/nextjs/components/FrontendPlanner/FrontendPlanner.js new file mode 100644 index 00000000..b887d009 --- /dev/null +++ b/nextjs/components/FrontendPlanner/FrontendPlanner.js @@ -0,0 +1,14 @@ +import { getTranslations } from "next-intl/server"; +import Panel from "../Panel/Panel"; +import FrontendPlannerVideo from "../FrontendPlannerVideo/FrontendPlannerVideo"; + +export default async function FrontendPlanner({}){ + + let t = await getTranslations('FrontendPlanner'); + return ( + }> + + + ) +} + diff --git a/nextjs/components/FrontendPlannerVideo/FrontendPlannerVideo.js b/nextjs/components/FrontendPlannerVideo/FrontendPlannerVideo.js new file mode 100644 index 00000000..128bfbdc --- /dev/null +++ b/nextjs/components/FrontendPlannerVideo/FrontendPlannerVideo.js @@ -0,0 +1,52 @@ +"use client" + +/* * */ + +import { Modal, Button, ActionIcon } from "@mantine/core"; +import { useDisclosure } from "@mantine/hooks"; +import { IconX } from "@tabler/icons-react"; +import { useTranslations } from "next-intl"; +import styles from './FrontendPlannerVideo.module.css'; + +/* * */ + +export default function FrontendPlannerVideo() { + // + + // + // A. Setup variables + + const [opened, { open, close }] = useDisclosure(false); + const t = useTranslations("FrontendPlanner"); + + console.log(styles) + // + // B. Render components + + return ( + <> + + + + +

{t('how_to_use')}

+ + + +
+ + + +
+
+ + + + ); + + // +} + diff --git a/nextjs/components/FrontendPlannerVideo/FrontendPlannerVideo.module.css b/nextjs/components/FrontendPlannerVideo/FrontendPlannerVideo.module.css new file mode 100644 index 00000000..ba4d6885 --- /dev/null +++ b/nextjs/components/FrontendPlannerVideo/FrontendPlannerVideo.module.css @@ -0,0 +1,15 @@ +.modalHeader { + background-color: black; + color: white; +} + +.modalBody { + display: flex; + flex-direction: column; + background-color: black; +} + +.iframe { + width: 100%; + aspect-ratio: 16/9; +} \ No newline at end of file diff --git a/nextjs/translations/pt.json b/nextjs/translations/pt.json index 19da1a48..537d8dcd 100644 --- a/nextjs/translations/pt.json +++ b/nextjs/translations/pt.json @@ -1008,5 +1008,10 @@ }, "FrontendAlert": { "period": "Período" + }, + "FrontendPlanner": { + "Panel_title": "Planeador de viagens", + "open": "Saiba como usar", + "how_to_use": "Como usar o planeador" } } \ No newline at end of file