Skip to content

Commit 428af71

Browse files
committed
Update deps and fix all the warnings
1 parent a7d13f3 commit 428af71

6 files changed

Lines changed: 128 additions & 132 deletions

File tree

package.json

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
{
22
"name": "@stronk-tech/react-librespot-controller",
33
"description": "`go-librespot` squeezebox-alike web frontend for small touchscreens",
4-
"version": "0.0.23",
4+
"version": "0.0.24",
55
"main": "dist/index.cjs.js",
66
"module": "dist/index.esm.js",
77
"files": [
88
"dist"
99
],
1010
"dependencies": {
11-
"prop-types": "^15.7.2",
12-
"react-icons": "^5.3.0"
11+
"prop-types": "^15.8.1",
12+
"react-icons": "^5.4.0"
1313
},
1414
"devDependencies": {
1515
"@babel/preset-env": "^7.26.0",
@@ -23,12 +23,12 @@
2323
"@rollup/plugin-terser": "^0.4.4",
2424
"@rollup/plugin-url": "^8.0.2",
2525
"dotenv": "^16.4.7",
26-
"eslint": "^8.57.1",
26+
"eslint": "^9.16.0",
2727
"eslint-config-react-app": "^7.0.1",
28-
"react": "^16.14.0 || ^17.0.0 || ^18.0.0",
29-
"react-dom": "^16.14.0 || ^17.0.0 || ^18.0.0",
28+
"react": "^19.0.0",
29+
"react-dom": "^19.0.0",
3030
"react-scripts": "^5.0.1",
31-
"rollup": "^4.28.0",
31+
"rollup": "^4.28.1",
3232
"rollup-plugin-import-css": "^3.5.7",
3333
"rollup-plugin-peer-deps-external": "^2.2.4"
3434
},
@@ -39,8 +39,8 @@
3939
]
4040
},
4141
"peerDependencies": {
42-
"react": "^16.14.0 || ^17.0.0 || ^18.0.0",
43-
"react-dom": "^16.14.0 || ^17.0.0 || ^18.0.0"
42+
"react": "^17.0.0 || ^18.0.0",
43+
"react-dom": "^17.0.0 || ^18.0.0"
4444
},
4545
"eslintConfig": {
4646
"extends": "react-app"

src/components/Info/TrackDetails.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import React from "react";
22
import './TrackDetails.css';
33

4-
const TrackDetails = ({ track, formatReleaseDate, isStopped, isConnected }) => {
4+
// TODO: should display the error somewhere at some point
5+
const TrackDetails = ({ track, formatReleaseDate, isStopped, isConnected, error }) => {
56
if (isStopped || !isConnected) {
67
return (
78
<div className="spotify-player-track-details spotify-player-message">

src/components/MediaPlayer.js

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -147,28 +147,28 @@ const MediaPlayer = ({
147147
return releaseDate; // Return as-is for invalid formats
148148
};
149149

150-
const updateLayout = () => {
151-
if (playerRef.current) {
152-
const layoutClass =
153-
width > 900
154-
? "spotify-player-widescreen-layout"
155-
: width < 500
156-
? "spotify-player-portrait-layout"
157-
: "spotify-player-default-layout";
158-
159-
// Remove previous layout classes
160-
playerRef.current.classList.remove(
161-
"spotify-player-widescreen-layout",
162-
"spotify-player-portrait-layout",
163-
"spotify-player-default-layout"
164-
);
165-
166-
// Add the current layout class
167-
playerRef.current.classList.add(layoutClass);
168-
}
169-
};
170-
171150
useEffect(() => {
151+
const updateLayout = () => {
152+
if (playerRef.current) {
153+
const layoutClass =
154+
width > 900
155+
? "spotify-player-widescreen-layout"
156+
: width < 500
157+
? "spotify-player-portrait-layout"
158+
: "spotify-player-default-layout";
159+
160+
// Remove previous layout classes
161+
playerRef.current.classList.remove(
162+
"spotify-player-widescreen-layout",
163+
"spotify-player-portrait-layout",
164+
"spotify-player-default-layout"
165+
);
166+
167+
// Add the current layout class
168+
playerRef.current.classList.add(layoutClass);
169+
}
170+
};
171+
172172
updateLayout();
173173
}, [width]);
174174

@@ -195,6 +195,7 @@ const MediaPlayer = ({
195195
formatReleaseDate={formatReleaseDate}
196196
isStopped={isStopped}
197197
isConnected={isConnected}
198+
error={error}
198199
/>
199200
<SeekControls
200201
duration={track?.duration || 100}
@@ -255,6 +256,7 @@ const MediaPlayer = ({
255256
formatReleaseDate={formatReleaseDate}
256257
isStopped={isStopped}
257258
isConnected={isConnected}
259+
error={error}
258260
/>
259261
</div>
260262
<div className="spotify-player-right">
@@ -311,6 +313,7 @@ const MediaPlayer = ({
311313
formatReleaseDate={formatReleaseDate}
312314
isStopped={isStopped}
313315
isConnected={isConnected}
316+
error={error}
314317
/>
315318
<SeekControls
316319
duration={track?.duration || 100}

src/hooks/useComponentSize.js

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,31 +3,23 @@ import { useState, useEffect } from "react";
33
const useComponentSize = (ref) => {
44
const [size, setSize] = useState({ width: 0, height: 0 });
55

6-
const updateSize = () => {
7-
if (ref.current) {
8-
setSize({
9-
width: ref.current.offsetWidth,
10-
height: ref.current.offsetHeight,
11-
});
12-
}
13-
};
14-
156
useEffect(() => {
16-
if (ref.current) {
17-
updateSize();
18-
}
7+
const updateSize = () => {
8+
if (ref.current) {
9+
setSize({
10+
width: ref.current.offsetWidth,
11+
height: ref.current.offsetHeight,
12+
});
13+
}
14+
};
1915

20-
const observer = new MutationObserver(updateSize);
2116
if (ref.current) {
22-
observer.observe(ref.current, { attributes: true, childList: true, subtree: true });
17+
updateSize();
2318
}
2419

2520
window.addEventListener("resize", updateSize);
2621
return () => {
2722
window.removeEventListener("resize", updateSize);
28-
if (ref.current) {
29-
observer.disconnect();
30-
}
3123
};
3224
}, [ref]);
3325

src/hooks/useWebSocket.js

Lines changed: 81 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -52,97 +52,96 @@ const useWebSocket = (websocketUrl, onEvent) => {
5252
const retryTimeoutRef = useRef(null); // Reconnection timeout reference
5353
const disconnectTimeoutRef = useRef(null); // Timeout for delayed disconnection
5454

55-
const connect = () => {
56-
if (retryCountRef.current > MAX_RETRIES) {
57-
setState({ isConnected: false, error: 'Max reconnection attempts reached.' });
58-
console.warn("Max WebSocket reconnection attempts reached.");
59-
return;
60-
}
61-
62-
if (socketRef.current) {
63-
console.warn("WebSocket instance already exists. Skipping connect.");
64-
return;
65-
}
66-
67-
console.log(
68-
`Connecting to WebSocket at ${websocketUrl} (Retry: ${retryCountRef.current})`
69-
);
70-
71-
// Create WebSocket connection
72-
const socket = new WebSocket(websocketUrl);
73-
socketRef.current = socket;
74-
75-
socket.onopen = () => {
76-
console.log("WebSocket connected successfully.");
77-
setState({ isConnected: true, error: null });
78-
retryCountRef.current = 0; // Reset retries on successful connection
79-
80-
// Clear any pending disconnect timeout
81-
if (disconnectTimeoutRef.current) {
82-
clearTimeout(disconnectTimeoutRef.current);
83-
disconnectTimeoutRef.current = null;
55+
useEffect(() => {
56+
const connect = () => {
57+
if (retryCountRef.current > MAX_RETRIES) {
58+
setState({ isConnected: false, error: 'Max reconnection attempts reached.' });
59+
console.warn("Max WebSocket reconnection attempts reached.");
60+
return;
8461
}
85-
};
8662

87-
socket.onmessage = (message) => {
88-
try {
89-
const event = JSON.parse(message.data);
90-
if (onEvent) onEvent(event);
91-
} catch (error) {
92-
console.error("Failed to parse WebSocket message:", error);
63+
if (socketRef.current) {
64+
console.warn("WebSocket instance already exists. Skipping connect.");
65+
return;
9366
}
94-
};
9567

96-
socket.onerror = (error) => {
97-
console.error("WebSocket encountered an error:", error.message || error);
98-
setState((prev) => ({
99-
...prev,
100-
error: error.message || 'WebSocket encountered an error',
101-
}));
102-
};
103-
104-
socket.onclose = (event) => {
105-
console.warn(
106-
`WebSocket closed (code: ${event.code}, reason: ${
107-
event.reason || "none"
108-
})`
68+
console.log(
69+
`Connecting to WebSocket at ${websocketUrl} (Retry: ${retryCountRef.current})`
10970
);
11071

111-
if (event.code === 1000) {
112-
// Normal closure; no reconnection required
113-
console.log("WebSocket closed normally.");
114-
setState({ isConnected: false, error: null });
72+
// Create WebSocket connection
73+
const socket = new WebSocket(websocketUrl);
74+
socketRef.current = socket;
75+
76+
socket.onopen = () => {
77+
console.log("WebSocket connected successfully.");
78+
setState({ isConnected: true, error: null });
79+
retryCountRef.current = 0; // Reset retries on successful connection
80+
81+
// Clear any pending disconnect timeout
82+
if (disconnectTimeoutRef.current) {
83+
clearTimeout(disconnectTimeoutRef.current);
84+
disconnectTimeoutRef.current = null;
85+
}
86+
};
87+
88+
socket.onmessage = (message) => {
89+
try {
90+
const event = JSON.parse(message.data);
91+
if (onEvent) onEvent(event);
92+
} catch (error) {
93+
console.error("Failed to parse WebSocket message:", error);
94+
}
95+
};
96+
97+
socket.onerror = (error) => {
98+
console.error("WebSocket encountered an error:", error.message || error);
99+
setState((prev) => ({
100+
...prev,
101+
error: error.message || 'WebSocket encountered an error',
102+
}));
103+
};
104+
105+
socket.onclose = (event) => {
106+
console.warn(
107+
`WebSocket closed (code: ${event.code}, reason: ${event.reason || "none"
108+
})`
109+
);
110+
111+
if (event.code === 1000) {
112+
// Normal closure; no reconnection required
113+
console.log("WebSocket closed normally.");
114+
setState({ isConnected: false, error: null });
115+
socketRef.current = null;
116+
return;
117+
}
118+
119+
// Introduce delayed disconnection
120+
disconnectTimeoutRef.current = setTimeout(() => {
121+
setState((prev) => ({ ...prev, isConnected: false }));
122+
}, 4000); // Delay for 4 seconds
123+
124+
setState((prev) => ({
125+
...prev,
126+
error: event.reason || 'Connection closed',
127+
}));
115128
socketRef.current = null;
116-
return;
117-
}
118129

119-
// Introduce delayed disconnection
120-
disconnectTimeoutRef.current = setTimeout(() => {
121-
setState((prev) => ({ ...prev, isConnected: false }));
122-
}, 4000); // Delay for 4 seconds
123-
124-
setState((prev) => ({
125-
...prev,
126-
error: event.reason || 'Connection closed',
127-
}));
128-
socketRef.current = null;
129-
130-
// Handle reconnection with exponential backoff
131-
const delay = Math.min(
132-
RECONNECT_DELAY_BASE * 2 ** retryCountRef.current,
133-
MAX_RECONNECT_DELAY
134-
);
135-
136-
console.log(`Reconnecting in ${delay / 1000} seconds...`);
137-
retryTimeoutRef.current = setTimeout(() => {
138-
retryCountRef.current += 1; // Increment retry count in the ref
139-
connect();
140-
}, delay);
130+
// Handle reconnection with exponential backoff
131+
const delay = Math.min(
132+
RECONNECT_DELAY_BASE * 2 ** retryCountRef.current,
133+
MAX_RECONNECT_DELAY
134+
);
135+
136+
console.log(`Reconnecting in ${delay / 1000} seconds...`);
137+
retryTimeoutRef.current = setTimeout(() => {
138+
retryCountRef.current += 1; // Increment retry count in the ref
139+
connect();
140+
}, delay);
141+
};
141142
};
142-
};
143143

144-
useEffect(() => {
145-
connect(); // Establish the WebSocket connection
144+
connect();
146145

147146
return () => {
148147
if (retryTimeoutRef.current) clearTimeout(retryTimeoutRef.current);
@@ -153,7 +152,7 @@ const useWebSocket = (websocketUrl, onEvent) => {
153152
socketRef.current = null;
154153
}
155154
};
156-
}, [websocketUrl]);
155+
}, [websocketUrl, onEvent]);
157156

158157
return state;
159158
};

src/util/api.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ export const addToQueue = async (uri) =>
129129
body: JSON.stringify({ uri }),
130130
});
131131

132-
export default {
132+
const exports = {
133133
checkAPI,
134134
getStatus,
135135
play,
@@ -145,4 +145,5 @@ export default {
145145
toggleRepeatTrack,
146146
toggleShuffleContext,
147147
addToQueue,
148-
};
148+
};
149+
export default exports;

0 commit comments

Comments
 (0)