Merge pull request #22656 from drodil/signals_types
feat: allow defining signal type
This commit is contained in:
@@ -9,9 +9,9 @@ import { JsonObject } from '@backstage/types';
|
||||
// @public (undocumented)
|
||||
export interface SignalApi {
|
||||
// (undocumented)
|
||||
subscribe(
|
||||
subscribe<TMessage extends JsonObject = JsonObject>(
|
||||
channel: string,
|
||||
onMessage: (message: JsonObject) => void,
|
||||
onMessage: (message: TMessage) => void,
|
||||
): SignalSubscriber;
|
||||
}
|
||||
|
||||
@@ -25,8 +25,10 @@ export interface SignalSubscriber {
|
||||
}
|
||||
|
||||
// @public (undocumented)
|
||||
export const useSignal: (channel: string) => {
|
||||
lastSignal: JsonObject | null;
|
||||
export const useSignal: <TMessage extends JsonObject = JsonObject>(
|
||||
channel: string,
|
||||
) => {
|
||||
lastSignal: TMessage | null;
|
||||
isSignalsAvailable: boolean;
|
||||
};
|
||||
|
||||
|
||||
@@ -28,8 +28,8 @@ export interface SignalSubscriber {
|
||||
|
||||
/** @public */
|
||||
export interface SignalApi {
|
||||
subscribe(
|
||||
subscribe<TMessage extends JsonObject = JsonObject>(
|
||||
channel: string,
|
||||
onMessage: (message: JsonObject) => void,
|
||||
onMessage: (message: TMessage) => void,
|
||||
): SignalSubscriber;
|
||||
}
|
||||
|
||||
@@ -19,18 +19,23 @@ import { JsonObject } from '@backstage/types';
|
||||
import { useEffect, useMemo, useState } from 'react';
|
||||
|
||||
/** @public */
|
||||
export const useSignal = (channel: string) => {
|
||||
export const useSignal = <TMessage extends JsonObject = JsonObject>(
|
||||
channel: string,
|
||||
): { lastSignal: TMessage | null; isSignalsAvailable: boolean } => {
|
||||
const apiHolder = useApiHolder();
|
||||
// Use apiHolder instead useApi in case signalApi is not available in the
|
||||
// backstage instance this is used
|
||||
const signals = apiHolder.get(signalApiRef);
|
||||
const [lastSignal, setLastSignal] = useState<JsonObject | null>(null);
|
||||
const [lastSignal, setLastSignal] = useState<TMessage | null>(null);
|
||||
useEffect(() => {
|
||||
let unsub: null | (() => void) = null;
|
||||
if (signals) {
|
||||
const { unsubscribe } = signals.subscribe(channel, (msg: JsonObject) => {
|
||||
setLastSignal(msg);
|
||||
});
|
||||
const { unsubscribe } = signals.subscribe<TMessage>(
|
||||
channel,
|
||||
(msg: TMessage) => {
|
||||
setLastSignal(msg);
|
||||
},
|
||||
);
|
||||
unsub = unsubscribe;
|
||||
}
|
||||
return () => {
|
||||
|
||||
Reference in New Issue
Block a user