aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--site/src/components/NewsFeed.tsx95
1 files changed, 63 insertions, 32 deletions
diff --git a/site/src/components/NewsFeed.tsx b/site/src/components/NewsFeed.tsx
index a9b36cf..3057d61 100644
--- a/site/src/components/NewsFeed.tsx
+++ b/site/src/components/NewsFeed.tsx
@@ -1,3 +1,4 @@
+import { useState } from "react";
import { getGameTitle } from "../utils.ts";
export interface NewsData {
@@ -12,6 +13,8 @@ export interface NewsData {
image: string;
link: string | null;
}>;
+ en_headline: string | null;
+ en_content: string | null;
}
interface NewsFeedProps {
@@ -19,6 +22,17 @@ interface NewsFeedProps {
}
export const NewsFeed: React.FC<NewsFeedProps> = ({ newsItems }) => {
+ // Track which items are showing English content
+ const [showEnglish, setShowEnglish] = useState<Record<string, boolean>>({});
+
+ // Toggle language for a specific news item
+ const toggleLanguage = (itemId: string) => {
+ setShowEnglish(prev => ({
+ ...prev,
+ [itemId]: !prev[itemId]
+ }));
+ };
+
return (
<div className="max-w-[600px] w-full mx-auto py-8 space-y-4">
{newsItems.map((news) => {
@@ -29,14 +43,21 @@ export const NewsFeed: React.FC<NewsFeedProps> = ({ newsItems }) => {
});
const gameId = news.identifier;
+ const newsId = `${news.identifier}-${news.timestamp}-${news.content.substring(0, 20)}`;
+ const isEnglish = showEnglish[newsId] || false;
+ const hasTranslation = news.en_headline || news.en_content;
+
+ // Choose content based on language selection
+ const displayHeadline = isEnglish && news.en_headline ? news.en_headline : news.headline;
+ const displayContent = isEnglish && news.en_content ? news.en_content : news.content;
return (
<div
- key={news.identifier + "-" + news.timestamp + "-" + news.content}
+ key={newsId}
className="bg-gray-900 border border-gray-800 rounded-lg shadow-lg overflow-hidden"
>
{/* Header (Game Icon + Info) */}
- <div className="flex items-center p-3">
+ <div className="flex items-center p-3 justify-between">
<div className="flex items-center space-x-3">
{/* Game Icon */}
<div className="bg-purple-700 rounded-full h-8 w-8 flex items-center justify-center text-white text-xs font-bold flex-shrink-0">
@@ -58,20 +79,30 @@ export const NewsFeed: React.FC<NewsFeedProps> = ({ newsItems }) => {
)}
</div>
</div>
+
+ {/* Language Toggle Button */}
+ {hasTranslation && (
+ <button
+ onClick={() => toggleLanguage(newsId)}
+ className="text-xs bg-gray-800 hover:bg-gray-700 text-gray-300 py-1 px-2 rounded"
+ >
+ {isEnglish ? "View Original" : "View in English"}
+ </button>
+ )}
</div>
{/* Content Area */}
<div className="px-3 pt-1 pb-3">
{/* Headline */}
- {news.headline && (
+ {displayHeadline && (
<p className="font-semibold text-white text-sm mb-2">
- {news.headline}
+ {displayHeadline}
</p>
)}
{/* Content */}
<p className="text-sm text-gray-200 whitespace-pre-line mb-2">
- {news.content.split(/(\[.*?\]\(.*?\)|https?:\/\/[^\s]+)/g).map((part, index) => {
+ {displayContent.split(/(\[.*?\]\(.*?\)|https?:\/\/[^\s]+)/g).map((part, index) => {
const match = part.match(/\[(.*?)\]\((.*?)\)/);
const urlMatch = part.match(/https?:\/\/[^\s]+/);
if (match) {
@@ -93,33 +124,33 @@ export const NewsFeed: React.FC<NewsFeedProps> = ({ newsItems }) => {
</div>
{/* Post Image(s) */}
- <div className="w-full">
- {news.images.map((img, i) => (
- img.link ? (
- <a
- key={i}
- href={img.link}
- target="_blank"
- rel="noopener noreferrer"
- className="block hover:opacity-75"
- >
- <img
- src={img.image}
- alt="news visual"
- className="w-full object-cover py-2"
- />
- </a>
- ) : (
- <div key={i} className="block">
- <img
- src={img.image}
- alt="news visual"
- className="w-full object-cover py-2"
- />
- </div>
- )
- ))}
- </div>
+ <div className="w-full">
+ {news.images.map((img, i) => (
+ img.link ? (
+ <a
+ key={i}
+ href={img.link}
+ target="_blank"
+ rel="noopener noreferrer"
+ className="block hover:opacity-75"
+ >
+ <img
+ src={img.image}
+ alt="news visual"
+ className="w-full object-cover py-2"
+ />
+ </a>
+ ) : (
+ <div key={i} className="block">
+ <img
+ src={img.image}
+ alt="news visual"
+ className="w-full object-cover py-2"
+ />
+ </div>
+ )
+ ))}
+ </div>
{/* Footer with Read More Link */}
{news.url && (
send patches to the email below
yukais@pinapelz.com
include the subject [PATCH repo_name]
pinapelz.com
homepage