Skip to content

Commit

Permalink
Added error message component. Update fetch hook.
Browse files Browse the repository at this point in the history
  • Loading branch information
mikecao committed Oct 4, 2020
1 parent 4cafa68 commit ca8a6fe
Show file tree
Hide file tree
Showing 8 changed files with 50 additions and 11 deletions.
1 change: 1 addition & 0 deletions assets/exclamation-triangle.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
14 changes: 14 additions & 0 deletions components/common/ErrorMessage.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import React from 'react';
import { FormattedMessage } from 'react-intl';
import Icon from './Icon';
import Exclamation from 'assets/exclamation-triangle.svg';
import styles from './ErrorMessage.module.css';

export default function ErrorMessage() {
return (
<div className={styles.error}>
<Icon icon={<Exclamation />} className={styles.icon} size="large" />
<FormattedMessage id="message.failure" defaultMessage="Something went wrong." />
</div>
);
}
13 changes: 13 additions & 0 deletions components/common/ErrorMessage.module.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
.error {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
margin: auto;
display: flex;
z-index: 1;
}

.icon {
margin-right: 10px;
}
9 changes: 5 additions & 4 deletions components/metrics/MetricsBar.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import React, { useState } from 'react';
import { FormattedMessage } from 'react-intl';
import classNames from 'classnames';
import Loading from 'components/common/Loading';
import ErrorMessage from 'components/common/ErrorMessage';
import useFetch from 'hooks/useFetch';
import useDateRange from 'hooks/useDateRange';
import { formatShortTime, formatNumber, formatLongNumber } from 'lib/format';
Expand All @@ -17,7 +18,7 @@ export default function MetricsBar({ websiteId, token, className }) {
query: { url },
} = usePageQuery();

const { data } = useFetch(
const { data, error, loading } = useFetch(
`/api/website/${websiteId}/metrics`,
{
start_at: +startDate,
Expand All @@ -40,9 +41,9 @@ export default function MetricsBar({ websiteId, token, className }) {

return (
<div className={classNames(styles.bar, className)} onClick={handleSetFormat}>
{!data ? (
<Loading />
) : (
{!data && loading && <Loading />}
{error && <ErrorMessage />}
{data && !error && (
<>
<MetricCard
label={<FormattedMessage id="metrics.views" defaultMessage="Views" />}
Expand Down
10 changes: 6 additions & 4 deletions components/metrics/MetricsTable.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import { formatNumber, formatLongNumber } from 'lib/format';
import useDateRange from 'hooks/useDateRange';
import usePageQuery from 'hooks/usePageQuery';
import styles from './MetricsTable.module.css';
import ErrorMessage from '../common/ErrorMessage';

export default function MetricsTable({
websiteId,
Expand All @@ -36,7 +37,7 @@ export default function MetricsTable({
query: { url },
} = usePageQuery();

const { data } = useFetch(
const { data, loading, error } = useFetch(
`/api/website/${websiteId}/rankings`,
{
type,
Expand All @@ -61,7 +62,7 @@ export default function MetricsTable({
return items;
}
return [];
}, [data, dataFilter, filterOptions]);
}, [data, error, dataFilter, filterOptions]);

const handleSetFormat = () => setFormat(state => !state);

Expand All @@ -86,8 +87,9 @@ export default function MetricsTable({

return (
<div className={classNames(styles.container, className)}>
{!data && <Loading />}
{data && (
{!data && loading && <Loading />}
{error && <ErrorMessage />}
{data && !error && (
<>
<div className={styles.header}>
<div className={styles.title}>{title}</div>
Expand Down
4 changes: 3 additions & 1 deletion components/metrics/WebsiteChart.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import usePageQuery from 'hooks/usePageQuery';
import { getDateArray, getDateLength } from 'lib/date';
import Times from 'assets/times.svg';
import styles from './WebsiteChart.module.css';
import ErrorMessage from '../common/ErrorMessage';

export default function WebsiteChart({
websiteId,
Expand All @@ -31,7 +32,7 @@ export default function WebsiteChart({
query: { url },
} = usePageQuery();

const { data, loading } = useFetch(
const { data, loading, error } = useFetch(
`/api/website/${websiteId}/pageviews`,
{
start_at: +startDate,
Expand Down Expand Up @@ -83,6 +84,7 @@ export default function WebsiteChart({
</div>
<div className="row">
<div className="col">
{error && <ErrorMessage />}
<PageviewsChart
websiteId={websiteId}
data={{ pageviews, uniques }}
Expand Down
8 changes: 7 additions & 1 deletion hooks/useFetch.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,13 @@ export default function useFetch(url, params = {}, options = {}) {

dispatch(updateQuery({ url, time: performance.now() - time, completed: Date.now() }));

setData(data);
if (status >= 400) {
setError(data);
setData(null);
} else {
setData(data);
}

setStatus(status);
onDataLoad(data);
} catch (e) {
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "umami",
"version": "0.76.0",
"version": "0.77.0",
"description": "A simple, fast, website analytics alternative to Google Analytics. ",
"author": "Mike Cao <[email protected]>",
"license": "MIT",
Expand Down

0 comments on commit ca8a6fe

Please sign in to comment.