From 606e68d12921687f867b9824100c2117457d220e Mon Sep 17 00:00:00 2001 From: TZGyn Date: Tue, 19 Sep 2023 19:57:15 +0800 Subject: [PATCH] Frontend added shortener analytics to dashboard --- react-frontend/bun.lockb | Bin 134110 -> 148963 bytes react-frontend/package.json | 1 + react-frontend/src/pages/dashboard.tsx | 135 +++++++++++++++++++++++++ 3 files changed, 136 insertions(+) diff --git a/react-frontend/bun.lockb b/react-frontend/bun.lockb index 8fac02ec97722d3b30f63d88435a0a49f38395fb..3d485528ac08e96f3e6fb5e19f1aed43297da20c 100755 GIT binary patch delta 39636 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 B@pS+I delta 30869 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 q^US;YRU6j)s;}~z-yG4al$NJ;My4jGrl* { + visitor_data.push({ name: months, total: 0 }) +}) + const backend_url = import.meta.env.VITE_BACKEND_URL ?? 'http://192.168.100.40:3000' @@ -18,6 +46,8 @@ export default function Dashboard() { const [isLoading, setIsLoading] = useState(false) const { shortenerId } = useParams() + const [visitorData, setVisitorData] = useState(visitor_data) + const getShorteners = async () => { setIsLoading(true) const response = await fetch(backend_url + '/link/' + shortenerId, { @@ -27,20 +57,125 @@ export default function Dashboard() { const data = (await response.json()).shorteners as Shortener[] setShorteners(data) + calculateShortenerData(data[0]) setIsLoading(false) } + const calculateShortenerData = (shortener: Shortener) => { + const visitors = shortener.visitors + let data: VisitorData[] = [] + months.forEach((months) => { + data.push({ name: months, total: 0 }) + }) + let visitor_data_copy = data + + visitors.forEach((visitor) => { + const month = new Date(visitor.visited_at).getMonth() + visitor_data_copy[month] = { + ...visitor_data_copy[month], + total: visitor_data_copy[month].total + 1, + } + setVisitorData(visitor_data_copy) + }) + console.log(visitorData) + } + useEffect(() => { if (!shorteners.length) { getShorteners() } }, []) + const thisMonth = new Date().getMonth() + return ( +
+
+
+ {backend_url + '/' + shortenerId} +
+
+
+ + + + This Month's Visitors + + + + + + +
+ {visitorData[thisMonth]?.total ?? 0} +
+

+ {`+ ${ + visitorData[thisMonth]?.total ?? + 0 - + visitorData[thisMonth - 1] + ?.total ?? + 0 + } since last month`} +

+
+
+
+
+ + + Visitors + + + + + +
+
+
+
) } + +export function Overview({ visitorData }: { visitorData: VisitorData[] }) { + return ( + + + + + + + + ) +}