diff --git a/components/DateFilter.js b/components/DateFilter.js
index b2540c6a..be83e634 100644
--- a/components/DateFilter.js
+++ b/components/DateFilter.js
@@ -1,24 +1,18 @@
-import React, { useState } from 'react';
+import React from 'react';
import { getDateRange } from 'lib/date';
+import DropDown from './DropDown';
-const filterOptions = ['24hour', '7day', '30day', '60day', '90day'];
+const filterOptions = [
+ { label: 'Last 24 hours', value: '24hour' },
+ { label: 'Last 7 days', value: '7day' },
+ { label: 'Last 30 days', value: '30day' },
+ { label: 'Last 90 days', value: '90day' },
+];
-export default function DateFilter({ onChange }) {
- const [selected, setSelected] = useState('7day');
-
- function handleChange(e) {
- const value = e.target.value;
- setSelected(value);
+export default function DateFilter({ value, onChange }) {
+ function handleChange(value) {
onChange(getDateRange(value));
}
- return (
-
- );
+ return ;
}
diff --git a/components/DropDown.js b/components/DropDown.js
new file mode 100644
index 00000000..b3b08fdb
--- /dev/null
+++ b/components/DropDown.js
@@ -0,0 +1,47 @@
+import React, { useState, useEffect, useRef } from 'react';
+import styles from './Dropdown.module.css';
+
+export default function DropDown({ value, options = [], onChange }) {
+ const [showMenu, setShowMenu] = useState(false);
+ const ref = useRef();
+
+ function handleShowMenu() {
+ setShowMenu(state => !state);
+ }
+
+ function handleSelect(value) {
+ onChange(value);
+ }
+
+ useEffect(() => {
+ function hideMenu(e) {
+ if (ref.current && !ref.current.contains(e.target)) {
+ setShowMenu(false);
+ }
+ }
+
+ document.body.addEventListener('click', hideMenu);
+
+ return () => {
+ document.body.removeEventListener('click', hideMenu);
+ };
+ }, [ref]);
+
+ return (
+
handleClick(key)}
>
{options[key]}
diff --git a/components/QuickButtons.module.css b/components/QuickButtons.module.css
index f0398be2..d56f1876 100644
--- a/components/QuickButtons.module.css
+++ b/components/QuickButtons.module.css
@@ -1,5 +1,9 @@
.buttons {
display: flex;
+ position: absolute;
+ top: 0;
+ right: 0;
+ margin: auto;
}
.button {
@@ -11,6 +15,10 @@
cursor: pointer;
}
+.button:last-child {
+ margin-right: 0;
+}
+
.button:hover {
background: #eaeaea;
}
diff --git a/components/WebsiteStats.js b/components/WebsiteChart.js
similarity index 70%
rename from components/WebsiteStats.js
rename to components/WebsiteChart.js
index bf77a9bb..0aba3c9e 100644
--- a/components/WebsiteStats.js
+++ b/components/WebsiteChart.js
@@ -2,11 +2,12 @@ import React, { useState, useEffect, useMemo } from 'react';
import PageviewsChart from './PageviewsChart';
import { get } from 'lib/web';
import { getDateArray, getDateRange, getTimezone } from 'lib/date';
-import WebsiteSummary from './WebsiteSummary';
+import MetricsBar from './MetricsBar';
import QuickButtons from './QuickButtons';
-import styles from './WebsiteStats.module.css';
+import styles from './WebsiteChart.module.css';
+import DateFilter from './DateFilter';
-export default function WebsiteStats({ title, websiteId }) {
+export default function WebsiteChart({ title, websiteId }) {
const [data, setData] = useState();
const [dateRange, setDateRange] = useState(getDateRange('7day'));
const { startDate, endDate, unit } = dateRange;
@@ -44,10 +45,12 @@ export default function WebsiteStats({ title, websiteId }) {
);
}
diff --git a/components/WebsiteStats.module.css b/components/WebsiteChart.module.css
similarity index 100%
rename from components/WebsiteStats.module.css
rename to components/WebsiteChart.module.css
diff --git a/components/WebsiteList.js b/components/WebsiteList.js
index b6e3b5b8..916f3fe6 100644
--- a/components/WebsiteList.js
+++ b/components/WebsiteList.js
@@ -1,6 +1,6 @@
import React, { useState, useEffect } from 'react';
import { get } from 'lib/web';
-import WebsiteStats from './WebsiteStats';
+import WebsiteChart from './WebsiteChart';
import DateFilter from './DateFilter';
import styles from './WebsiteList.module.css';
@@ -19,7 +19,7 @@ export default function WebsiteList() {
{data &&
data.websites.map(({ website_id, label }) => (
-
+
))}
);
diff --git a/lib/date.js b/lib/date.js
index bd49a0f8..f89d33a1 100644
--- a/lib/date.js
+++ b/lib/date.js
@@ -2,13 +2,13 @@ import moment from 'moment-timezone';
import {
addMinutes,
addHours,
+ addDays,
+ subHours,
+ subDays,
+ startOfHour,
startOfDay,
endOfHour,
endOfDay,
- startOfHour,
- addDays,
- subDays,
- subHours,
differenceInHours,
differenceInDays,
} from 'date-fns';
@@ -17,10 +17,6 @@ export function getTimezone() {
return moment.tz.guess();
}
-export function getTimezonAbbr() {
- return moment.tz.zone(getTimezone()).abbr(new Date().getTimezoneOffset());
-}
-
export function getLocalTime(t) {
return addMinutes(new Date(t), new Date().getTimezoneOffset());
}
@@ -38,12 +34,14 @@ export function getDateRange(value) {
startDate: subDays(day, num),
endDate: day,
unit,
+ value,
};
case 'hour':
return {
startDate: subHours(hour, num),
endDate: hour,
unit,
+ value,
};
}
}
diff --git a/lib/db.js b/lib/db.js
index 102f100e..cd47cb92 100644
--- a/lib/db.js
+++ b/lib/db.js
@@ -180,7 +180,7 @@ export async function getPageviewData(
);
}
-export async function getSummary(website_id, start_at, end_at) {
+export async function getMetrics(website_id, start_at, end_at) {
return runQuery(
prisma.queryRaw(
`
diff --git a/pages/api/website/[id]/summary.js b/pages/api/website/[id]/metrics.js
similarity index 65%
rename from pages/api/website/[id]/summary.js
rename to pages/api/website/[id]/metrics.js
index c8b95599..234336b0 100644
--- a/pages/api/website/[id]/summary.js
+++ b/pages/api/website/[id]/metrics.js
@@ -1,4 +1,4 @@
-import { getSummary } from 'lib/db';
+import { getMetrics } from 'lib/db';
import { useAuth } from 'lib/middleware';
export default async (req, res) => {
@@ -6,14 +6,14 @@ export default async (req, res) => {
const { id, start_at, end_at } = req.query;
- const summary = await getSummary(
+ const metrics = await getMetrics(
+id,
new Date(+start_at).toISOString(),
new Date(+end_at).toISOString(),
);
- const stats = Object.keys(summary[0]).reduce((obj, key) => {
- obj[key] = +summary[0][key];
+ const stats = Object.keys(metrics[0]).reduce((obj, key) => {
+ obj[key] = +metrics[0][key];
return obj;
}, {});
diff --git a/styles/index.css b/styles/index.css
index 162cd9cf..28f7fcee 100644
--- a/styles/index.css
+++ b/styles/index.css
@@ -37,3 +37,9 @@ form label {
form input {
margin-right: 10px;
}
+
+select {
+ padding: 4px 8px;
+ border: 1px solid #b3b3b3;
+ border-radius: 4px;
+}