80 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import { useCallback } from 'react';
 | |
| 
 | |
| import { removePictureInPicture } from 'mastodon/actions/picture_in_picture';
 | |
| import Audio from 'mastodon/features/audio';
 | |
| import Video from 'mastodon/features/video';
 | |
| import { useAppDispatch, useAppSelector } from 'mastodon/store/typed_functions';
 | |
| 
 | |
| import Footer from './components/footer';
 | |
| import { Header } from './components/header';
 | |
| 
 | |
| export const PictureInPicture: React.FC = () => {
 | |
|   const dispatch = useAppDispatch();
 | |
| 
 | |
|   const handleClose = useCallback(() => {
 | |
|     dispatch(removePictureInPicture());
 | |
|   }, [dispatch]);
 | |
| 
 | |
|   const pipState = useAppSelector((s) => s.picture_in_picture);
 | |
| 
 | |
|   if (pipState.type === null) {
 | |
|     return null;
 | |
|   }
 | |
| 
 | |
|   const {
 | |
|     type,
 | |
|     src,
 | |
|     currentTime,
 | |
|     accountId,
 | |
|     statusId,
 | |
|     volume,
 | |
|     muted,
 | |
|     poster,
 | |
|     backgroundColor,
 | |
|     foregroundColor,
 | |
|     accentColor,
 | |
|   } = pipState;
 | |
| 
 | |
|   let player;
 | |
| 
 | |
|   switch (type) {
 | |
|     case 'video':
 | |
|       player = (
 | |
|         <Video
 | |
|           src={src}
 | |
|           currentTime={currentTime}
 | |
|           volume={volume}
 | |
|           muted={muted}
 | |
|           autoPlay
 | |
|           inline
 | |
|           alwaysVisible
 | |
|         />
 | |
|       );
 | |
|       break;
 | |
|     case 'audio':
 | |
|       player = (
 | |
|         <Audio
 | |
|           src={src}
 | |
|           currentTime={currentTime}
 | |
|           volume={volume}
 | |
|           muted={muted}
 | |
|           poster={poster}
 | |
|           backgroundColor={backgroundColor}
 | |
|           foregroundColor={foregroundColor}
 | |
|           accentColor={accentColor}
 | |
|           autoPlay
 | |
|         />
 | |
|       );
 | |
|   }
 | |
| 
 | |
|   return (
 | |
|     <div className='picture-in-picture'>
 | |
|       <Header accountId={accountId} statusId={statusId} onClose={handleClose} />
 | |
| 
 | |
|       {player}
 | |
| 
 | |
|       <Footer statusId={statusId} />
 | |
|     </div>
 | |
|   );
 | |
| };
 |