1
0
Fork 0
mirror of https://github.com/seanmorley15/AdventureLog.git synced 2025-07-30 18:29:37 +02:00

Update AdventureCard component to include regionId and visited properties, and add country flag support

This commit is contained in:
Sean Morley 2024-04-14 20:33:58 +00:00
parent 715a4ffd87
commit a550fd58f7
10 changed files with 548 additions and 1 deletions

View file

@ -0,0 +1 @@
ALTER TABLE "worldTravelCountryRegions" ADD COLUMN "info" json;

View file

@ -0,0 +1,391 @@
{
"id": "91692e84-91ec-4411-ad9d-7b8b14f67dda",
"prevId": "4c095e1a-9f13-4899-aa83-f56864191f51",
"version": "5",
"dialect": "pg",
"tables": {
"featuredAdventures": {
"name": "featuredAdventures",
"schema": "",
"columns": {
"id": {
"name": "id",
"type": "serial",
"primaryKey": true,
"notNull": true
},
"name": {
"name": "name",
"type": "text",
"primaryKey": false,
"notNull": true
},
"location": {
"name": "location",
"type": "text",
"primaryKey": false,
"notNull": false
}
},
"indexes": {},
"foreignKeys": {},
"compositePrimaryKeys": {},
"uniqueConstraints": {
"featuredAdventures_name_unique": {
"name": "featuredAdventures_name_unique",
"nullsNotDistinct": false,
"columns": [
"name"
]
}
}
},
"session": {
"name": "session",
"schema": "",
"columns": {
"id": {
"name": "id",
"type": "text",
"primaryKey": true,
"notNull": true
},
"user_id": {
"name": "user_id",
"type": "text",
"primaryKey": false,
"notNull": true
},
"expires_at": {
"name": "expires_at",
"type": "timestamp with time zone",
"primaryKey": false,
"notNull": true
}
},
"indexes": {},
"foreignKeys": {
"session_user_id_user_id_fk": {
"name": "session_user_id_user_id_fk",
"tableFrom": "session",
"tableTo": "user",
"columnsFrom": [
"user_id"
],
"columnsTo": [
"id"
],
"onDelete": "no action",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {}
},
"sharedAdventures": {
"name": "sharedAdventures",
"schema": "",
"columns": {
"id": {
"name": "id",
"type": "text",
"primaryKey": true,
"notNull": true
},
"data": {
"name": "data",
"type": "json",
"primaryKey": false,
"notNull": true
},
"name": {
"name": "name",
"type": "text",
"primaryKey": false,
"notNull": true
},
"date": {
"name": "date",
"type": "text",
"primaryKey": false,
"notNull": true
}
},
"indexes": {},
"foreignKeys": {},
"compositePrimaryKeys": {},
"uniqueConstraints": {}
},
"user": {
"name": "user",
"schema": "",
"columns": {
"id": {
"name": "id",
"type": "text",
"primaryKey": true,
"notNull": true
},
"username": {
"name": "username",
"type": "text",
"primaryKey": false,
"notNull": true
},
"first_name": {
"name": "first_name",
"type": "text",
"primaryKey": false,
"notNull": true
},
"last_name": {
"name": "last_name",
"type": "text",
"primaryKey": false,
"notNull": true
},
"icon": {
"name": "icon",
"type": "text",
"primaryKey": false,
"notNull": false
},
"hashed_password": {
"name": "hashed_password",
"type": "varchar",
"primaryKey": false,
"notNull": true
}
},
"indexes": {},
"foreignKeys": {},
"compositePrimaryKeys": {},
"uniqueConstraints": {}
},
"userVisitedAdventures": {
"name": "userVisitedAdventures",
"schema": "",
"columns": {
"adventure_id": {
"name": "adventure_id",
"type": "serial",
"primaryKey": true,
"notNull": true
},
"user_id": {
"name": "user_id",
"type": "text",
"primaryKey": false,
"notNull": true
},
"adventure_name": {
"name": "adventure_name",
"type": "text",
"primaryKey": false,
"notNull": true
},
"location": {
"name": "location",
"type": "text",
"primaryKey": false,
"notNull": false
},
"visited_date": {
"name": "visited_date",
"type": "text",
"primaryKey": false,
"notNull": false
}
},
"indexes": {},
"foreignKeys": {
"userVisitedAdventures_user_id_user_id_fk": {
"name": "userVisitedAdventures_user_id_user_id_fk",
"tableFrom": "userVisitedAdventures",
"tableTo": "user",
"columnsFrom": [
"user_id"
],
"columnsTo": [
"id"
],
"onDelete": "no action",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {}
},
"userVisitedWorldTravel": {
"name": "userVisitedWorldTravel",
"schema": "",
"columns": {
"id": {
"name": "id",
"type": "serial",
"primaryKey": true,
"notNull": true
},
"country_code": {
"name": "country_code",
"type": "text",
"primaryKey": false,
"notNull": true
},
"user_id": {
"name": "user_id",
"type": "text",
"primaryKey": false,
"notNull": true
},
"region_id": {
"name": "region_id",
"type": "varchar",
"primaryKey": false,
"notNull": true
}
},
"indexes": {},
"foreignKeys": {
"userVisitedWorldTravel_country_code_worldTravelCountries_country_code_fk": {
"name": "userVisitedWorldTravel_country_code_worldTravelCountries_country_code_fk",
"tableFrom": "userVisitedWorldTravel",
"tableTo": "worldTravelCountries",
"columnsFrom": [
"country_code"
],
"columnsTo": [
"country_code"
],
"onDelete": "no action",
"onUpdate": "no action"
},
"userVisitedWorldTravel_user_id_user_id_fk": {
"name": "userVisitedWorldTravel_user_id_user_id_fk",
"tableFrom": "userVisitedWorldTravel",
"tableTo": "user",
"columnsFrom": [
"user_id"
],
"columnsTo": [
"id"
],
"onDelete": "no action",
"onUpdate": "no action"
},
"userVisitedWorldTravel_region_id_worldTravelCountryRegions_id_fk": {
"name": "userVisitedWorldTravel_region_id_worldTravelCountryRegions_id_fk",
"tableFrom": "userVisitedWorldTravel",
"tableTo": "worldTravelCountryRegions",
"columnsFrom": [
"region_id"
],
"columnsTo": [
"id"
],
"onDelete": "no action",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {}
},
"worldTravelCountries": {
"name": "worldTravelCountries",
"schema": "",
"columns": {
"id": {
"name": "id",
"type": "serial",
"primaryKey": true,
"notNull": true
},
"name": {
"name": "name",
"type": "text",
"primaryKey": false,
"notNull": true
},
"country_code": {
"name": "country_code",
"type": "text",
"primaryKey": false,
"notNull": true
},
"continent": {
"name": "continent",
"type": "text",
"primaryKey": false,
"notNull": true
}
},
"indexes": {},
"foreignKeys": {},
"compositePrimaryKeys": {},
"uniqueConstraints": {
"worldTravelCountries_country_code_unique": {
"name": "worldTravelCountries_country_code_unique",
"nullsNotDistinct": false,
"columns": [
"country_code"
]
}
}
},
"worldTravelCountryRegions": {
"name": "worldTravelCountryRegions",
"schema": "",
"columns": {
"id": {
"name": "id",
"type": "varchar",
"primaryKey": true,
"notNull": true
},
"name": {
"name": "name",
"type": "text",
"primaryKey": false,
"notNull": true
},
"country_code": {
"name": "country_code",
"type": "text",
"primaryKey": false,
"notNull": true
},
"info": {
"name": "info",
"type": "json",
"primaryKey": false,
"notNull": false
}
},
"indexes": {},
"foreignKeys": {
"worldTravelCountryRegions_country_code_worldTravelCountries_country_code_fk": {
"name": "worldTravelCountryRegions_country_code_worldTravelCountries_country_code_fk",
"tableFrom": "worldTravelCountryRegions",
"tableTo": "worldTravelCountries",
"columnsFrom": [
"country_code"
],
"columnsTo": [
"country_code"
],
"onDelete": "no action",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {}
}
},
"enums": {},
"schemas": {},
"_meta": {
"columns": {},
"schemas": {},
"tables": {}
}
}

View file

@ -15,6 +15,13 @@
"when": 1713050481064,
"tag": "0001_closed_wendell_vaughn",
"breakpoints": true
},
{
"idx": 2,
"version": "5",
"when": 1713125110816,
"tag": "0002_far_mephistopheles",
"breakpoints": true
}
]
}

View file

@ -1,6 +1,58 @@
INSERT INTO "worldTravelCountryRegions" (id, name, country_code)
VALUES
('US-AL', 'Alabama', 'us'),
('US-AL', 'Alabama', 'us', '{
"name": "Alabama",
"abbreviation": "AL",
"description": "Alabama is a state located in the southeastern region of the United States. Known for its rich history, including its role in the American Civil War and the Civil Rights Movement, Alabama offers a diverse landscape of mountains, plains, and coastal areas. The state boasts a humid subtropical climate and is known for its strong tradition in college sports, particularly football. Alabama's economy is diverse, with major industries including automotive manufacturing, agriculture, and aerospace. Tourists are drawn to Alabama's natural beauty, historical sites, and cultural landmarks.",
"capital": "Montgomery",
"largest_city": "Birmingham",
"area": {
"total": 52420,
"units": "square miles"
},
"population": {
"estimate": 4903185,
"year": 2020
},
"state_flower": "Camellia",
"state_bird": "Yellowhammer",
"state_tree": "Southern Longleaf Pine",
"climate": {
"description": "Humid subtropical",
"summer_highs": "80-90°F",
"winter_lows": "30-50°F",
"precipitation": "Abundant throughout the year"
},
"economy": {
"industries": [
"Automotive Manufacturing",
"Agriculture",
"Mining",
"Technology",
"Aerospace"
],
"agricultural_products": [
"Poultry",
"Cotton",
"Peanuts",
"Soybeans",
"Corn"
]
},
"tourism": {
"attractions": [
"U.S. Space & Rocket Center",
"Gulf Shores and Orange Beach",
"Rosa Parks Museum",
"Civil Rights Institute",
"Little River Canyon National Preserve"
]
},
"major_sports_teams": [
"Alabama Crimson Tide (NCAA)",
"Auburn Tigers (NCAA)"
]
}'),
('US-AK', 'Alaska', 'us'),
('US-AZ', 'Arizona', 'us'),
('US-AR', 'Arkansas', 'us'),

View file

@ -2,6 +2,7 @@
import { createEventDispatcher } from "svelte";
import locationDot from "$lib/assets/locationDot.svg";
import calendar from "$lib/assets/calendar.svg";
import { goto } from "$app/navigation";
const dispatch = createEventDispatcher();
export let type: String;
@ -12,6 +13,7 @@
export let id: Number | undefined = undefined;
export let regionId: String | undefined = undefined;
export let visited: Boolean | undefined = undefined;
export let countryCode: String | undefined = undefined;
function remove() {
dispatch("remove", id);
@ -30,6 +32,10 @@
dispatch("removeVisit", regionId);
visited = false;
}
function moreInfo() {
goto(`/worldtravel/${countryCode}/${regionId}`);
}
</script>
{#if type === "mylog"}
@ -122,6 +128,7 @@
<h2 class="card-title overflow-ellipsis">{name}</h2>
<p>{regionId}</p>
<div class="card-actions justify-end">
<button class="btn btn-info" on:click={moreInfo}>More Info</button>
{#if !visited}
<button class="btn btn-primary" on:click={markVisited}
>Mark Visited</button

View file

@ -66,6 +66,7 @@ export const worldTravelCountryRegions = pgTable("worldTravelCountryRegions", {
country_code: text("country_code")
.notNull()
.references(() => worldTravelCountries.country_code),
info: json("info"),
});
export const userVisitedWorldTravel = pgTable("userVisitedWorldTravel", {

View file

@ -4,3 +4,36 @@ export interface Adventure {
location: string;
created: string;
}
export interface RegionInfo {
name: string;
abbreviation: string;
description: string;
capital: string;
largest_city: string;
area: {
total: number;
units: string;
};
population: {
estimate: number;
year: number;
};
state_flower: string;
state_bird: string;
state_tree: string;
climate: {
description: string;
summer_highs: string;
winter_lows: string;
precipitation: string;
};
economy: {
industries: string[];
agricultural_products: string[];
};
tourism: {
attractions: string[];
};
major_sports_teams: string[];
};

View file

@ -89,6 +89,7 @@
{#each data.regions as region (region.id)}
<AdventureCard
type="worldtravelregion"
countryCode={data.countrycode}
regionId={region.id}
name={region.name}
on:markVisited={markVisited}

View file

@ -0,0 +1,34 @@
import { db } from '$lib/db/db.server.js';
import { userVisitedWorldTravel, worldTravelCountryRegions } from '$lib/db/schema.js';
import { and, eq } from 'drizzle-orm';
import type { PageServerLoad } from './$types';
import InfoModal from '$lib/components/InfoModal.svelte';
export const load: PageServerLoad = async ({ params, locals }) => {
const { regioncode } = params;
let info = await db
.select({data: worldTravelCountryRegions})
.from(worldTravelCountryRegions)
.where(eq(worldTravelCountryRegions.id, regioncode))
.limit(1)
.execute();
let visited = false;
if (locals.user) {
let userVisited = await db
.select({data: userVisitedWorldTravel})
.from(userVisitedWorldTravel)
.where(and(eq(userVisitedWorldTravel.userId, locals.user.id), eq(userVisitedWorldTravel.region_id, regioncode)))
.limit(1)
.execute();
if (userVisited.length !== 0) {
visited = true;
}
}
return {
info : info[0],
visited : visited,
};
}

View file

@ -0,0 +1,20 @@
<script lang="ts">
import { countryCodeToName } from "$lib";
import type { RegionInfo } from "$lib/utils/types.js";
export let data;
let info = data.info.data.info as RegionInfo;
let country = countryCodeToName(data.info.data.country_code);
let regionName = data.info.data.name;
let visited = data.visited;
</script>
<h1>Info About {regionName} in {country}</h1>
{#if visited}
<p>You have visited this region!</p>
{/if}
<h2>Region Info</h2>
{#if info.description}
<p>{info.description}</p>
{/if}