refactor(frontend): hook for checking that user is logged in

This commit is contained in:
Julian Tölle 2022-06-25 17:17:06 +02:00
parent be38c383ef
commit 8ecfe57661
8 changed files with 37 additions and 38 deletions

View file

@ -1,6 +1,7 @@
import React from "react"; import React from "react";
import { Navigate } from "react-router-dom"; import { useNavigate } from "react-router-dom";
export const LoginSuccess: React.FC = () => { export const LoginSuccess: React.FC = () => {
return <Navigate to="/" replace />; useNavigate()("/", { replace: false });
return null;
}; };

View file

@ -1,16 +1,15 @@
import { format, formatDistanceToNow } from "date-fns"; import { format, formatDistanceToNow } from "date-fns";
import React, { useEffect, useMemo, useState } from "react"; import React, { useEffect, useMemo, useState } from "react";
import { Navigate } from "react-router-dom";
import { Listen } from "../api/entities/listen"; import { Listen } from "../api/entities/listen";
import { useRecentListens } from "../hooks/use-api"; import { useRecentListens } from "../hooks/use-api";
import { useAuth } from "../hooks/use-auth"; import { useAuthProtection } from "../hooks/use-auth-protection";
import { ReloadIcon } from "../icons/Reload"; import { ReloadIcon } from "../icons/Reload";
import { getPaginationItems } from "../util/getPaginationItems"; import { getPaginationItems } from "../util/getPaginationItems";
const LISTENS_PER_PAGE = 15; const LISTENS_PER_PAGE = 15;
export const RecentListens: React.FC = () => { export const RecentListens: React.FC = () => {
const { user } = useAuth(); const { requireUser } = useAuthProtection();
const [page, setPage] = useState(1); const [page, setPage] = useState(1);
const [totalPages, setTotalPages] = useState(1); const [totalPages, setTotalPages] = useState(1);
@ -26,9 +25,7 @@ export const RecentListens: React.FC = () => {
} }
}, [totalPages, paginationMeta]); }, [totalPages, paginationMeta]);
if (!user) { requireUser();
return <Navigate to="/" replace />;
}
return ( return (
<div className="md:flex md:justify-center p-4"> <div className="md:flex md:justify-center p-4">

View file

@ -1,6 +1,5 @@
import { format, getTime } from "date-fns"; import { format, getTime } from "date-fns";
import React, { useMemo, useState } from "react"; import React, { useMemo, useState } from "react";
import { Navigate } from "react-router-dom";
import { import {
Area, Area,
AreaChart, AreaChart,
@ -16,11 +15,11 @@ import { ListenReportOptions } from "../api/entities/listen-report-options";
import { TimeOptions } from "../api/entities/time-options"; import { TimeOptions } from "../api/entities/time-options";
import { TimePreset } from "../api/entities/time-preset.enum"; import { TimePreset } from "../api/entities/time-preset.enum";
import { useListensReport } from "../hooks/use-api"; import { useListensReport } from "../hooks/use-api";
import { useAuth } from "../hooks/use-auth"; import { useAuthProtection } from "../hooks/use-auth-protection";
import { ReportTimeOptions } from "./ReportTimeOptions"; import { ReportTimeOptions } from "./ReportTimeOptions";
export const ReportListens: React.FC = () => { export const ReportListens: React.FC = () => {
const { user } = useAuth(); const { requireUser } = useAuthProtection();
const [timeFrame, setTimeFrame] = useState<"day" | "week" | "month" | "year">( const [timeFrame, setTimeFrame] = useState<"day" | "week" | "month" | "year">(
"day" "day"
@ -41,9 +40,7 @@ export const ReportListens: React.FC = () => {
const reportHasItems = !isLoading && report.length !== 0; const reportHasItems = !isLoading && report.length !== 0;
if (!user) { requireUser();
return <Navigate to="/" replace />;
}
return ( return (
<div className="md:flex md:justify-center p-4"> <div className="md:flex md:justify-center p-4">

View file

@ -1,16 +1,15 @@
import React, { useMemo, useState } from "react"; import React, { useMemo, useState } from "react";
import { Navigate } from "react-router-dom";
import { Album } from "../api/entities/album"; import { Album } from "../api/entities/album";
import { TimeOptions } from "../api/entities/time-options"; import { TimeOptions } from "../api/entities/time-options";
import { TimePreset } from "../api/entities/time-preset.enum"; import { TimePreset } from "../api/entities/time-preset.enum";
import { useTopAlbums } from "../hooks/use-api"; import { useTopAlbums } from "../hooks/use-api";
import { useAuth } from "../hooks/use-auth"; import { useAuthProtection } from "../hooks/use-auth-protection";
import { getMaxCount } from "../util/getMaxCount"; import { getMaxCount } from "../util/getMaxCount";
import { ReportTimeOptions } from "./ReportTimeOptions"; import { ReportTimeOptions } from "./ReportTimeOptions";
import { TopListItem } from "./TopListItem"; import { TopListItem } from "./TopListItem";
export const ReportTopAlbums: React.FC = () => { export const ReportTopAlbums: React.FC = () => {
const { user } = useAuth(); const { requireUser } = useAuthProtection();
const [timeOptions, setTimeOptions] = useState<TimeOptions>({ const [timeOptions, setTimeOptions] = useState<TimeOptions>({
timePreset: TimePreset.LAST_90_DAYS, timePreset: TimePreset.LAST_90_DAYS,
@ -30,9 +29,7 @@ export const ReportTopAlbums: React.FC = () => {
const reportHasItems = !isLoading && topAlbums.length !== 0; const reportHasItems = !isLoading && topAlbums.length !== 0;
const maxCount = getMaxCount(topAlbums); const maxCount = getMaxCount(topAlbums);
if (!user) { requireUser();
return <Navigate to="/" replace />;
}
return ( return (
<div className="md:flex md:justify-center p-4"> <div className="md:flex md:justify-center p-4">

View file

@ -1,15 +1,14 @@
import React, { useMemo, useState } from "react"; import React, { useMemo, useState } from "react";
import { Navigate } from "react-router-dom";
import { TimeOptions } from "../api/entities/time-options"; import { TimeOptions } from "../api/entities/time-options";
import { TimePreset } from "../api/entities/time-preset.enum"; import { TimePreset } from "../api/entities/time-preset.enum";
import { useTopArtists } from "../hooks/use-api"; import { useTopArtists } from "../hooks/use-api";
import { useAuth } from "../hooks/use-auth"; import { useAuthProtection } from "../hooks/use-auth-protection";
import { getMaxCount } from "../util/getMaxCount"; import { getMaxCount } from "../util/getMaxCount";
import { ReportTimeOptions } from "./ReportTimeOptions"; import { ReportTimeOptions } from "./ReportTimeOptions";
import { TopListItem } from "./TopListItem"; import { TopListItem } from "./TopListItem";
export const ReportTopArtists: React.FC = () => { export const ReportTopArtists: React.FC = () => {
const { user } = useAuth(); const { requireUser } = useAuthProtection();
const [timeOptions, setTimeOptions] = useState<TimeOptions>({ const [timeOptions, setTimeOptions] = useState<TimeOptions>({
timePreset: TimePreset.LAST_90_DAYS, timePreset: TimePreset.LAST_90_DAYS,
@ -29,9 +28,7 @@ export const ReportTopArtists: React.FC = () => {
const reportHasItems = !isLoading && topArtists.length !== 0; const reportHasItems = !isLoading && topArtists.length !== 0;
const maxCount = getMaxCount(topArtists); const maxCount = getMaxCount(topArtists);
if (!user) { requireUser();
return <Navigate to="/" replace />;
}
return ( return (
<div className="md:flex md:justify-center p-4"> <div className="md:flex md:justify-center p-4">

View file

@ -1,19 +1,18 @@
import React, { useMemo, useState } from "react"; import React, { useMemo, useState } from "react";
import { Navigate } from "react-router-dom";
import { Artist } from "../api/entities/artist"; import { Artist } from "../api/entities/artist";
import { Genre } from "../api/entities/genre"; import { Genre } from "../api/entities/genre";
import { TimeOptions } from "../api/entities/time-options"; import { TimeOptions } from "../api/entities/time-options";
import { TimePreset } from "../api/entities/time-preset.enum"; import { TimePreset } from "../api/entities/time-preset.enum";
import { TopArtistsItem } from "../api/entities/top-artists-item"; import { TopArtistsItem } from "../api/entities/top-artists-item";
import { useTopGenres } from "../hooks/use-api"; import { useTopGenres } from "../hooks/use-api";
import { useAuth } from "../hooks/use-auth"; import { useAuthProtection } from "../hooks/use-auth-protection";
import { capitalizeString } from "../util/capitalizeString"; import { capitalizeString } from "../util/capitalizeString";
import { getMaxCount } from "../util/getMaxCount"; import { getMaxCount } from "../util/getMaxCount";
import { ReportTimeOptions } from "./ReportTimeOptions"; import { ReportTimeOptions } from "./ReportTimeOptions";
import { TopListItem } from "./TopListItem"; import { TopListItem } from "./TopListItem";
export const ReportTopGenres: React.FC = () => { export const ReportTopGenres: React.FC = () => {
const { user } = useAuth(); const { requireUser } = useAuthProtection();
const [timeOptions, setTimeOptions] = useState<TimeOptions>({ const [timeOptions, setTimeOptions] = useState<TimeOptions>({
timePreset: TimePreset.LAST_90_DAYS, timePreset: TimePreset.LAST_90_DAYS,
@ -32,9 +31,7 @@ export const ReportTopGenres: React.FC = () => {
const reportHasItems = !isLoading && topGenres.length !== 0; const reportHasItems = !isLoading && topGenres.length !== 0;
if (!user) { requireUser();
return <Navigate to="/" replace />;
}
const maxCount = getMaxCount(topGenres); const maxCount = getMaxCount(topGenres);

View file

@ -1,16 +1,15 @@
import React, { useMemo, useState } from "react"; import React, { useMemo, useState } from "react";
import { Navigate } from "react-router-dom";
import { TimeOptions } from "../api/entities/time-options"; import { TimeOptions } from "../api/entities/time-options";
import { TimePreset } from "../api/entities/time-preset.enum"; import { TimePreset } from "../api/entities/time-preset.enum";
import { Track } from "../api/entities/track"; import { Track } from "../api/entities/track";
import { useTopTracks } from "../hooks/use-api"; import { useTopTracks } from "../hooks/use-api";
import { useAuth } from "../hooks/use-auth"; import { useAuthProtection } from "../hooks/use-auth-protection";
import { getMaxCount } from "../util/getMaxCount"; import { getMaxCount } from "../util/getMaxCount";
import { ReportTimeOptions } from "./ReportTimeOptions"; import { ReportTimeOptions } from "./ReportTimeOptions";
import { TopListItem } from "./TopListItem"; import { TopListItem } from "./TopListItem";
export const ReportTopTracks: React.FC = () => { export const ReportTopTracks: React.FC = () => {
const { user } = useAuth(); const { requireUser } = useAuthProtection();
const [timeOptions, setTimeOptions] = useState<TimeOptions>({ const [timeOptions, setTimeOptions] = useState<TimeOptions>({
timePreset: TimePreset.LAST_90_DAYS, timePreset: TimePreset.LAST_90_DAYS,
@ -29,9 +28,7 @@ export const ReportTopTracks: React.FC = () => {
const reportHasItems = !isLoading && topTracks.length !== 0; const reportHasItems = !isLoading && topTracks.length !== 0;
if (!user) { requireUser();
return <Navigate to="/" replace />;
}
const maxCount = getMaxCount(topTracks); const maxCount = getMaxCount(topTracks);

View file

@ -0,0 +1,16 @@
import { useCallback } from "react";
import { useNavigate } from "react-router-dom";
import { useAuth } from "./use-auth";
export function useAuthProtection() {
const { user } = useAuth();
const navigate = useNavigate();
const requireUser = useCallback(async () => {
if (!user) {
navigate("/");
}
}, [user, navigate]);
return { requireUser };
}