diff --git a/frontend/src/components/RecentListens.tsx b/frontend/src/components/RecentListens.tsx index 5e427b0..8664606 100644 --- a/frontend/src/components/RecentListens.tsx +++ b/frontend/src/components/RecentListens.tsx @@ -5,6 +5,7 @@ import { useRecentListens } from "../hooks/use-api"; import { useAuthProtection } from "../hooks/use-auth-protection"; import { ReloadIcon } from "../icons/Reload"; import { getPaginationItems } from "../util/getPaginationItems"; +import { Spinner } from "./Spinner"; const LISTENS_PER_PAGE = 15; @@ -40,11 +41,7 @@ export const RecentListens: React.FC = () => {
- {isLoading && ( -
- Loading Listens -
- )} + {isLoading && } {recentListens.length === 0 && (

Could not find any listens!

diff --git a/frontend/src/components/ReportListens.tsx b/frontend/src/components/ReportListens.tsx index 6e74cd6..3125cbe 100644 --- a/frontend/src/components/ReportListens.tsx +++ b/frontend/src/components/ReportListens.tsx @@ -17,6 +17,7 @@ import { TimePreset } from "../api/entities/time-preset.enum"; import { useListensReport } from "../hooks/use-api"; import { useAuthProtection } from "../hooks/use-auth-protection"; import { ReportTimeOptions } from "./ReportTimeOptions"; +import { Spinner } from "./Spinner"; export const ReportListens: React.FC = () => { const { requireUser } = useAuthProtection(); @@ -71,11 +72,7 @@ export const ReportListens: React.FC = () => { setTimeOptions={setTimeOptions} />
- {isLoading && ( -
-
-
- )} + {isLoading && } {!reportHasItems && !isLoading && (

Report is emtpy! :(

diff --git a/frontend/src/components/ReportTopAlbums.tsx b/frontend/src/components/ReportTopAlbums.tsx index af54876..121c6e1 100644 --- a/frontend/src/components/ReportTopAlbums.tsx +++ b/frontend/src/components/ReportTopAlbums.tsx @@ -6,6 +6,7 @@ import { useTopAlbums } from "../hooks/use-api"; import { useAuthProtection } from "../hooks/use-auth-protection"; import { getMaxCount } from "../util/getMaxCount"; import { ReportTimeOptions } from "./ReportTimeOptions"; +import { Spinner } from "./Spinner"; import { TopListItem } from "./TopListItem"; export const ReportTopAlbums: React.FC = () => { @@ -42,11 +43,7 @@ export const ReportTopAlbums: React.FC = () => { timeOptions={timeOptions} setTimeOptions={setTimeOptions} /> - {isLoading && ( -
-
-
- )} + {isLoading && } {!reportHasItems && !isLoading && (

Report is emtpy! :(

diff --git a/frontend/src/components/ReportTopArtists.tsx b/frontend/src/components/ReportTopArtists.tsx index 09af942..f0e1c8f 100644 --- a/frontend/src/components/ReportTopArtists.tsx +++ b/frontend/src/components/ReportTopArtists.tsx @@ -5,6 +5,7 @@ import { useTopArtists } from "../hooks/use-api"; import { useAuthProtection } from "../hooks/use-auth-protection"; import { getMaxCount } from "../util/getMaxCount"; import { ReportTimeOptions } from "./ReportTimeOptions"; +import { Spinner } from "./Spinner"; import { TopListItem } from "./TopListItem"; export const ReportTopArtists: React.FC = () => { @@ -41,11 +42,8 @@ export const ReportTopArtists: React.FC = () => { timeOptions={timeOptions} setTimeOptions={setTimeOptions} /> - {isLoading && ( -
-
-
- )} + {isLoading && } + {!reportHasItems && !isLoading && (

Report is emtpy! :(

diff --git a/frontend/src/components/ReportTopGenres.tsx b/frontend/src/components/ReportTopGenres.tsx index d22eee0..d6d6bd9 100644 --- a/frontend/src/components/ReportTopGenres.tsx +++ b/frontend/src/components/ReportTopGenres.tsx @@ -9,6 +9,7 @@ import { useAuthProtection } from "../hooks/use-auth-protection"; import { capitalizeString } from "../util/capitalizeString"; import { getMaxCount } from "../util/getMaxCount"; import { ReportTimeOptions } from "./ReportTimeOptions"; +import { Spinner } from "./Spinner"; import { TopListItem } from "./TopListItem"; export const ReportTopGenres: React.FC = () => { @@ -46,11 +47,7 @@ export const ReportTopGenres: React.FC = () => { timeOptions={timeOptions} setTimeOptions={setTimeOptions} /> - {isLoading && ( -
-
-
- )} + {isLoading && } {!reportHasItems && !isLoading && (

Report is emtpy! :(

diff --git a/frontend/src/components/ReportTopTracks.tsx b/frontend/src/components/ReportTopTracks.tsx index 110c5b7..44c4fe2 100644 --- a/frontend/src/components/ReportTopTracks.tsx +++ b/frontend/src/components/ReportTopTracks.tsx @@ -6,6 +6,7 @@ import { useTopTracks } from "../hooks/use-api"; import { useAuthProtection } from "../hooks/use-auth-protection"; import { getMaxCount } from "../util/getMaxCount"; import { ReportTimeOptions } from "./ReportTimeOptions"; +import { Spinner } from "./Spinner"; import { TopListItem } from "./TopListItem"; export const ReportTopTracks: React.FC = () => { @@ -43,11 +44,7 @@ export const ReportTopTracks: React.FC = () => { timeOptions={timeOptions} setTimeOptions={setTimeOptions} /> - {isLoading && ( -
-
-
- )} + {isLoading && } {!reportHasItems && !isLoading && (

Report is emtpy! :(

diff --git a/frontend/src/components/Spinner.tsx b/frontend/src/components/Spinner.tsx new file mode 100644 index 0000000..ae78142 --- /dev/null +++ b/frontend/src/components/Spinner.tsx @@ -0,0 +1,32 @@ +import React from "react"; + +interface SpinnerProps { + size?: number; + className?: string; +} + +export const Spinner: React.FC = ({ + size = 64, + className = "", +}) => ( +
+ + + + +
+); diff --git a/frontend/src/loader.css b/frontend/src/loader.css deleted file mode 100644 index 2679f95..0000000 --- a/frontend/src/loader.css +++ /dev/null @@ -1,23 +0,0 @@ -.loader { - border-top-color: theme("colors.green.500"); - -webkit-animation: spinner 1.5s linear infinite; - animation: spinner 1.5s linear infinite; -} - -@-webkit-keyframes spinner { - 0% { - -webkit-transform: rotate(0deg); - } - 100% { - -webkit-transform: rotate(360deg); - } -} - -@keyframes spinner { - 0% { - transform: rotate(0deg); - } - 100% { - transform: rotate(360deg); - } -}