diff --git a/Frontend/src/components/analytics/PostingVolumeByHour.tsx b/Frontend/src/components/analytics/PostingVolumeByHour.tsx new file mode 100644 index 00000000..afe017b8 --- /dev/null +++ b/Frontend/src/components/analytics/PostingVolumeByHour.tsx @@ -0,0 +1,44 @@ +import React from 'react'; + +export interface HourlyVolume { + hour: number; + volume: number; +} + +export interface PostingVolumeByHourProps { + hourlyData?: HourlyVolume[]; +} + +export const PostingVolumeByHour: React.FC = ({ + hourlyData = [], +}) => { + const maxVolume = Math.max(...hourlyData.map(d => d.volume), 1); + + return ( +
+

+ Posting Volume by Hour of Day +

+
+ {Array.from({ length: 24 }).map((_, hour) => { + const item = hourlyData.find(d => d.hour === hour); + const vol = item ? item.volume : 0; + const heightPercent = (vol / maxVolume) * 100; + return ( +
+
+
+
+ {hour}h +
+ ); + })} +
+
+ ); +}; + +export default PostingVolumeByHour; diff --git a/Frontend/src/components/analytics/WeekdayHourHeatmap.tsx b/Frontend/src/components/analytics/WeekdayHourHeatmap.tsx new file mode 100644 index 00000000..d4a4e2a8 --- /dev/null +++ b/Frontend/src/components/analytics/WeekdayHourHeatmap.tsx @@ -0,0 +1,66 @@ +import React from 'react'; + +export interface WeekdayHourData { + day: string; // Mon, Tue, etc. + hour: number; // 0-23 + count: number; +} + +export interface WeekdayHourHeatmapProps { + data?: WeekdayHourData[]; + onCellClick?: (day: string, hour: number) => void; +} + +export const WeekdayHourHeatmap: React.FC = ({ + data = [], + onCellClick, +}) => { + const days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']; + const hours = Array.from({ length: 24 }, (_, i) => i); + + const getIntensity = (day: string, hour: number) => { + const match = data.find(d => d.day === day && d.hour === hour); + return match ? match.count : 0; + }; + + return ( +
+

+ Weekday by Hour Posting Heatmap +

+
+
+
+
Day
+ {hours.map(h => ( +
+ {h} +
+ ))} + {days.map(day => ( + +
{day}
+ {hours.map(hour => { + const val = getIntensity(day, hour); + return ( +
+
+
+
+ ); +}; + +export default WeekdayHourHeatmap;