¿Alguien puede explicar cómo conectar la recepción de datos en un mensaje websocket al objeto de datos del enlace desde un punto final de API de RTK Query?
No necesitamos almacenar el mensaje que se recibe, solo queremos pasarlo en el argumento de datos del gancho useGetWebsocketResponseQuery para que podamos activar una notificación en la interfaz de usuario.
reducerPath: 'someApi', baseQuery: baseQueryWithReauth, endpoints: (builder) => ({ getWebsocketResponse: builder.query<WebsocketResult, void>({ queryFn: () => ({data: {}), async onCacheEntryAdded(arg, { updateCachedData, cacheDataLoaded, cacheEntryRemoved }) { try { // wait for the initial query to resolve before proceeding await cacheDataLoaded; const socket = io('http://url', {}); socket.on('connect', () => { console.log('socket connected on rtk query'); }); socket.on('message', (message) => { console.log(`received message: ${message}`); // THIS IS WHERE THE DATA NEEDS TO BE WIRED UP TO THE HOOK BUT HOW? }); await cacheEntryRemoved; } catch { // no-op in case `cacheEntryRemoved` resolves before `cacheDataLoaded`, // in which case `cacheDataLoaded` will throw } } }), // Export hooks for usage in functional components, which are // auto-generated based on the defined endpoints export const { useGetWebsocketResponseQuery } = someApi;Parece que esto debería ser posible en el controlador socket.on('message', {}), pero ¿cómo? El método updateCachedData parece que debería ser el camino a seguir, pero no estoy seguro de cómo implementarlo.
Toda la ayuda recibida con gratitud :-)
Muchas gracias,
Sam
ACTUALIZAR con solución de @phry
El problema era que los datos definidos en queryFn debían coincidir con la forma de lo que se agregó desde cacheDataLoaded, es decir, debería ser así:
queryFn: () => ({data: { messages: [] }),y
socket.on('connect', () => { updateCachedData((currentCacheData) => { currentCacheData.messages.push(message); }); });