diff options
| author | Andrew Lee <andrew@alee14.me> | 2025-01-10 09:32:09 -0500 |
|---|---|---|
| committer | Andrew Lee <andrew@alee14.me> | 2025-01-10 09:32:09 -0500 |
| commit | 35fb56c3bf8c65506363e229fb69c76a603aee62 (patch) | |
| tree | 94d1528414e75fa072dd9a1081cc8587f6194d45 | |
| parent | 605bc321bb48a9eaf43cc272a03e59338d784610 (diff) | |
| download | alure-website-35fb56c3bf8c65506363e229fb69c76a603aee62.tar.gz alure-website-35fb56c3bf8c65506363e229fb69c76a603aee62.tar.bz2 alure-website-35fb56c3bf8c65506363e229fb69c76a603aee62.zip | |
Travel advisory, added visa page
| -rw-r--r-- | app/components/Navbar.js | 1 | ||||
| -rw-r--r-- | app/countries.json | 347 | ||||
| -rw-r--r-- | app/travel-advisory/ListCountries.js | 2 | ||||
| -rw-r--r-- | app/travel-advisory/countries.json | 292 | ||||
| -rw-r--r-- | app/visas/HistoryModal.js | 40 | ||||
| -rw-r--r-- | app/visas/ListCountries.js | 51 | ||||
| -rw-r--r-- | app/visas/page.js | 16 |
7 files changed, 456 insertions, 293 deletions
diff --git a/app/components/Navbar.js b/app/components/Navbar.js index da99375..a4a97f3 100644 --- a/app/components/Navbar.js +++ b/app/components/Navbar.js @@ -29,6 +29,7 @@ const Navbar = () => { ['Updates', '/updates'], ['Services', '/services'], ['Travel Advisory', '/travel-advisory'], + ['Visas', '/visas'], ['Immigration', '/immigration'], ].map(([title, url]) => ( <li key="links"> diff --git a/app/countries.json b/app/countries.json new file mode 100644 index 0000000..6dae982 --- /dev/null +++ b/app/countries.json @@ -0,0 +1,347 @@ +{ + "countries": [ + { + "name": "Anatoli", + "short": "ANT", + "url": "anatoli", + "visa": false, + "visaInfo": [], + "image": "/countries/anatoli.webp", + "danger": 0, + "settlements": [], + "history": [] + }, + { + "name": "Auckland", + "short": "AAB", + "url": "auckland", + "visa": true, + "visaInfo": [], + "image": "/countries/auckland.webp", + "danger": 0, + "settlements": [], + "history": [] + }, + { + "name": "The Aura Regions", + "short": "ARA", + "url": "auraregions", + "visa": false, + "visaInfo": [], + "image": "/countries/auraregions.webp", + "danger": 0, + "settlements": [], + "history": [] + }, + { + "name": "Banatown", + "short": "BAT", + "url": "banatown", + "visa": true, + "visaInfo": [], + "image": "/countries/banatown.webp", + "danger": 0, + "settlements": [], + "history": [] + }, + { + "name": "Country Warp", + "short": "COW", + "url": "countrywarp", + "visa": true, + "visaInfo": [], + "image": "/countries/countrywarp.webp", + "danger": 0, + "settlements": [], + "history": [] + }, + { + "name": "Cypress", + "short": "CYP", + "url": "cypress", + "visa": true, + "visaInfo": [], + "image": "/countries/cypress.webp", + "danger": 0, + "settlements": [], + "history": [] + }, + { + "name": "The Federation of Doodads and Gizmos", + "short": "FDG", + "url": "doodadsandgizmos", + "visa": true, + "visaInfo": [], + "image": "/countries/doodadsandgizmos.webp", + "danger": 0, + "settlements": [], + "history": [] + }, + { + "name": "Eagle City", + "short": "EGL", + "url": "eaglecity", + "visa": true, + "visaInfo": [], + "image": "/countries/eaglecity.webp", + "danger": 0, + "settlements": [], + "history": [] + }, + { + "name": "Fegal", + "short": "FGL", + "url": "fegal", + "visa": false, + "visaInfo": [], + "image": "/countries/fegal.webp", + "danger": 0, + "settlements": [], + "history": [] + }, + { + "name": "Halcandra", + "short": "HAL", + "url": "halcandra", + "visa": true, + "visaInfo": [], + "image": "/countries/halcandra.webp", + "danger": 0, + "settlements": [], + "history": [] + }, + { + "name": "Inkytown", + "short": "INK", + "url": "inkytown", + "visa": false, + "visaInfo": [], + "image": "/countries/inkytown.webp", + "danger": 0, + "settlements": [], + "history": [] + }, + { + "name": "The Kemonomimi Republic", + "short": "KRP", + "url": "kemonomimi-republic", + "visa": false, + "visaInfo": [], + "image": "/countries/kemonomimi.webp", + "danger": 0, + "settlements": [], + "history": [] + }, + { + "name": "The Knowle Regions", + "short": "KWL", + "url": "knowle-regions", + "visa": true, + "visaInfo": [], + "image": "/countries/knowleregions.webp", + "danger": 0, + "settlements": [], + "history": [] + }, + { + "name": "landrepeatland", + "short": "LRL", + "url": "landrepeatland", + "visa": true, + "visaInfo": [], + "image": "/countries/landrepeatland.webp", + "danger": 0, + "settlements": [], + "history": [] + }, + { + "name": "Lion Land", + "short": "LLI", + "url": "lionland", + "visa": false, + "visaInfo": [], + "image": "/countries/lionland.webp", + "danger": 0, + "settlements": [], + "history": [] + }, + { + "name": "Mart's Extraordinarily Sublime State", + "short": "MES", + "url": "mess", + "visa": false, + "visaInfo": [], + "image": "/countries/mess.webp", + "danger": 0, + "settlements": [], + "history": [] + }, + { + "name": "Mojave", + "short": "MOJ", + "url": "mojave", + "visa": false, + "visaInfo": [], + "image": "/countries/mojave.webp", + "danger": 0, + "settlements": [], + "history": [] + }, + { + "name": "The Open Republic", + "short": "ORP", + "url": "open-republic", + "visa": false, + "visaInfo": [], + "image": "/countries/openrepublic.webp", + "danger": 0, + "settlements": [], + "history": [] + }, + { + "name": "Ownage", + "short": "OWN", + "url": "ownage", + "visa": true, + "visaInfo": [], + "image": "/countries/ownage.webp", + "danger": 0, + "settlements": [], + "history": [] + }, + { + "name": "PLC", + "short": "PLC", + "url": "plc", + "visa": true, + "visaInfo": [], + "image": "/countries/plc.webp", + "danger": 0, + "settlements": [], + "history": [] + }, + { + "name": "Plutonia Imperium", + "short": "PLI", + "url": "plutonia-imperium", + "visa": true, + "visaInfo": [], + "image": "/countries/plutoniaimperium.webp", + "danger": 0, + "settlements": [], + "history": [] + }, + { + "name": "The Republic of Québec", + "short": "ROQ", + "url": "republic-of-quebec", + "visa": true, + "visaInfo": [], + "image": "/countries/quebec.webp", + "danger": 0, + "settlements": [], + "history": [] + }, + { + "name": "Solstan Federation", + "short": "SFR", + "url": "solstice", + "visa": true, + "visaInfo": [ + "January 10th 2025: Solstice citizens will be required to have a visa to enter the Alure Regions. In addition, they will need a second form of ID and all ePassport+ gates will be disabled for Solstice citizens." + ], + "image": "/countries/solstice.webp", + "danger": 0, + "settlements": [], + "history": [] + }, + { + "name": "Sulópolis", + "short": "SLP", + "url": "sulopolis", + "visa": false, + "visaInfo": [], + "image": "/countries/sulopolis.webp", + "danger": 0, + "settlements": [], + "history": [] + }, + { + "name": "Summasol", + "short": "SMS", + "url": "summasol", + "visa": true, + "visaInfo": [], + "image": "/countries/summasol.webp", + "danger": 0, + "settlements": [], + "history": [] + }, + { + "name": "TAY", + "short": "TAY", + "url": "tay", + "visa": false, + "visaInfo": [], + "image": "/countries/tay.webp", + "danger": 0, + "settlements": [], + "history": [] + }, + { + "name": "Union of Soviet Sovereign Republics", + "short": "SUN", + "url": "ussr", + "visa": true, + "visaInfo": [], + "image": "/countries/ussr.webp", + "danger": 0, + "settlements": [], + "history": [] + }, + { + "name": "Veronian Controlled Territories", + "short": "VCT", + "url": "veronian-controlled-territories", + "visa": true, + "visaInfo": [], + "image": "/countries/vct.webp", + "danger": 0, + "settlements": [], + "history": [] + }, + { + "name": "Vyxalla", + "short": "VYX", + "url": "vyxalla", + "visa": true, + "visaInfo": [], + "image": "/countries/vyxalla.webp", + "danger": 0, + "settlements": [], + "history": [] + }, + { + "name": "The Republic of Whale City", + "short": "WCI", + "url": "whale-city", + "visa": false, + "visaInfo": [], + "image": "/countries/whalecity.webp", + "danger": 0, + "settlements": [], + "history": [] + }, + { + "name": "The Republic of Yavno", + "short": "YNO", + "url": "yavno", + "visa": false, + "visaInfo": [], + "image": "/countries/yavno.webp", + "danger": 0, + "settlements": [], + "history": [] + } + ] +} diff --git a/app/travel-advisory/ListCountries.js b/app/travel-advisory/ListCountries.js index 8229e8c..865d657 100644 --- a/app/travel-advisory/ListCountries.js +++ b/app/travel-advisory/ListCountries.js @@ -1,5 +1,5 @@ "use client" -import countriesData from '@/app/travel-advisory/countries.json' assert { type: 'json' }; +import countriesData from '@/app/countries.json' assert { type: 'json' }; import HistoryModal from "@/app/travel-advisory/HistoryModal"; import { useState } from "react"; diff --git a/app/travel-advisory/countries.json b/app/travel-advisory/countries.json deleted file mode 100644 index e59033e..0000000 --- a/app/travel-advisory/countries.json +++ /dev/null @@ -1,292 +0,0 @@ -{ - "countries": [ - { - "name": "Anatoli", - "short": "ANT", - "url": "anatoli", - "danger": 0, - "image": "/countries/anatoli.webp", - "settlements": [], - "history": [] - }, - { - "name": "Auckland", - "short": "AAB", - "url": "auckland", - "danger": 0, - "image": "/countries/auckland.webp", - "settlements": [], - "history": [] - }, - { - "name": "The Aura Regions", - "short": "ARA", - "url": "auraregions", - "danger": 0, - "image": "/countries/auraregions.webp", - "settlements": [], - "history": [] - }, - { - "name": "Banatown", - "short": "BAT", - "url": "banatown", - "danger": 0, - "image": "/countries/banatown.webp", - "settlements": [], - "history": [] - }, - { - "name": "Country Warp", - "short": "COW", - "url": "countrywarp", - "danger": 0, - "image": "/countries/countrywarp.webp", - "settlements": [], - "history": [] - }, - { - "name": "Cypress", - "short": "CYP", - "url": "cypress", - "danger": 0, - "image": "/countries/cypress.webp", - "settlements": [], - "history": [] - }, - { - "name": "The Federation of Doodads and Gizmos", - "short": "FDG", - "url": "doodadsandgizmos", - "danger": 0, - "image": "/countries/doodadsandgizmos.webp", - "settlements": [], - "history": [] - }, - { - "name": "Eagle City", - "short": "EGL", - "url": "eaglecity", - "danger": 0, - "image": "/countries/eaglecity.webp", - "settlements": [], - "history": [] - }, - { - "name": "Fegal", - "short": "FGL", - "url": "fegal", - "danger": 0, - "image": "/countries/fegal.webp", - "settlements": [], - "history": [] - }, - { - "name": "Halcandra", - "short": "HAL", - "url": "halcandra", - "danger": 0, - "image": "/countries/halcandra.webp", - "settlements": [], - "history": [] - }, - { - "name": "Inkytown", - "short": "INK", - "url": "inkytown", - "danger": 0, - "image": "/countries/inkytown.webp", - "settlements": [], - "history": [] - }, - { - "name": "The Kemonomimi Republic", - "short": "KRP", - "url": "kemonomimi-republic", - "danger": 0, - "image": "/countries/kemonomimi.webp", - "settlements": [], - "history": [] - }, - { - "name": "The Knowle Regions", - "short": "KWL", - "url": "knowle-regions", - "danger": 0, - "image": "/countries/knowleregions.webp", - "settlements": [], - "history": [] - }, - { - "name": "landrepeatland", - "short": "LRL", - "url": "landrepeatland", - "danger": 0, - "image": "/countries/landrepeatland.webp", - "settlements": [], - "history": [] - }, - { - "name": "Lion Land", - "short": "LLI", - "url": "lionland", - "danger": 0, - "image": "/countries/lionland.webp", - "settlements": [], - "history": [] - }, - { - "name": "Mart's Extraordinarily Sublime State", - "short": "MES", - "url": "mess", - "danger": 0, - "image": "/countries/mess.webp", - "settlements": [], - "history": [] - }, - { - "name": "Mojave", - "short": "MOJ", - "url": "mojave", - "danger": 0, - "image": "/countries/mojave.webp", - "settlements": [], - "history": [] - }, - { - "name": "The Open Republic", - "short": "ORP", - "url": "open-republic", - "danger": 0, - "image": "/countries/openrepublic.webp", - "settlements": [], - "history": [] - }, - { - "name": "Ownage", - "short": "OWN", - "url": "ownage", - "danger": 0, - "image": "/countries/ownage.webp", - "settlements": [], - "history": [] - }, - { - "name": "PLC", - "short": "PLC", - "url": "plc", - "danger": 0, - "image": "/countries/plc.webp", - "settlements": [], - "history": [] - }, - { - "name": "Plutonia Imperium", - "short": "PLI", - "url": "plutonia-imperium", - "danger": 0, - "image": "/countries/plutoniaimperium.webp", - "settlements": [], - "history": [] - }, - { - "name": "The Republic of Québec", - "short": "ROQ", - "url": "republic-of-quebec", - "danger": 0, - "image": "/countries/quebec.webp", - "settlements": [], - "history": [] - }, - { - "name": "Solstan Federation", - "short": "SFR", - "url": "solstice", - "danger": 0, - "image": "/countries/solstice.webp", - "settlements": [ - { - "name": "Firefly", - "danger": 2 - } - - - ], - "history": [ - "Nov 17, 2024: Violent protest at the capital of the Solstan Federation" - ] - }, - { - "name": "Sulópolis", - "short": "SLP", - "url": "sulopolis", - "danger": 0, - "image": "/countries/sulopolis.webp", - "settlements": [], - "history": [] - }, - { - "name": "Summasol", - "short": "SMS", - "url": "summasol", - "danger": 0, - "image": "/countries/summasol.webp", - "settlements": [], - "history": [] - }, - { - "name": "TAY", - "short": "TAY", - "url": "tay", - "danger": 0, - "image": "/countries/tay.webp", - "settlements": [], - "history": [] - }, - { - "name": "Union of Soviet Sovereign Republics", - "short": "SUN", - "url": "ussr", - "danger": 0, - "image": "/countries/ussr.webp", - "settlements": [], - "history": [] - }, - { - "name": "Veronian Controlled Territories", - "short": "VCT", - "url": "veronian-controlled-territories", - "danger": 0, - "image": "/countries/vct.webp", - "settlements": [], - "history": [] - }, - { - "name": "Vyxalla", - "short": "VYX", - "url": "vyxalla", - "danger": 0, - "image": "/countries/vyxalla.webp", - "settlements": [], - "history": [] - }, - { - "name": "The Republic of Whale City", - "short": "WCI", - "url": "whale-city", - "danger": 0, - "image": "/countries/whalecity.webp", - "settlements": [], - "history": [] - }, - { - "name": "The Republic of Yavno", - "short": "YNO", - "url": "yavno", - "danger": 0, - "image": "/countries/yavno.webp", - "settlements": [], - "history": [] - } - ] -} diff --git a/app/visas/HistoryModal.js b/app/visas/HistoryModal.js new file mode 100644 index 0000000..6d4df91 --- /dev/null +++ b/app/visas/HistoryModal.js @@ -0,0 +1,40 @@ +const HistoryModal = ({ isVisible, onClose, countries, dangerLevel, visaInfo }) => { + if (!isVisible) return null; + const handleClose = (e) => { + if(e.target.id === 'wrapper') onClose(); + } + + let historyList; + if (visaInfo && visaInfo.length > 0) { + historyList = visaInfo.map((event, index) => { + return ( + <li key={index}>{event}</li> + ) + }) + } else { + historyList = <li>No additional information for {countries}.</li>; + } + + return ( + <div id="wrapper" className="fixed inset-0 bg bg-opacity-25 backdrop-blur-sm flex justify-center items-center" onClick={handleClose}> + <div className="w-[700px]"> + <div className="flex flex-col"> + <div className="bg-zinc-800 p-5 rounded-lg border border-gray-700"> + <div className="divide-y space-y-3"> + <div> + <h1 className="font-medium text-3xl">{countries}</h1> + <h2 className="font-medium text-xl">{dangerLevel}</h2> + </div> + <div> + <h1 className="font-medium text-2xl pt-3">Additional Information</h1> + <ul>{historyList}</ul> + </div> + </div> + </div> + </div> + </div> + </div> + ) +} + +export default HistoryModal; diff --git a/app/visas/ListCountries.js b/app/visas/ListCountries.js new file mode 100644 index 0000000..6ca1863 --- /dev/null +++ b/app/visas/ListCountries.js @@ -0,0 +1,51 @@ +"use client" +import countriesData from '@/app/countries.json' assert { type: 'json' }; +import HistoryModal from "@/app/visas/HistoryModal"; +import { useState } from "react"; + +export function getDangerLevel(danger, override) { + if (danger === 0 && override !== undefined) { + danger = override; + } + + let dangerLevel; + switch (danger) { + case false: + dangerLevel = "Visa not required" + break; + case true: + dangerLevel = "Visa required" + break; + } + + return dangerLevel; +} + +export function Countries(){ + // eslint-disable-next-line react-hooks/rules-of-hooks + const [showModal, setShowModal] = useState(false); + const [selectedCountry, setSelectedCountry] = useState(null); + const [selectedDangerLevel, setSelectedDangerLevel] = useState(null); + const [selectedCountryHistory, setSelectedCountryHistory] = useState(null); + const countries = countriesData.countries; + + return countries.map((country) => { + let dangerLevel = getDangerLevel(country.visa); + + return ( + <div key={country.name} id={country.url} className="bg-center bg-no-repeat bg-[image:var(--image-url)] bg-gray-500 bg-blend-multiply" style={{'--image-url': `url(${country.image})`}} > + <div className="sm:px-40 px-10 py-10 space-y-3"> + <h1 className="font-medium md:text-5xl text-3xl">{country.name}</h1> + <h2 className="text-lg">{dangerLevel}</h2> + <button className="transition duration-200 ease-in-out px-4 py-2 font-medium rounded-full bg-blue-600 hover:bg-blue-700 active:bg-blue-800" onClick={()=> { + setSelectedCountry(country.name); + setSelectedDangerLevel(dangerLevel) + setSelectedCountryHistory(country.visaInfo) + setShowModal(true) + }}>Information</button> + </div> + <HistoryModal isVisible={showModal} onClose={() => setShowModal(false)} countries={selectedCountry} dangerLevel={selectedDangerLevel} visaInfo={selectedCountryHistory} /> + </div> + ) + }) +} diff --git a/app/visas/page.js b/app/visas/page.js new file mode 100644 index 0000000..eb5ba3c --- /dev/null +++ b/app/visas/page.js @@ -0,0 +1,16 @@ +import { Countries } from "./ListCountries"; +import Header from "../components/Header"; + +export const metadata = { + title: 'Visas', + description: 'Information whether a country is required a visa or not. ', +} + +export default async function TravelAdvisory(){ + return ( + <main className="flex flex-col"> + <Header title={metadata.title} description={metadata.description} /> + <Countries /> + </main> + ) +} |
