diff --git a/src/App.tsx b/src/App.tsx index b16f189..91df51a 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -56,7 +56,9 @@ export default function App() {
- {/* TODO - shows.map((show)=>{ return })*/} + {shows.map((show) => { + return ; + })}
diff --git a/src/components/showCard/ShowCard.tsx b/src/components/showCard/ShowCard.tsx index 7e18a47..4ce44d5 100644 --- a/src/components/showCard/ShowCard.tsx +++ b/src/components/showCard/ShowCard.tsx @@ -1,72 +1,48 @@ -import { useState } from "react"; - -export interface ShowCardProps { - artist: string; - stage: string; - day: string; - hour: string; - ticketsLeft: number; - image: string; -} - -export default function ShowCard( - /* TODO 1: Accept props with ShowCardProps type here */ -) { - // TODO 2: Create state called isInterested of type boolean (default false) - // const [isInterested, setIsInterested] = ... - - // TODO 3: Function that toggles true/false in isInterested - // function handleToggleInterested() {} - - // TODO 4: Create ticketsStatusText (string): - // 0 → "SOLD OUT" - // 1–30 → "Last tickets – hurry up!" - // >30 → "Tickets available" - - // TODO 5: Create text for interest status based on isInterested: - // false → "You haven't added this show yet" - // true → "This show is in your interested list 🎟️" +import { getArtistPrefix, getInterestedButtonText } from "../../utils/showCardUtils"; +import {getInterestedStatusText,getTicketsStatusText} from "../../utils/showCardUtils"; +import type { Show } from "../../interfaces/show"; +import { useInterested } from "../../hooks/useInterested"; + +export default function ShowCard({ + artist, + stage, + day, + hour, + ticketsLeft, + image, +}: Show) { + + const { isInterested, toggleInterested } = useInterested(); + + const ticketsStatusText = getTicketsStatusText(ticketsLeft); + const interestedText = getInterestedStatusText(isInterested); + const artistPrefix = getArtistPrefix(isInterested); + const buttonText = getInterestedButtonText(isInterested); return (
- {/* TODO 6: Replace placeholder with real from props */} - {/* {artist} */} -
Image goes here
+ {artist}

- {/* TODO 7: If isInterested → show ⭐ before artist name */} - "Artist name here" + {artistPrefix} + {artist}

- {/* TODO 8: Display stage, day, hour from props */} - "Stage · Day · Hour" + {stage} · {day} · {hour}

-

- {/* TODO 9: Display the ticketsStatusText */} - "Tickets status text" -

+

{ticketsStatusText}

-

- {/* TODO 10: Display the interestedText */} - "Interested status text" -

+

{interestedText}

-
); diff --git a/src/constants/showCardConstants.ts b/src/constants/showCardConstants.ts new file mode 100644 index 0000000..f52aedd --- /dev/null +++ b/src/constants/showCardConstants.ts @@ -0,0 +1,21 @@ +export const SHOW_CARD_CONSTANTS = { + SOLD_OUT: "SOLD OUT", + LAST_TICKETS: "Last tickets – hurry up!", + TICKETS_AVAILABLE: "Tickets available", + YOUR_INTERESTED_LIST: "This show is in your interested list 🎟️", + NO_ADDED_SHOW: "You haven't added this show yet", +} as const; + +export const SHOW_CARD_LIMITS = { + SOLD_OUT: 0, + LAST_TICKETS_THRESHOLD: 30, +} as const; + +export const SHOW_CARD_BUTTON_TEXT = { + REMOVE: "Remove from my list", + ADD: "Mark as interested", +} as const; + +export const SHOW_CARD_UI = { + INTERESTED_ICON: "⭐ ", +} as const; diff --git a/src/hooks/useInterested.ts b/src/hooks/useInterested.ts new file mode 100644 index 0000000..6e02765 --- /dev/null +++ b/src/hooks/useInterested.ts @@ -0,0 +1,14 @@ +import { useState } from "react"; + +export function useInterested() { + const [isInterested, setIsInterested] = useState(false); + + function toggleInterested() { + setIsInterested((prev) => !prev); + } + + return { + isInterested, + toggleInterested, + }; +} diff --git a/src/interfaces/show.ts b/src/interfaces/show.ts new file mode 100644 index 0000000..2aa51df --- /dev/null +++ b/src/interfaces/show.ts @@ -0,0 +1,8 @@ +export interface Show { + artist: string; + stage: string; + day: string; + hour: string; + ticketsLeft: number; + image: string; +} \ No newline at end of file diff --git a/src/utils/showCardUtils.ts b/src/utils/showCardUtils.ts new file mode 100644 index 0000000..488fe77 --- /dev/null +++ b/src/utils/showCardUtils.ts @@ -0,0 +1,33 @@ +import { + SHOW_CARD_BUTTON_TEXT, + SHOW_CARD_CONSTANTS, + SHOW_CARD_LIMITS, + SHOW_CARD_UI, +} from "../constants/showCardConstants"; + +export function getTicketsStatusText(ticketsLeft: number): string { + if (ticketsLeft === SHOW_CARD_LIMITS.SOLD_OUT) { + return SHOW_CARD_CONSTANTS.SOLD_OUT; + } + if (ticketsLeft <= SHOW_CARD_LIMITS.LAST_TICKETS_THRESHOLD) { + return SHOW_CARD_CONSTANTS.LAST_TICKETS; + } + return SHOW_CARD_CONSTANTS.TICKETS_AVAILABLE; +} + +export function getInterestedStatusText(isInterested: boolean): string { + if (isInterested) { + return SHOW_CARD_CONSTANTS.YOUR_INTERESTED_LIST; + } + return SHOW_CARD_CONSTANTS.NO_ADDED_SHOW; +} + +export function getArtistPrefix(isInterested: boolean): string { + return isInterested ? SHOW_CARD_UI.INTERESTED_ICON : ""; +} + +export function getInterestedButtonText(isInterested: boolean): string { + return isInterested + ? SHOW_CARD_BUTTON_TEXT.REMOVE + : SHOW_CARD_BUTTON_TEXT.ADD; +}