From e2a6e16c8adfdf540cd2e41af8078e34af068d7a Mon Sep 17 00:00:00 2001 From: Dylan De Faoite Date: Tue, 3 Feb 2026 11:14:09 +0000 Subject: [PATCH] refactor: move api types into dedicated file --- frontend/src/pages/Stats.tsx | 27 ++-------------- frontend/src/types/ApiTypes.ts | 59 ++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 25 deletions(-) create mode 100644 frontend/src/types/ApiTypes.ts diff --git a/frontend/src/pages/Stats.tsx b/frontend/src/pages/Stats.tsx index 6ab603f..fed0e82 100644 --- a/frontend/src/pages/Stats.tsx +++ b/frontend/src/pages/Stats.tsx @@ -15,30 +15,7 @@ import { ReactWordcloud } from '@cp949/react-wordcloud'; import StatsStyling from "../styles/stats_styling"; import Card from "../components/Card"; -type BackendWord = { - word: string; - count: number; -} - -type TopUser = { - author: string; - source: string; - count: number; -}; - -type SummaryResponse = { - total_events: number; - total_posts: number; - total_comments: number; - unique_users: number; - comments_per_post: number; - lurker_ratio: number; - time_range: { - start: number; - end: number; - }; - sources: string[]; -}; +import type { TopUser, SummaryResponse, FrequencyWord } from '../types/ApiTypes' const styles = StatsStyling; @@ -105,7 +82,7 @@ const StatPage = () => { setTopUserData(topUsers); setHeatmapData(weekdayHourHeatmap); setWordFrequencyData( - wordFrequencies.map((d: BackendWord) => ({ + wordFrequencies.map((d: FrequencyWord) => ({ text: d.word, value: d.count, })) diff --git a/frontend/src/types/ApiTypes.ts b/frontend/src/types/ApiTypes.ts new file mode 100644 index 0000000..0af54a7 --- /dev/null +++ b/frontend/src/types/ApiTypes.ts @@ -0,0 +1,59 @@ +// User Code +type TopUser = { + author: string; + source: string; + count: number +}; + +type Vocab = { + author: string; + events: number; + total_words: number; + unique_words: number; + vocab_richness: number; + avg_words_per_event: number; + top_words: { word: string; count: number }[]; +}; + +type User = { + author: string; + post: number; + comment: number; + comment_post_ratio: number; + comment_share: number; + vocab?: Vocab | null; +}; + +type UserAnalysisResponse = { + top_users: TopUser[]; + users: User[]; +}; + +type FrequencyWord = { + word: string; + count: number; +} + +// Summary +type SummaryResponse = { + total_events: number; + total_posts: number; + total_comments: number; + unique_users: number; + comments_per_post: number; + lurker_ratio: number; + time_range: { + start: number; + end: number; + }; + sources: string[]; +}; + +export type { + TopUser, + Vocab, + User, + UserAnalysisResponse, + FrequencyWord, + SummaryResponse +} \ No newline at end of file