<NewsStatus /> / <NewsManager />

お知らせ

緊急連絡、プログラム変更、完売情報などのリアルタイム告知配信。Hot バッジによる最新情報の強調表示、管理者による投稿・編集・削除に対応。

使い方

参加者向け

import NewsStatus from "@/features/news/components/NewsStatus";

<NewsStatus />

全体管理者向け

import NewsManager from "@/features/news/components/NewsManager";

<NewsManager />

API src/features/news/api.ts

お知らせ一覧の取得はアプリ共通の DataContext.FetchedData.news を通じて自動ポーリング・キャッシュ管理され、登録・編集・削除は以下の API を通じて行われます。更新時は自動でキャッシュが無効化されます。

API 関数引数 / ペイロード役割
postNews(title, content)title : string
content : string
管理者専用 : 新規ニュースを即時配信し news キャッシュを無効化
updateNews(id, updates)id : string
updates : { title: string, content: string, reason: string }
管理者専用 : 編集理由を付与して既存ニュースを更新
deleteNews(id)id : string管理者専用 : 指定したニュースを削除

コード

最新投稿への HOT バッジ自動付与

投稿から 20 分以内の新しいお知らせに対し、視覚的な HOT バッジを動的に付与します。

src/features/news/utils/isHotNews.ts
export const isHotNews = (createdAt: string, thresholdMinutes = 20): boolean => {
  const postTime = new Date(createdAt).getTime();
  const now = Date.now();
  const diffMinutes = (now - postTime) / (1000 * 60);
  return diffMinutes >= 0 && diffMinutes <= thresholdMinutes;
};

データベーススキーマ

news
CREATE TABLE news (
  id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
  title TEXT NOT NULL,
  content TEXT NOT NULL,
  edit_reason TEXT,
  created_at TIMESTAMP WITH TIME ZONE DEFAULT timezone('utc'::text, now()),
  updated_at TIMESTAMP WITH TIME ZONE DEFAULT timezone('utc'::text, now())
);