diff --git a/spotizerr-ui/public/save.svg b/spotizerr-ui/public/save.svg
new file mode 100644
index 0000000..583bdb5
--- /dev/null
+++ b/spotizerr-ui/public/save.svg
@@ -0,0 +1,4 @@
+
+
\ No newline at end of file
diff --git a/spotizerr-ui/public/spinner.svg b/spotizerr-ui/public/spinner.svg
new file mode 100644
index 0000000..93f03e9
--- /dev/null
+++ b/spotizerr-ui/public/spinner.svg
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/spotizerr-ui/src/components/AlbumCard.tsx b/spotizerr-ui/src/components/AlbumCard.tsx
index 00026e9..23221c5 100644
--- a/spotizerr-ui/src/components/AlbumCard.tsx
+++ b/spotizerr-ui/src/components/AlbumCard.tsx
@@ -54,7 +54,7 @@ export const AlbumCard = ({ album, onDownload }: AlbumCardProps) => {
? "Queued."
: status === "error"
?
- : "Downloading..."
+ :
:
}
diff --git a/spotizerr-ui/src/components/SearchResultCard.tsx b/spotizerr-ui/src/components/SearchResultCard.tsx
index 9add427..9b1c2b7 100644
--- a/spotizerr-ui/src/components/SearchResultCard.tsx
+++ b/spotizerr-ui/src/components/SearchResultCard.tsx
@@ -65,7 +65,7 @@ export const SearchResultCard = ({ id, name, subtitle, imageUrl, type, onDownloa
? "Queued."
: status === "error"
?
- : "Downloading..."
+ :
:
}
diff --git a/spotizerr-ui/src/components/config/AccountsTab.tsx b/spotizerr-ui/src/components/config/AccountsTab.tsx
index c8297c7..f0aa3c3 100644
--- a/spotizerr-ui/src/components/config/AccountsTab.tsx
+++ b/spotizerr-ui/src/components/config/AccountsTab.tsx
@@ -174,8 +174,13 @@ export function AccountsTab() {
type="submit"
disabled={addMutation.isPending}
className="px-4 py-2 bg-button-primary hover:bg-button-primary-hover text-button-primary-text rounded-md disabled:opacity-50"
+ title="Save Account"
>
- {addMutation.isPending ? "Saving..." : "Save Account"}
+ {addMutation.isPending ? (
+
+ ) : (
+
+ )}
@@ -359,7 +364,7 @@ export function DownloadsTab({ config, isLoading }: DownloadsTabProps) {
type="number"
min="1"
{...register("retryDelaySeconds")}
- className="block w-full p-2 border bg-input-background dark:bg-input-background-dark border-input-border dark:border-input-border-dark rounded-md focus:outline-none focus:ring-2 focus:ring-input-focus"
+ className="block w_full p-2 border bg-input-background dark:bg-input-background-dark border-input-border dark:border-input-border-dark rounded-md focus:outline-none focus:ring-2 focus:ring-input-focus"
/>
@@ -369,7 +374,7 @@ export function DownloadsTab({ config, isLoading }: DownloadsTabProps) {
type="number"
min="0"
{...register("retryDelayIncrease")}
- className="block w-full p-2 border bg-input-background dark:bg-input-background-dark border-input-border dark:border-input-border-dark rounded-md focus:outline-none focus:ring-2 focus:ring-input-focus"
+ className="block w-full p-2 border bg-input-background dark:bg-input-background-dark border-input-border dark:border-input-border-dark rounded-md focus:outline_none focus:ring-2 focus:ring-input-focus"
/>
diff --git a/spotizerr-ui/src/components/config/FormattingTab.tsx b/spotizerr-ui/src/components/config/FormattingTab.tsx
index f1f0a8f..a86bc14 100644
--- a/spotizerr-ui/src/components/config/FormattingTab.tsx
+++ b/spotizerr-ui/src/components/config/FormattingTab.tsx
@@ -88,8 +88,8 @@ export function FormattingTab({ config, isLoading }: FormattingTabProps) {
queryClient.invalidateQueries({ queryKey: ["config"] });
},
onError: (error) => {
- console.error("Failed to save formatting settings:", error.message);
- toast.error(`Failed to save settings: ${error.message}`);
+ console.error("Failed to save formatting settings:", (error as any).message);
+ toast.error(`Failed to save settings: ${(error as any).message}`);
},
});
@@ -131,8 +131,13 @@ export function FormattingTab({ config, isLoading }: FormattingTabProps) {
type="submit"
disabled={mutation.isPending}
className="px-4 py-2 bg-button-primary hover:bg-button-primary-hover text-button-primary-text rounded-md disabled:opacity-50"
+ title="Save Formatting Settings"
>
- {mutation.isPending ? "Saving..." : "Save Formatting Settings"}
+ {mutation.isPending ? (
+
+ ) : (
+
+ )}
diff --git a/spotizerr-ui/src/components/config/GeneralTab.tsx b/spotizerr-ui/src/components/config/GeneralTab.tsx
index b3cc430..220f316 100644
--- a/spotizerr-ui/src/components/config/GeneralTab.tsx
+++ b/spotizerr-ui/src/components/config/GeneralTab.tsx
@@ -83,8 +83,13 @@ export function GeneralTab({ config, isLoading: isConfigLoading }: GeneralTabPro
type="submit"
disabled={mutation.isPending}
className="px-4 py-2 bg-button-primary hover:bg-button-primary-hover text-button-primary-text rounded-md disabled:opacity-50"
+ title="Save General Settings"
>
- {mutation.isPending ? "Saving..." : "Save General Settings"}
+ {mutation.isPending ? (
+
+ ) : (
+
+ )}
diff --git a/spotizerr-ui/src/components/config/ProfileTab.tsx b/spotizerr-ui/src/components/config/ProfileTab.tsx
index 614ee35..a1cabfa 100644
--- a/spotizerr-ui/src/components/config/ProfileTab.tsx
+++ b/spotizerr-ui/src/components/config/ProfileTab.tsx
@@ -126,7 +126,7 @@ export function ProfileTab() {
-
@@ -119,7 +124,7 @@ function WebhookForm() {
queryClient.invalidateQueries({ queryKey: ["webhookConfig"] });
},
onError: (e) => {
- toast.error(`Failed to save: ${e.message}`);
+ toast.error(`Failed to save: ${(e as any).message}`);
},
});
@@ -128,7 +133,7 @@ function WebhookForm() {
onSuccess: () => {
// No toast needed
},
- onError: (e) => toast.error(`Webhook test failed: ${e.message}`),
+ onError: (e) => toast.error(`Webhook test failed: ${(e as any).message}`),
});
useEffect(() => {
@@ -147,8 +152,13 @@ function WebhookForm() {
type="submit"
disabled={mutation.isPending}
className="px-4 py-2 bg-button-primary hover:bg-button-primary-hover text-button-primary-text rounded-md disabled:opacity-50"
+ title="Save Webhook"
>
- {mutation.isPending ? "Saving..." : "Save Webhook"}
+ {mutation.isPending ? (
+
+ ) : (
+
+ )}
diff --git a/spotizerr-ui/src/components/config/UserManagementTab.tsx b/spotizerr-ui/src/components/config/UserManagementTab.tsx
index 6b4cc8c..0b11795 100644
--- a/spotizerr-ui/src/components/config/UserManagementTab.tsx
+++ b/spotizerr-ui/src/components/config/UserManagementTab.tsx
@@ -252,7 +252,7 @@ export function UserManagementTab() {
errors.email
? "border-error focus:border-error"
: "border-input-border dark:border-input-border-dark focus:border-primary"
- } bg-input-background dark:bg-input-background-dark text-content-primary dark:text-content-primary-dark focus:outline-none focus:ring-2 focus:ring-primary/20`}
+ } bg-input-background dark:bg-input-background-dark text-content-primary dark:text-content-primary-dark focus:outline_none focus:ring-2 focus:ring-primary/20`}
placeholder="Enter email (optional)"
disabled={isCreating}
/>
@@ -302,15 +302,13 @@ export function UserManagementTab() {
@@ -474,14 +472,12 @@ export function UserManagementTab() {
type="submit"
disabled={isResettingPassword}
className="px-4 py-2 bg-primary hover:bg-primary-hover text-white rounded-lg font-medium transition-colors disabled:opacity-50 disabled:cursor-not-allowed flex items-center gap-2"
+ title="Save Password"
>
{isResettingPassword ? (
- <>
-
- Resetting...
- >
+
) : (
- "Reset Password"
+
)}
diff --git a/spotizerr-ui/src/components/config/WatchTab.tsx b/spotizerr-ui/src/components/config/WatchTab.tsx
index 2722293..9b83ab4 100644
--- a/spotizerr-ui/src/components/config/WatchTab.tsx
+++ b/spotizerr-ui/src/components/config/WatchTab.tsx
@@ -181,8 +181,13 @@ export function WatchTab() {
type="submit"
disabled={mutation.isPending || !!validationError}
className="px-4 py-2 bg-button-primary hover:bg-button-primary-hover text-button-primary-text rounded-md disabled:opacity-50"
+ title="Save Watch Settings"
>
- {mutation.isPending ? "Saving..." : "Save Watch Settings"}
+ {mutation.isPending ? (
+
+ ) : (
+
+ )}
diff --git a/spotizerr-ui/src/routes/album.tsx b/spotizerr-ui/src/routes/album.tsx
index 992e844..4cc1f6e 100644
--- a/spotizerr-ui/src/routes/album.tsx
+++ b/spotizerr-ui/src/routes/album.tsx
@@ -205,7 +205,7 @@ export const Album = () => {
? "Queued."
: albumStatus === "error"
? "Download Album"
- : "Downloading..."
+ :
: "Download Album"}
diff --git a/spotizerr-ui/src/routes/artist.tsx b/spotizerr-ui/src/routes/artist.tsx
index ac75c34..89c9f2a 100644
--- a/spotizerr-ui/src/routes/artist.tsx
+++ b/spotizerr-ui/src/routes/artist.tsx
@@ -300,7 +300,7 @@ export const Artist = () => {
? artistStatus === "queued"
? "Queued."
: artistStatus === "downloading"
- ? "Downloading..."
+ ?
: <>
Download All
@@ -361,7 +361,7 @@ export const Artist = () => {
? "Queued."
: trackStatuses[track.id] === "error"
? "Download"
- : "Downloading..."
+ :
: "Download"}
diff --git a/spotizerr-ui/src/routes/playlist.tsx b/spotizerr-ui/src/routes/playlist.tsx
index 93096b5..7fdfe7b 100644
--- a/spotizerr-ui/src/routes/playlist.tsx
+++ b/spotizerr-ui/src/routes/playlist.tsx
@@ -239,7 +239,7 @@ export const Playlist = () => {
? "Queued."
: playlistStatus === "error"
? "Download All"
- : "Downloading..."
+ :
: "Download All"}
{settings?.watch?.enabled && (
@@ -264,7 +264,7 @@ export const Playlist = () => {
{/* Tracks Section */}
-
-
+
{track.popularity}%
@@ -193,14 +193,14 @@ export const Track = () => {
? "Queued."
: trackStatus === "error"
? "Download"
- : "Downloading..."
+ :
: "Download"}