Extract useRoomState hook into hooks directory
							parent
							
								
									a7eb09af1e
								
							
						
					
					
						commit
						4725a9e8fa
					
				| 
						 | 
					@ -28,6 +28,7 @@ import { useEventEmitter } from "../../../hooks/useEventEmitter";
 | 
				
			||||||
import PinningUtils from "../../../utils/PinningUtils";
 | 
					import PinningUtils from "../../../utils/PinningUtils";
 | 
				
			||||||
import { useAsyncMemo } from "../../../hooks/useAsyncMemo";
 | 
					import { useAsyncMemo } from "../../../hooks/useAsyncMemo";
 | 
				
			||||||
import PinnedEventTile from "../rooms/PinnedEventTile";
 | 
					import PinnedEventTile from "../rooms/PinnedEventTile";
 | 
				
			||||||
 | 
					import { useRoomState } from "../../../hooks/useRoomState";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
interface IProps {
 | 
					interface IProps {
 | 
				
			||||||
    room: Room;
 | 
					    room: Room;
 | 
				
			||||||
| 
						 | 
					@ -75,24 +76,6 @@ export const useReadPinnedEvents = (room: Room): Set<string> => {
 | 
				
			||||||
    return readPinnedEvents;
 | 
					    return readPinnedEvents;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const useRoomState = <T extends any>(room: Room, mapper: (state: RoomState) => T): T => {
 | 
					 | 
				
			||||||
    const [value, setValue] = useState<T>(room ? mapper(room.currentState) : undefined);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    const update = useCallback(() => {
 | 
					 | 
				
			||||||
        if (!room) return;
 | 
					 | 
				
			||||||
        setValue(mapper(room.currentState));
 | 
					 | 
				
			||||||
    }, [room, mapper]);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    useEventEmitter(room?.currentState, "RoomState.events", update);
 | 
					 | 
				
			||||||
    useEffect(() => {
 | 
					 | 
				
			||||||
        update();
 | 
					 | 
				
			||||||
        return () => {
 | 
					 | 
				
			||||||
            setValue(undefined);
 | 
					 | 
				
			||||||
        };
 | 
					 | 
				
			||||||
    }, [update]);
 | 
					 | 
				
			||||||
    return value;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const PinnedMessagesCard = ({ room, onClose }: IProps) => {
 | 
					const PinnedMessagesCard = ({ room, onClose }: IProps) => {
 | 
				
			||||||
    const cli = useContext(MatrixClientContext);
 | 
					    const cli = useContext(MatrixClientContext);
 | 
				
			||||||
    const canUnpin = useRoomState(room, state => state.mayClientSendStateEvent(EventType.RoomPinnedEvents, cli));
 | 
					    const canUnpin = useRoomState(room, state => state.mayClientSendStateEvent(EventType.RoomPinnedEvents, cli));
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,40 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					Copyright 2021 The Matrix.org Foundation C.I.C.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Licensed under the Apache License, Version 2.0 (the "License");
 | 
				
			||||||
 | 
					you may not use this file except in compliance with the License.
 | 
				
			||||||
 | 
					You may obtain a copy of the License at
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    http://www.apache.org/licenses/LICENSE-2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Unless required by applicable law or agreed to in writing, software
 | 
				
			||||||
 | 
					distributed under the License is distributed on an "AS IS" BASIS,
 | 
				
			||||||
 | 
					WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
				
			||||||
 | 
					See the License for the specific language governing permissions and
 | 
				
			||||||
 | 
					limitations under the License.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { useCallback, useEffect, useState } from "react";
 | 
				
			||||||
 | 
					import { Room } from "matrix-js-sdk/src/models/room";
 | 
				
			||||||
 | 
					import { RoomState } from "matrix-js-sdk/src/models/room-state";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import { useEventEmitter } from "./useEventEmitter";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Hook to simplify watching Matrix Room state
 | 
				
			||||||
 | 
					export const useRoomState = <T extends any>(room: Room, mapper: (state: RoomState) => T): T => {
 | 
				
			||||||
 | 
					    const [value, setValue] = useState<T>(room ? mapper(room.currentState) : undefined);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const update = useCallback(() => {
 | 
				
			||||||
 | 
					        if (!room) return;
 | 
				
			||||||
 | 
					        setValue(mapper(room.currentState));
 | 
				
			||||||
 | 
					    }, [room, mapper]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    useEventEmitter(room?.currentState, "RoomState.events", update);
 | 
				
			||||||
 | 
					    useEffect(() => {
 | 
				
			||||||
 | 
					        update();
 | 
				
			||||||
 | 
					        return () => {
 | 
				
			||||||
 | 
					            setValue(undefined);
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					    }, [update]);
 | 
				
			||||||
 | 
					    return value;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
		Loading…
	
		Reference in New Issue