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" ? Download - : "Downloading..." + : Loading : Download } 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" ? Download - : "Downloading..." + : Loading : Download } 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 ? ( + Saving + ) : ( + Save + )} @@ -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 ? ( + Saving + ) : ( + Save + )} 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 ? ( + Saving + ) : ( + Save + )} 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 ? ( + Saving + ) : ( + Save + )} 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... - + Saving ) : ( - "Reset Password" + Save )}
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 ? ( + Saving + ) : ( + Save + )} 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..." + : Loading : "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..." + ? Loading : <> Download All @@ -361,7 +361,7 @@ export const Artist = () => { ? "Queued." : trackStatuses[track.id] === "error" ? "Download" - : "Downloading..." + : Loading : "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..." + : Loading : "Download All"} {settings?.watch?.enabled && ( @@ -264,7 +264,7 @@ export const Playlist = () => { {/* Tracks Section */}
-
+

Tracks

{tracks.length > 0 && ( @@ -335,7 +335,7 @@ export const Playlist = () => { ? "Queued." : trackStatuses[track.id] === "error" ? Download - : "Downloading..." + : Loading : Download } diff --git a/spotizerr-ui/src/routes/track.tsx b/spotizerr-ui/src/routes/track.tsx index 387f7e4..9ee47e1 100644 --- a/spotizerr-ui/src/routes/track.tsx +++ b/spotizerr-ui/src/routes/track.tsx @@ -174,7 +174,7 @@ export const Track = () => { style={{ width: `${track.popularity}%` }} >
- + {track.popularity}%
@@ -193,14 +193,14 @@ export const Track = () => { ? "Queued." : trackStatus === "error" ? "Download" - : "Downloading..." + : Loading : "Download"}