Fix ESLint errors
This commit is contained in:
@@ -24,13 +24,13 @@ export const AudioPlayer: React.FC = () => {
|
|||||||
|
|
||||||
// Save position when component unmounts or track changes
|
// Save position when component unmounts or track changes
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
const audioCurrent = audioRef.current;
|
||||||
return () => {
|
return () => {
|
||||||
const audioCurrent = audioRef.current;
|
|
||||||
if (audioCurrent && currentTrack && audioCurrent.currentTime > 10) {
|
if (audioCurrent && currentTrack && audioCurrent.currentTime > 10) {
|
||||||
localStorage.setItem(`navidrome-track-time-${currentTrack.id}`, audioCurrent.currentTime.toString());
|
localStorage.setItem(`navidrome-track-time-${currentTrack.id}`, audioCurrent.currentTime.toString());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}, [currentTrack?.id]);
|
}, [currentTrack]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const audioCurrent = audioRef.current;
|
const audioCurrent = audioRef.current;
|
||||||
@@ -62,7 +62,7 @@ export const AudioPlayer: React.FC = () => {
|
|||||||
audioCurrent.play();
|
audioCurrent.play();
|
||||||
setIsPlaying(true);
|
setIsPlaying(true);
|
||||||
}
|
}
|
||||||
}, [currentTrack?.id, currentTrack?.url]);
|
}, [currentTrack]);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const audioCurrent = audioRef.current;
|
const audioCurrent = audioRef.current;
|
||||||
|
|||||||
@@ -116,15 +116,15 @@ export const AudioPlayerProvider: React.FC<{ children: React.ReactNode }> = ({ c
|
|||||||
setQueue((prevQueue) => prevQueue.filter((_, i) => i !== index));
|
setQueue((prevQueue) => prevQueue.filter((_, i) => i !== index));
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
const playNextTrack = () => {
|
const playNextTrack = useCallback(() => {
|
||||||
if (queue.length > 0) {
|
if (queue.length > 0) {
|
||||||
const nextTrack = queue[0];
|
const nextTrack = queue[0];
|
||||||
setQueue((prevQueue) => prevQueue.slice(1));
|
setQueue((prevQueue) => prevQueue.slice(1));
|
||||||
playTrack(nextTrack);
|
playTrack(nextTrack);
|
||||||
}
|
}
|
||||||
};
|
}, [queue, playTrack]);
|
||||||
|
|
||||||
const playPreviousTrack = () => {
|
const playPreviousTrack = useCallback(() => {
|
||||||
if (playedTracks.length > 0) {
|
if (playedTracks.length > 0) {
|
||||||
const previousTrack = playedTracks[playedTracks.length - 1];
|
const previousTrack = playedTracks[playedTracks.length - 1];
|
||||||
setPlayedTracks((prevPlayedTracks) => prevPlayedTracks.slice(0, -1));
|
setPlayedTracks((prevPlayedTracks) => prevPlayedTracks.slice(0, -1));
|
||||||
@@ -136,9 +136,9 @@ export const AudioPlayerProvider: React.FC<{ children: React.ReactNode }> = ({ c
|
|||||||
|
|
||||||
setCurrentTrack(previousTrack);
|
setCurrentTrack(previousTrack);
|
||||||
}
|
}
|
||||||
};
|
}, [playedTracks, currentTrack]);
|
||||||
|
|
||||||
const addAlbumToQueue = async (albumId: string) => {
|
const addAlbumToQueue = useCallback(async (albumId: string) => {
|
||||||
setIsLoading(true);
|
setIsLoading(true);
|
||||||
try {
|
try {
|
||||||
const { album, songs } = await api.getAlbum(albumId);
|
const { album, songs } = await api.getAlbum(albumId);
|
||||||
@@ -159,9 +159,9 @@ export const AudioPlayerProvider: React.FC<{ children: React.ReactNode }> = ({ c
|
|||||||
} finally {
|
} finally {
|
||||||
setIsLoading(false);
|
setIsLoading(false);
|
||||||
}
|
}
|
||||||
};
|
}, [api, songToTrack, toast]);
|
||||||
|
|
||||||
const addArtistToQueue = async (artistId: string) => {
|
const addArtistToQueue = useCallback(async (artistId: string) => {
|
||||||
setIsLoading(true);
|
setIsLoading(true);
|
||||||
try {
|
try {
|
||||||
const { artist, albums } = await api.getArtist(artistId);
|
const { artist, albums } = await api.getArtist(artistId);
|
||||||
@@ -187,8 +187,8 @@ export const AudioPlayerProvider: React.FC<{ children: React.ReactNode }> = ({ c
|
|||||||
} finally {
|
} finally {
|
||||||
setIsLoading(false);
|
setIsLoading(false);
|
||||||
}
|
}
|
||||||
};
|
}, [api, songToTrack, toast]);
|
||||||
const playAlbum = async (albumId: string) => {
|
const playAlbum = useCallback(async (albumId: string) => {
|
||||||
setIsLoading(true);
|
setIsLoading(true);
|
||||||
try {
|
try {
|
||||||
const { album, songs } = await api.getAlbum(albumId);
|
const { album, songs } = await api.getAlbum(albumId);
|
||||||
@@ -216,9 +216,9 @@ export const AudioPlayerProvider: React.FC<{ children: React.ReactNode }> = ({ c
|
|||||||
} finally {
|
} finally {
|
||||||
setIsLoading(false);
|
setIsLoading(false);
|
||||||
}
|
}
|
||||||
};
|
}, [api, playTrack, songToTrack, toast]);
|
||||||
|
|
||||||
const playAlbumFromTrack = async (albumId: string, startingSongId: string) => {
|
const playAlbumFromTrack = useCallback(async (albumId: string, startingSongId: string) => {
|
||||||
setIsLoading(true);
|
setIsLoading(true);
|
||||||
try {
|
try {
|
||||||
const { album, songs } = await api.getAlbum(albumId);
|
const { album, songs } = await api.getAlbum(albumId);
|
||||||
@@ -251,7 +251,7 @@ export const AudioPlayerProvider: React.FC<{ children: React.ReactNode }> = ({ c
|
|||||||
} finally {
|
} finally {
|
||||||
setIsLoading(false);
|
setIsLoading(false);
|
||||||
}
|
}
|
||||||
};
|
}, [api, playTrack, songToTrack, toast]);
|
||||||
|
|
||||||
const skipToTrackInQueue = useCallback((index: number) => {
|
const skipToTrackInQueue = useCallback((index: number) => {
|
||||||
if (index >= 0 && index < queue.length) {
|
if (index >= 0 && index < queue.length) {
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ export const NavidromeProvider: React.FC<NavidromeProviderProps> = ({ children }
|
|||||||
|
|
||||||
const api = getNavidromeAPI();
|
const api = getNavidromeAPI();
|
||||||
|
|
||||||
const loadAlbums = async () => {
|
const loadAlbums = useCallback(async () => {
|
||||||
setAlbumsLoading(true);
|
setAlbumsLoading(true);
|
||||||
setError(null);
|
setError(null);
|
||||||
try {
|
try {
|
||||||
@@ -73,9 +73,9 @@ export const NavidromeProvider: React.FC<NavidromeProviderProps> = ({ children }
|
|||||||
} finally {
|
} finally {
|
||||||
setAlbumsLoading(false);
|
setAlbumsLoading(false);
|
||||||
}
|
}
|
||||||
};
|
}, [api]);
|
||||||
|
|
||||||
const loadArtists = async () => {
|
const loadArtists = useCallback(async () => {
|
||||||
setArtistsLoading(true);
|
setArtistsLoading(true);
|
||||||
setError(null);
|
setError(null);
|
||||||
try {
|
try {
|
||||||
@@ -87,9 +87,9 @@ export const NavidromeProvider: React.FC<NavidromeProviderProps> = ({ children }
|
|||||||
} finally {
|
} finally {
|
||||||
setArtistsLoading(false);
|
setArtistsLoading(false);
|
||||||
}
|
}
|
||||||
};
|
}, [api]);
|
||||||
|
|
||||||
const loadPlaylists = async () => {
|
const loadPlaylists = useCallback(async () => {
|
||||||
setPlaylistsLoading(true);
|
setPlaylistsLoading(true);
|
||||||
setError(null);
|
setError(null);
|
||||||
try {
|
try {
|
||||||
@@ -101,11 +101,11 @@ export const NavidromeProvider: React.FC<NavidromeProviderProps> = ({ children }
|
|||||||
} finally {
|
} finally {
|
||||||
setPlaylistsLoading(false);
|
setPlaylistsLoading(false);
|
||||||
}
|
}
|
||||||
};
|
}, [api]);
|
||||||
|
|
||||||
const refreshData = async () => {
|
const refreshData = useCallback(async () => {
|
||||||
await Promise.all([loadAlbums(), loadArtists(), loadPlaylists()]);
|
await Promise.all([loadAlbums(), loadArtists(), loadPlaylists()]);
|
||||||
};
|
}, [loadAlbums, loadArtists, loadPlaylists]);
|
||||||
|
|
||||||
const searchMusic = async (query: string) => {
|
const searchMusic = async (query: string) => {
|
||||||
setError(null);
|
setError(null);
|
||||||
@@ -247,7 +247,7 @@ export const NavidromeProvider: React.FC<NavidromeProviderProps> = ({ children }
|
|||||||
};
|
};
|
||||||
|
|
||||||
initialize();
|
initialize();
|
||||||
}, []);
|
}, [api, refreshData]);
|
||||||
|
|
||||||
const value: NavidromeContextType = {
|
const value: NavidromeContextType = {
|
||||||
// Data
|
// Data
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ export default function PlaylistPage() {
|
|||||||
<div className="h-full px-4 py-6 lg:px-8">
|
<div className="h-full px-4 py-6 lg:px-8">
|
||||||
<div className="text-center">
|
<div className="text-center">
|
||||||
<h2 className="text-2xl font-bold">Playlist not found</h2>
|
<h2 className="text-2xl font-bold">Playlist not found</h2>
|
||||||
<p className="text-muted-foreground">The playlist you're looking for doesn't exist.</p>
|
<p className="text-muted-foreground">The playlist you're looking for doesn't exist.</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ export interface NavidromeConfig {
|
|||||||
password: string;
|
password: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface SubsonicResponse<T = any> {
|
export interface SubsonicResponse<T = Record<string, unknown>> {
|
||||||
'subsonic-response': {
|
'subsonic-response': {
|
||||||
status: string;
|
status: string;
|
||||||
version: string;
|
version: string;
|
||||||
@@ -99,7 +99,7 @@ class NavidromeAPI {
|
|||||||
return crypto.createHash('md5').update(password + salt).digest('hex');
|
return crypto.createHash('md5').update(password + salt).digest('hex');
|
||||||
}
|
}
|
||||||
|
|
||||||
private async makeRequest(endpoint: string, params: Record<string, any> = {}): Promise<any> {
|
private async makeRequest(endpoint: string, params: Record<string, string | number> = {}): Promise<Record<string, unknown>> {
|
||||||
const salt = this.generateSalt();
|
const salt = this.generateSalt();
|
||||||
const token = this.generateToken(this.config.password, salt);
|
const token = this.generateToken(this.config.password, salt);
|
||||||
|
|
||||||
@@ -216,7 +216,7 @@ class NavidromeAPI {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async createPlaylist(name: string, songIds?: string[]): Promise<Playlist> {
|
async createPlaylist(name: string, songIds?: string[]): Promise<Playlist> {
|
||||||
const params: Record<string, any> = { name };
|
const params: Record<string, string | number> = { name };
|
||||||
if (songIds && songIds.length > 0) {
|
if (songIds && songIds.length > 0) {
|
||||||
songIds.forEach((id, index) => {
|
songIds.forEach((id, index) => {
|
||||||
params[`songId[${index}]`] = id;
|
params[`songId[${index}]`] = id;
|
||||||
@@ -224,11 +224,11 @@ class NavidromeAPI {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const response = await this.makeRequest('createPlaylist', params);
|
const response = await this.makeRequest('createPlaylist', params);
|
||||||
return response.playlist;
|
return response.playlist as Playlist;
|
||||||
}
|
}
|
||||||
|
|
||||||
async updatePlaylist(playlistId: string, name?: string, comment?: string, songIds?: string[]): Promise<void> {
|
async updatePlaylist(playlistId: string, name?: string, comment?: string, songIds?: string[]): Promise<void> {
|
||||||
const params: Record<string, any> = { playlistId };
|
const params: Record<string, string | number> = { playlistId };
|
||||||
if (name) params.name = name;
|
if (name) params.name = name;
|
||||||
if (comment) params.comment = comment;
|
if (comment) params.comment = comment;
|
||||||
if (songIds) {
|
if (songIds) {
|
||||||
|
|||||||
Reference in New Issue
Block a user