started a more proper implementation of the player

This commit is contained in:
Chris Kruining 2025-05-26 16:25:39 +02:00
parent d902f19d35
commit fbc040c317
No known key found for this signature in database
GPG key ID: EB894A3560CCCAD2
6 changed files with 231 additions and 50 deletions

View file

@ -0,0 +1,15 @@
import { Component, createMemo } from "solid-js";
import { useVideo } from "../context";
export const PlayState: Component<{}> = (props) => {
const video = useVideo();
const icon = createMemo(() => {
return {
playing: "⏵",
paused: "⏸",
}[video.state()];
});
return <button onclick={(e) => video.togglePlayState()}>{icon()}</button>;
};

View file

@ -0,0 +1,26 @@
import { Component } from "solid-js";
interface SeekBarProps {
video: HTMLVideoElement | undefined;
}
export const SeekBar: Component<SeekBarProps> = () => {
return (
<>
<input
list="chapters"
type="range"
max={duration().toFixed(0)}
value={currentTime().toFixed(0)}
oninput={(e) => setTime(e.target.valueAsNumber)}
step="1"
/>
<datalist id="chapters">
<option value="100">Chapter 1</option>
<option value="200">Chapter 2</option>
<option value="300">Chapter 3</option>
</datalist>
</>
);
};

View file

@ -2,15 +2,21 @@ import { Component, createEffect, createSignal, Show } from "solid-js";
import css from "./volume.module.css";
import { createStore, unwrap } from "solid-js/store";
import { trackDeep } from "@solid-primitives/deep";
import { useVideo } from "../context";
interface VolumeProps {
value: number;
muted?: boolean;
onInput?: (next: { volume: number, muted: boolean }) => any;
onInput?: (next: { volume: number; muted: boolean }) => any;
}
export const Volume: Component<VolumeProps> = (props) => {
const [state, setState] = createStore({ volume: props.value, muted: props.muted ?? false });
const video = useVideo();
const [state, setState] = createStore({
volume: props.value,
muted: props.muted ?? false,
});
createEffect(() => {
props.onInput?.(unwrap(trackDeep(state)));
@ -18,8 +24,21 @@ export const Volume: Component<VolumeProps> = (props) => {
return (
<div class={css.container}>
<button onClick={() => setState('muted', m => !m)}><Show when={state.muted} fallback="mute">unmute</Show></button>
<input type="range" value={state.volume} min="0" max="1" step="0.01" onInput={(e) => setState('volume', e.target.valueAsNumber)} />
<button onClick={() => setState("muted", (m) => !m)}>
<Show when={state.muted} fallback="mute">
unmute
</Show>
</button>
<input
type="range"
value={state.volume}
min="0"
max="1"
step="0.01"
onInput={(e) =>
setState({ muted: false, volume: e.target.valueAsNumber })
}
/>
</div>
);
};