chore(lint): biome cleanup across services — format, sort imports, drop unused

- discord-gateway: 74 lint errors -> 0 (format, import sorting, unused
  imports/vars, dead breath var)
- backend: format + sort imports (11 warnings left: noExplicitAny)
- frontend: remove unused imports, drop dead breathing var, fix
  useExhaustiveDependencies (scroll keyed on messages), a11y biome-ignore
  for drag surface + stopPropagation container (mouse-only gestures)
- remaining warnings are false positives: index keys on static lists,
  <img> in static export (next/image unsupported), noExplicitAny

tsc --noEmit clean on all 3 services; vitest green (60+36).
This commit is contained in:
asepharyana
2026-08-01 22:09:02 +07:00
parent 2357421841
commit 6293d588bc
123 changed files with 466 additions and 308 deletions
@@ -66,7 +66,12 @@ export class PcmPlayer {
if (!this.started || samples.length === 0) return;
let ring = this.rings.get(userIdHash);
if (!ring) {
ring = { data: new Float32Array(RING_LEN), write: 0, readPos: 0, lastActive: Date.now() };
ring = {
data: new Float32Array(RING_LEN),
write: 0,
readPos: 0,
lastActive: Date.now(),
};
this.rings.set(userIdHash, ring);
}
ring.lastActive = Date.now();
@@ -9,9 +9,9 @@ import {
useRef,
useState,
} from "react";
import { useWebSocket } from "@/lib/ws/context";
import { mediaApi } from "@/lib/api";
import type { MediaState, MediaItem } from "@/lib/types";
import type { MediaItem, MediaState } from "@/lib/types";
import { useWebSocket } from "@/lib/ws/context";
interface MediaPlayerContextValue {
/** Current play state */
@@ -52,11 +52,14 @@ export function MediaPlayerProvider({ children }: { children: ReactNode }) {
useEffect(() => {
if (fetched.current) return;
fetched.current = true;
mediaApi.getStatus().then((data) => {
if (data) setState(data as MediaState);
}).catch(() => {
// API not yet available
});
mediaApi
.getStatus()
.then((data) => {
if (data) setState(data as MediaState);
})
.catch(() => {
// API not yet available
});
}, []);
// Subscribe to live media_state events via WS
@@ -69,37 +72,52 @@ export function MediaPlayerProvider({ children }: { children: ReactNode }) {
const skip = useCallback(() => {
setPending(true);
mediaApi.skip().then((data) => {
if (data) setState(data as MediaState);
}).catch(() => {
// ignore
}).finally(() => setPending(false));
mediaApi
.skip()
.then((data) => {
if (data) setState(data as MediaState);
})
.catch(() => {
// ignore
})
.finally(() => setPending(false));
}, []);
const stop = useCallback(() => {
setPending(true);
mediaApi.stop().then((data) => {
if (data) setState(data as MediaState);
}).catch(() => {
// ignore
}).finally(() => setPending(false));
mediaApi
.stop()
.then((data) => {
if (data) setState(data as MediaState);
})
.catch(() => {
// ignore
})
.finally(() => setPending(false));
}, []);
const setVolume = useCallback((vol: number) => {
mediaApi.volume(vol).then((data) => {
if (data) setState(data as MediaState);
}).catch(() => {
// ignore
});
mediaApi
.volume(vol)
.then((data) => {
if (data) setState(data as MediaState);
})
.catch(() => {
// ignore
});
}, []);
const queueUrl = useCallback((url: string) => {
setPending(true);
mediaApi.queue(url, "music").then((data) => {
if (data) setState(data as MediaState);
}).catch(() => {
// ignore
}).finally(() => setPending(false));
mediaApi
.queue(url, "music")
.then((data) => {
if (data) setState(data as MediaState);
})
.catch(() => {
// ignore
})
.finally(() => setPending(false));
}, []);
return (