import PropTypes from 'prop-types';
import React, { createContext, useEffect, useState } from 'react';
import { Message } from 'roslib';
import { useCheckedContext } from '../common';
import { useRos } from '../RosConnection';
import { DefaultMessageType, subscribe, TopicSettings, unsubscribe } from './getTopic';
const MessageContext = createContext(new Message({}));
export const Subscriber = (props: SubscriberComponentProps) => {
const ros = useRos();
const [message, setMessage] = useState(new Message(props.messageInitialValue));
const {topic, messageType, throttleRate, latch, queueLength, queueSize, customCallback, ...other} = props;
const topicSettings: TopicSettings = {
topic,
messageType,
throttleRate,
latch,
queueLength,
queueSize
};
const callback = customCallback || ((newMessage: Message) => {setMessage(newMessage)});
useEffect(() => {
const topic = subscribe(
ros,
topicSettings,
callback,
);
return () => {
unsubscribe(topic, callback);
}
}, []);
return (
{props.children}
);
}
export interface SubscriberProps extends TopicSettings {
customCallback?: (msg: TMessage) => void;
messageInitialValue?: TMessage;
}
type SubscriberComponentProps = React.PropsWithChildren>;
Subscriber.propTypes = {
children: PropTypes.node,
topic: PropTypes.string.isRequired,
messageType: PropTypes.string.isRequired,
throttleRate: PropTypes.number,
latch: PropTypes.bool,
queueLength: PropTypes.number,
queueSize: PropTypes.number,
messageInitialValue: PropTypes.object,
}
export function useMsg(): Message {
return useCheckedContext(MessageContext);
}