/
githubmirror
/
novu
Обзор
Документация
Войти
/
githubmirror
/
novu
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
next
packages/js/src/ui/api/hooks/useChannelConnection.ts
109 строк
3 KB
George Djabarov
feat(js,react,api-service): implement MS Teams connect and link-user components (#10870)
27 апр 2026, 21:01
Не верифицирован
27 апр 2026, 21:01
c0055bd
Код
Авторство
О чём код?
import { createEffect, createResource, createSignal, onCleanup, onMount } from 'solid-js'; import type { ChannelConnectionResponse, DeleteChannelConnectionArgs, GenerateConnectOAuthUrlArgs, GetChannelConnectionArgs, } from '../../../channel-connections/types'; import { useNovu } from '../../context'; export type UseChannelConnectionOptions = { integrationIdentifier: string; connectionIdentifier?: string; subscriberId?: string; }; export const useChannelConnection = (options: UseChannelConnectionOptions) => { const novuAccessor = useNovu(); const [loading, setLoading] = createSignal(true); const [connection, { mutate, refetch }] = createResource(options, async ({ connectionIdentifier }) => { try { if (!connectionIdentifier) { return null; } const response = await novuAccessor().channelConnections.get({ identifier: connectionIdentifier, }); return response.data ?? null; } catch { return null; } }); const generateConnectOAuthUrl = async (args: GenerateConnectOAuthUrlArgs) => { return novuAccessor().channelConnections.generateConnectOAuthUrl(args); }; const disconnect = async (identifier: string) => { setLoading(true); const response = await novuAccessor().channelConnections.delete({ identifier }); if (!response.error) { mutate(null); } setLoading(false); return response; }; onMount(() => { const currentNovu = novuAccessor(); const cleanupGetPending = currentNovu.on( 'channel-connection.get.pending', ({ args }: { args: GetChannelConnectionArgs }) => { if (!args || args.identifier !== options.connectionIdentifier) { return; } setLoading(true); } ); const cleanupGetResolved = currentNovu.on( 'channel-connection.get.resolved', ({ args, data }: { args: GetChannelConnectionArgs; data?: ChannelConnectionResponse }) => { if (!args || args.identifier !== options.connectionIdentifier) { return; } mutate((data as ChannelConnectionResponse) ?? null); setLoading(false); } ); const cleanupDeletePending = currentNovu.on( 'channel-connection.delete.pending', ({ args }: { args: DeleteChannelConnectionArgs }) => { if (!args || args.identifier !== options.connectionIdentifier) { return; } setLoading(true); } ); const cleanupDeleteResolved = currentNovu.on( 'channel-connection.delete.resolved', ({ args }: { args: DeleteChannelConnectionArgs }) => { if (!args || args.identifier !== options.connectionIdentifier) { return; } mutate(null); setLoading(false); } ); onCleanup(() => { cleanupGetPending(); cleanupGetResolved(); cleanupDeletePending(); cleanupDeleteResolved(); }); }); createEffect(() => { setLoading(connection.loading); }); return { connection, loading, mutate, refetch, generateConnectOAuthUrl, disconnect }; };