diff options
| author | lonkaars <loek@pipeframe.xyz> | 2021-06-26 17:55:07 +0200 | 
|---|---|---|
| committer | lonkaars <loek@pipeframe.xyz> | 2021-06-26 17:55:07 +0200 | 
| commit | 2dea4e3a4975e2594695d78995ba45d537bc8936 (patch) | |
| tree | ce18546318e0fb5d0443e0281317e5831238e60c | |
| parent | 3d1e06deb15a9f754db688b8f8569959b40a86c1 (diff) | |
prevent excessive rerendering (more code splitting)
| -rw-r--r-- | package.json | 1 | ||||
| -rw-r--r-- | pages/editor.tsx | 139 | ||||
| -rw-r--r-- | yarn.lock | 5 | 
3 files changed, 80 insertions, 65 deletions
| diff --git a/package.json b/package.json index d5ea486..85414be 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@  	},  	"dependencies": {  		"@hookstate/core": "^3.0.8", +		"@hookstate/untracked": "^3.0.0",  		"@material-ui/core": "^4.11.4",  		"@material-ui/icons": "^4.11.2",  		"@material-ui/lab": "^4.0.0-alpha.58", diff --git a/pages/editor.tsx b/pages/editor.tsx index 5944cd2..c513e63 100644 --- a/pages/editor.tsx +++ b/pages/editor.tsx @@ -1,4 +1,4 @@ -import { createState, Downgraded, none, PluginCallbacks, State, StateValueAtRoot, useHookstate } from '@hookstate/core'; +import { createState, Downgraded, none, State, useHookstate } from '@hookstate/core';  import { CSSProperties, ReactNode, Ref, useEffect, useRef, useState } from 'react';  import { animated, useSpring } from 'react-spring';  import { useDrag } from 'react-use-gesture'; @@ -1113,87 +1113,96 @@ function SettingsPane() {  	var key = uuid();  	settingsArr[0] = settingsArr[1]; -	settingsArr[1] = settings.node.attach(Downgraded).get(); - -	return <FadeThroughTransition -		key={key} -		from={<div className='inner posabs a0' children={settingsArr[0]} />} -		to={<div className='inner posabs a0' children={settingsArr[1]} />} -		show={true} -	/>; +	settingsArr[1] = settings.node.attach(Downgraded).value; + +	return <div className='settings fullwidth-inputs posrel'> +		<FadeThroughTransition +			key={key} +			from={<div className='inner posabs a0' children={settingsArr[0]} />} +			to={<div className='inner posabs a0' children={settingsArr[1]} />} +			show={true} +		/> +	</div>;  } -export default function Index() { +function Player() {  	var playing = useHookstate(global).timeline.playing; +	var ready = useHookstate(global).ready;  	var playerRef = useRef(null);  	useEffect(() => {  		player.registerPlayer(playerRef.current);  	}, []); +	return <div className='viewer'> +		<div className={'player posrel ' + (ready.video.available.get() ? '' : 'disabled')}> +			<div className='outer posabs abscenter'> +				<video id='player' ref={playerRef} className='fullwidth' /> +			</div> +		</div> +		<div className={'controls ' + (ready.timeline.get() ? '' : 'disabled')}> +			<div className='posabs abscenter'> +				<Fab +					size='small' +					children={<SkipPreviousRoundedIcon />} +					onClick={() => { +						player.slide = 0; +						player.previous(); +					}} +				/> +				<Fab +					className={'playPause ' + (ready.video.playable.get() ? '' : 'disabled')} +					size='medium' +					onClick={() => { +						player.next(); +						player.player.play(); +					}} +					children={<PlaySkipIconAni />} +					style={{ '--ani-state': playing.get() ? 'skip' : 'play' } as CSSProperties} +				/> +				<Fab size='small' children={<NavigateBeforeRoundedIcon />} onClick={() => player.previous()} /> +				<Fab +					size='small' +					children={<NavigateNextRoundedIcon />} +					onClick={() => { +						player.next(); // TODO: fix jank here +						player.next(); +						player.previous(); +					}} +				/> +			</div> +			<div className='posabs abscenterv r0'> +				<Fab +					size='small' +					children={<FullscreenRoundedIcon />} +					onClick={() => document.body.requestFullscreen()} +				/> +			</div> +		</div> +	</div>; +} + +function TitleBar() { +	return <AppBar position='static' color='transparent' elevation={0}> +		<Toolbar> +			<PressureIcon /> +			<h1>pressure</h1> +		</Toolbar> +	</AppBar>; +} + +export default function Index() {  	useEffect(() => {  		var preventDefault = (e: Event) => e.preventDefault();  		document.addEventListener('gesturestart', preventDefault);  		document.addEventListener('gesturechange', preventDefault);  	}, []); -	var ready = useHookstate(global).ready; -  	return <>  		<div className='appGrid posabs a0'> -			<AppBar position='static' color='transparent' elevation={0}> -				<Toolbar> -					<PressureIcon /> -					<h1>pressure</h1> -				</Toolbar> -			</AppBar> -			<div className='settings fullwidth-inputs posrel' children={<SettingsPane />} /> -			<div className='viewer'> -				<div className={'player posrel ' + (ready.video.available.get() ? '' : 'disabled')}> -					<div className='outer posabs abscenter'> -						<video id='player' ref={playerRef} className='fullwidth' /> -					</div> -				</div> -				<div className={'controls ' + (ready.timeline.get() ? '' : 'disabled')}> -					<div className='posabs abscenter'> -						<Fab -							size='small' -							children={<SkipPreviousRoundedIcon />} -							onClick={() => { -								player.slide = 0; -								player.previous(); -							}} -						/> -						<Fab -							className={'playPause ' + (ready.video.playable.get() ? '' : 'disabled')} -							size='medium' -							onClick={() => { -								player.next(); -								player.player.play(); -							}} -							children={<PlaySkipIconAni />} -							style={{ '--ani-state': playing.get() ? 'skip' : 'play' } as CSSProperties} -						/> -						<Fab size='small' children={<NavigateBeforeRoundedIcon />} onClick={() => player.previous()} /> -						<Fab -							size='small' -							children={<NavigateNextRoundedIcon />} -							onClick={() => { -								player.next(); // TODO: fix jank here -								player.next(); -								player.previous(); -							}} -						/> -					</div> -					<div className='posabs abscenterv r0'> -						<Fab -							size='small' -							children={<FullscreenRoundedIcon />} -							onClick={() => document.body.requestFullscreen()} -						/> -					</div> -				</div> -			</div> +			<TitleBar /> +			<SettingsPane /> +			<Player />  			<Tools />  			<TimelineEditor />  		</div> @@ -76,6 +76,11 @@    resolved "https://registry.yarnpkg.com/@hookstate/core/-/core-3.0.8.tgz#d6838153d6d43c2f35cfca475c31248192564e62"    integrity sha512-blQagGIVIbNoUiNCRrvaXqFmUe7WGMY35ok/LENfl2pcIsLBjkreYIZiaSFi83tkycwq7ZOmcQz/R1nvLKhH8w== +"@hookstate/untracked@^3.0.0": +  version "3.0.0" +  resolved "https://registry.yarnpkg.com/@hookstate/untracked/-/untracked-3.0.0.tgz#fcf5005f89a68956c994ffb4b04cc3bd25d7cbf6" +  integrity sha512-NctZVu0fEXc+komMmEpJ4OAD77P1P4uhXnU8e2Y1l+k0P+ZCE+enTDvgg9rp2WmViD7s8XA2+lS7wTkHGargmw== +  "@material-ui/core@^4.11.4":    version "4.11.4"    resolved "https://registry.yarnpkg.com/@material-ui/core/-/core-4.11.4.tgz#4fb9fe5dec5dcf780b687e3a40cff78b2b9640a4" |