57 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			57 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import type { Reducer } from '@reduxjs/toolkit';
 | |
| 
 | |
| import {
 | |
|   deployPictureInPictureAction,
 | |
|   removePictureInPicture,
 | |
| } from 'mastodon/actions/picture_in_picture';
 | |
| import { timelineDelete } from 'mastodon/actions/timelines_typed';
 | |
| 
 | |
| export interface PIPMediaProps {
 | |
|   src: string;
 | |
|   muted: boolean;
 | |
|   volume: number;
 | |
|   currentTime: number;
 | |
|   poster: string;
 | |
|   backgroundColor: string;
 | |
|   foregroundColor: string;
 | |
|   accentColor: string;
 | |
| }
 | |
| 
 | |
| interface PIPStateWithValue extends Partial<PIPMediaProps> {
 | |
|   statusId: string;
 | |
|   accountId: string;
 | |
|   type: 'audio' | 'video';
 | |
| }
 | |
| 
 | |
| interface PIPStateEmpty extends Partial<PIPMediaProps> {
 | |
|   type: null;
 | |
| }
 | |
| 
 | |
| type PIPState = PIPStateWithValue | PIPStateEmpty;
 | |
| 
 | |
| const initialState = {
 | |
|   type: null,
 | |
|   muted: false,
 | |
|   volume: 0,
 | |
|   currentTime: 0,
 | |
| };
 | |
| 
 | |
| export const pictureInPictureReducer: Reducer<PIPState> = (
 | |
|   state = initialState,
 | |
|   action,
 | |
| ) => {
 | |
|   if (deployPictureInPictureAction.match(action))
 | |
|     return {
 | |
|       statusId: action.payload.statusId,
 | |
|       accountId: action.payload.accountId,
 | |
|       type: action.payload.playerType,
 | |
|       ...action.payload.props,
 | |
|     };
 | |
|   else if (removePictureInPicture.match(action)) return initialState;
 | |
|   else if (timelineDelete.match(action))
 | |
|     if (state.type && state.statusId === action.payload.statusId)
 | |
|       return initialState;
 | |
| 
 | |
|   return state;
 | |
| };
 |