import React, { useState, useEffect } from "react"; import { View, ScrollView, ActivityIndicator, useColorScheme, Share, Platform, } from "react-native"; import { useSirouRouter } from "@sirou/react-native"; import { AppRoutes } from "@/lib/routes"; import { Stack, useLocalSearchParams } from "expo-router"; import { Text } from "@/components/ui/text"; import { Button } from "@/components/ui/button"; import { Clock, Share2, Newspaper, Calendar, Tag, AlertCircle, Eye, } from "@/lib/icons"; import { ScreenWrapper } from "@/components/ScreenWrapper"; import { StandardHeader } from "@/components/StandardHeader"; import { api } from "@/lib/api"; import { toast } from "@/lib/toast-store"; export default function NewsDetailScreen() { const nav = useSirouRouter(); const { id } = useLocalSearchParams(); const colorScheme = useColorScheme(); const isDark = colorScheme === "dark"; const [loading, setLoading] = useState(true); const [news, setNews] = useState(null); const newsId = Array.isArray(id) ? id[0] : id; useEffect(() => { if (newsId) { fetchNewsDetail(); } }, [newsId]); const fetchNewsDetail = async () => { try { setLoading(true); const data = await api.news.getById({ params: { id: newsId } }); setNews(data); } catch (error: any) { console.error("[NewsDetail] Fetch error:", error); toast.error("Error", "Failed to load news content."); } finally { setLoading(false); } }; const handleShare = async () => { if (!news) return; try { await Share.share({ title: news.title, message: `${news.title}\n\n${news.content.substring(0, 100)}...\n\nRead more on Yaltopia Tickets.`, }); } catch (error) { console.error("[NewsDetail] Share error:", error); } }; const getCategoryStyles = (category: string) => { switch (category) { case "ANNOUNCEMENT": return { bg: "bg-amber-500/10", text: "text-amber-500", dot: "bg-amber-500", }; case "UPDATE": return { bg: "bg-blue-500/10", text: "text-blue-500", dot: "bg-blue-500", }; case "MAINTENANCE": return { bg: "bg-red-500/10", text: "text-red-500", dot: "bg-red-500" }; default: return { bg: "bg-emerald-500/10", text: "text-emerald-500", dot: "bg-emerald-500", }; } }; if (loading) { return ( ); } if (!news) { return ( Content Not Found This news item might have been removed or is no longer available. ); } const styles = getCategoryStyles(news.category); return ( {/* Metadata Row */} {news.category} {news.viewCount || 0} Views {/* Title */} {news.title} {/* Author/Date Info */} {new Date(news.publishedAt).toLocaleDateString(undefined, { month: "short", day: "numeric", year: "numeric", })} {new Date(news.publishedAt).toLocaleTimeString(undefined, { hour: "2-digit", minute: "2-digit", })} {/* Content Body */} {news.content} {/* Footer Actions */} ); }