お知らせ
緊急連絡、プログラム変更、完売情報などのリアルタイム告知配信。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 : stringcontent : string | 管理者専用 : 新規ニュースを即時配信し news キャッシュを無効化 |
updateNews(id, updates) | id : stringupdates : { title: string, content: string, reason: string } | 管理者専用 : 編集理由を付与して既存ニュースを更新 |
deleteNews(id) | id : string | 管理者専用 : 指定したニュースを削除 |
コード
最新投稿への HOT バッジ自動付与
投稿から 20 分以内の新しいお知らせに対し、視覚的な HOT バッジを動的に付与します。
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;
};データベーススキーマ
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())
);