Skip to content

Commit c9b0015

Browse files
committed
fix: motion API type; playlist selection handler
1 parent 8c91203 commit c9b0015

5 files changed

Lines changed: 26 additions & 43 deletions

File tree

packages/raga-web-app/src/components/audioPlayer/trackBPMOverlay.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { appStore } from "../../store/appStore";
1111
import AnalyzeSingleTrackButton from "../trackTable/analyzeSingleTrackButton";
1212
import styles from "./trackBPMOverlay.module.scss";
1313

14-
const SLIDER_TRANSITION = { type: "tween", duration: 0.2, ease: "easeInOut" };
14+
const SLIDER_TRANSITION = { type: "tween" as const, duration: 0.2, ease: "easeInOut" as const };
1515

1616
export function TrackBPMOverlay({ trackDef }: { trackDef: TrackDefinition }) {
1717
const playbackRate = appStore.use.audioPlaybackRate();

packages/raga-web-app/src/components/common/tree.tsx

Lines changed: 9 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -143,14 +143,15 @@ function ControlledTree<T extends object>({
143143
[tree],
144144
);
145145

146-
const handleLabelClick = useCallback(
146+
const handleSingleSelection = useCallback(
147147
(nodeValue: string, selected: boolean) => {
148148
if (selectionMode !== "single") {
149149
return;
150150
}
151151

152152
if (selected) {
153153
tree.deselect(nodeValue);
154+
onSelect?.([]);
154155
} else {
155156
tree.select(nodeValue);
156157
const selectedNode = findNodeById(nodes, mantineNodeValueToId(nodeValue));
@@ -186,6 +187,10 @@ function ControlledTree<T extends object>({
186187
[styles.selectOnClick]: selectionMode === "single",
187188
[styles.selectedPath]: selected,
188189
})}
190+
onClick={(event: React.MouseEvent<HTMLDivElement>) => {
191+
handleSingleSelection(node.value, selected);
192+
elementProps.onClick(event);
193+
}}
189194
>
190195
{selectionMode === "multiple" && (
191196
<Checkbox.Indicator
@@ -212,18 +217,13 @@ function ControlledTree<T extends object>({
212217
</ActionIcon>
213218
)}
214219

215-
<div
216-
className={styles.labelContainer}
217-
onClick={() => {
218-
handleLabelClick(node.value, selected);
219-
}}
220-
>
220+
<div className={styles.labelContainer}>
221221
<span>{node.label}</span>
222222
</div>
223223
</div>
224224
);
225225
},
226-
[selectionMode, tree, handleCheckboxClick, handleExpandClick, handleLabelClick],
226+
[selectionMode, tree, handleCheckboxClick, handleExpandClick, handleSingleSelection],
227227
);
228228

229229
// Update tree state controlled selection changes
@@ -266,33 +266,7 @@ function ControlledTree<T extends object>({
266266
);
267267
}
268268

269-
export default memo(ControlledTree, (prevProps, nextProps) => {
270-
// Custom comparison to prevent re-renders when array contents haven't changed
271-
if (prevProps.selectionMode !== nextProps.selectionMode) {
272-
return false;
273-
}
274-
275-
if (prevProps.nodes !== nextProps.nodes) {
276-
return false;
277-
}
278-
279-
if (prevProps.onSelect !== nextProps.onSelect) {
280-
return false;
281-
}
282-
283-
// Deep comparison for selectedNodeIds array
284-
if (prevProps.selectedNodeIds.length !== nextProps.selectedNodeIds.length) {
285-
return false;
286-
}
287-
288-
for (let i = 0; i < prevProps.selectedNodeIds.length; i++) {
289-
if (prevProps.selectedNodeIds[i] !== nextProps.selectedNodeIds[i]) {
290-
return false;
291-
}
292-
}
293-
294-
return true;
295-
}) as typeof ControlledTree;
269+
export default memo(ControlledTree) as typeof ControlledTree;
296270

297271
// UTILITIES
298272
// -------------------------------------------------------------------------------------------------

packages/raga-web-app/src/components/playlistTable/playlistTable.tsx

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,14 @@ function PlaylistTable({
4242
const handleSelect = useCallback(
4343
(nodes: TreeNode<PlaylistDefinition>[]) => {
4444
if (selectionMode === "single") {
45-
const firstNode = nodes[0];
46-
log.debug(`[client] selected playlist ${firstNode.id}: '${firstNode.data.Name}'`);
47-
onSelect?.([firstNode.id]);
45+
if (nodes.length === 0) {
46+
// No playlist selected
47+
onSelect?.([]);
48+
} else {
49+
const firstNode = nodes[0];
50+
log.debug(`[client] selected playlist ${firstNode.id}: '${firstNode.data.Name}'`);
51+
onSelect?.([firstNode.id]);
52+
}
4853
} else if (selectionMode === "multiple") {
4954
onSelect?.(nodes.map((n) => n.id));
5055
}
@@ -74,7 +79,7 @@ function PlaylistTable({
7479
nodes={playlistDefNodes}
7580
selectionMode={selectionMode}
7681
selectedNodeIds={selectedNodeIds}
77-
onSelect={selectionMode === "none" ? undefined : handleSelect}
82+
onSelect={handleSelect}
7883
/>
7984
</div>
8085
</Box>

packages/raga-web-app/src/store/slices/audioFilesServerSlice.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ function initAudioFilesServer(set: AppStoreSet) {
283283
window.api.handleOnce<AudioFilesServerStartedEventPayload>(
284284
ServerEventChannel.AUDIO_FILES_SERVER_STARTED,
285285
(data) => {
286-
console.log("[AudioFilesServerSlice] Audio files server started", data);
286+
log.info(`[client] Audio files server started: ${data.audioConverterTemporaryFolder}`);
287287
set((state) => {
288288
notifications.show({
289289
title: "Audio files server started",

packages/raga-web-app/src/views/libraryView.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,12 @@ export default function LibraryView() {
2424
const setSelectedPlaylistId = appStore.use.setSelectedPlaylistId();
2525

2626
const handlePlaylistSelect = useCallback(
27-
([playlistId]: string[]) => {
28-
setSelectedPlaylistId(playlistId);
27+
(playlistIds: string[]) => {
28+
if (playlistIds.length === 0) {
29+
setSelectedPlaylistId(undefined);
30+
} else {
31+
setSelectedPlaylistId(playlistIds[0]);
32+
}
2933
},
3034
[setSelectedPlaylistId],
3135
);

0 commit comments

Comments
 (0)