mirror of
https://github.com/zoriya/v10.git
synced 2026-08-16 02:45:09 +00:00
feat(monorepo): migrate prototype code to organized package structure
Migrate all prototype code from vjs10-prototype repository into the monorepo structure following established dependency hierarchy and package organization patterns. Core packages migrated: - @vjs-10/media-store: Complete media store with nanostores integration - @vjs-10/playback-engine: HLS.js playback engine implementation - @vjs-10/media: Core media state owner and interfaces HTML packages migrated: - @vjs-10/html-icons: Web component icons with proper base classes - @vjs-10/html-media-elements: Context provider integration - @vjs-10/html: Main HTML UI components, skins, and utilities React packages migrated: - @vjs-10/react-icons: React icon components - @vjs-10/react-media-elements: Video component with state integration - @vjs-10/react-media-store: MediaProvider and React hooks - @vjs-10/react: Main React UI components and skins Changes made: - Updated all imports to use monorepo package names (@vjs-10/*) - Distributed dependencies to specific packages that use them - Preserved all prototype functionality and component structure - Created proper index files for all packages - Fixed workspace protocol usage for npm compatibility 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude
parent
fc5a0e46fd
commit
4b472ec49c
@@ -1,84 +1 @@
|
||||
import { MediaStore, MediaState, MediaStateOwner } from '@vjs-10/media-store';
|
||||
import { VjsMediaElement } from '@vjs-10/html-media-elements';
|
||||
|
||||
export class HTMLMediaStateOwner implements MediaStateOwner {
|
||||
private element: VjsMediaElement;
|
||||
private listeners: Map<string, EventListener> = new Map();
|
||||
|
||||
constructor(element: VjsMediaElement) {
|
||||
this.element = element;
|
||||
this.setupEventListeners();
|
||||
}
|
||||
|
||||
getState(): MediaState {
|
||||
return {
|
||||
currentTime: this.element.currentTime,
|
||||
duration: this.element.duration,
|
||||
paused: this.element.paused,
|
||||
volume: this.element.volume,
|
||||
muted: this.element.muted,
|
||||
};
|
||||
}
|
||||
|
||||
setState(state: Partial<MediaState>): void {
|
||||
if (state.currentTime !== undefined && state.currentTime !== this.element.currentTime) {
|
||||
this.element.currentTime = state.currentTime;
|
||||
}
|
||||
if (state.volume !== undefined && state.volume !== this.element.volume) {
|
||||
this.element.volume = state.volume;
|
||||
}
|
||||
if (state.muted !== undefined && state.muted !== this.element.muted) {
|
||||
this.element.muted = state.muted;
|
||||
}
|
||||
}
|
||||
|
||||
private setupEventListeners() {
|
||||
const timeUpdateListener = () => {
|
||||
this.dispatchStateChange();
|
||||
};
|
||||
|
||||
const playPauseListener = () => {
|
||||
this.dispatchStateChange();
|
||||
};
|
||||
|
||||
const volumeChangeListener = () => {
|
||||
this.dispatchStateChange();
|
||||
};
|
||||
|
||||
this.element.addEventListener('vjs-timeupdate', timeUpdateListener);
|
||||
this.element.addEventListener('vjs-play', playPauseListener);
|
||||
this.element.addEventListener('vjs-pause', playPauseListener);
|
||||
this.element.addEventListener('volumechange', volumeChangeListener);
|
||||
|
||||
this.listeners.set('timeupdate', timeUpdateListener);
|
||||
this.listeners.set('play', playPauseListener);
|
||||
this.listeners.set('pause', playPauseListener);
|
||||
this.listeners.set('volumechange', volumeChangeListener);
|
||||
}
|
||||
|
||||
private dispatchStateChange() {
|
||||
this.element.dispatchEvent(new CustomEvent('vjs-state-change', {
|
||||
detail: this.getState()
|
||||
}));
|
||||
}
|
||||
|
||||
destroy() {
|
||||
this.listeners.forEach((listener, event) => {
|
||||
this.element.removeEventListener(event as any, listener);
|
||||
});
|
||||
this.listeners.clear();
|
||||
}
|
||||
}
|
||||
|
||||
export function connectMediaElementToStore(element: VjsMediaElement, store: MediaStore): HTMLMediaStateOwner {
|
||||
const owner = new HTMLMediaStateOwner(element);
|
||||
store.addOwner(owner);
|
||||
|
||||
element.addEventListener('vjs-state-change', (event: CustomEvent) => {
|
||||
store.updateState(event.detail);
|
||||
});
|
||||
|
||||
return owner;
|
||||
}
|
||||
|
||||
export { MediaStore, MediaState, MediaStateOwner } from '@vjs-10/media-store';
|
||||
// Store integration utilities for HTML/Web Components
|
||||
Reference in New Issue
Block a user