import React, { memo, useEffect, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { Calendar, Info } from 'lucide-react';
import { open as shellOpen } from '@tauri-apps/plugin-shell';
import type { BandsintownEvent } from '@/lib/api/bandsintown';
import { isoToParts } from '@/features/nowPlaying/utils/nowPlayingHelpers';
interface TourCardProps {
artistName: string;
enabled: boolean;
loading: boolean;
events: BandsintownEvent[];
onEnable: () => void;
}
const TourCard = memo(function TourCard({ artistName, enabled, loading, events, onEnable }: TourCardProps) {
const { t } = useTranslation();
const [showAll, setShowAll] = useState(false);
useEffect(() => { setShowAll(false); }, [artistName]);
const TOUR_LIMIT = 5;
const visible = showAll ? events : events.slice(0, TOUR_LIMIT);
const hidden = Math.max(0, events.length - visible.length);
return (
{t('nowPlayingInfo.onTour', 'On tour')}
{!enabled ? (
{t('nowPlayingInfo.enableBandsintownPrompt', 'See upcoming tour dates?')}
{t('nowPlayingInfo.enableBandsintownPromptDesc', 'Optional. Loads concerts for the current artist via Bandsintown.')}
) : (
<>
{loading && events.length === 0 && (
{t('nowPlayingInfo.tourLoading', 'Loading…')}
)}
{!loading && events.length === 0 && (
{t('nowPlayingInfo.noTourEvents', 'No upcoming shows')}
)}
{visible.length > 0 && (
{visible.map((ev, idx) => {
const parts = isoToParts(ev.datetime);
const place = [ev.venueCity, ev.venueRegion, ev.venueCountry].filter(Boolean).join(', ');
return (
- ev.url && shellOpen(ev.url).catch(() => {})}
role={ev.url ? 'button' : undefined}
tabIndex={ev.url ? 0 : undefined}>
{parts && (
{parts.month}
{parts.day}
)}
{ev.venueName || place}
{parts && {parts.weekday}, {parts.time}}
{parts && place && • }
{place}
);
})}
)}
{(hidden > 0 || (showAll && events.length > TOUR_LIMIT)) && (
)}
{t('nowPlayingInfo.poweredByBandsintown', 'Tour data via Bandsintown')}
>
)}
);
});
export default TourCard;