import React, { useState, useEffect, useMemo } from 'react'; import { toast } from 'react-toastify'; import { Icon, Loader } from 'UI'; import IntegrateSlackButton from '../IntegrateSlackButton/IntegrateSlackButton'; import SessionCopyLink from './SessionCopyLink'; import { Button, Divider, Form, Input, Segmented, Select, Space } from 'antd'; import { observer } from 'mobx-react-lite'; import { useStore } from 'App/mstore'; interface Channel { webhookId: string; name: string; } interface Props { showCopyLink?: boolean; hideModal: () => void; time: number; } const ShareModalComp: React.FC = ({ showCopyLink, hideModal, time }) => { const { integrationsStore, sessionStore } = useStore(); const sessionId = sessionStore.current.sessionId; const slackChannels: Channel[] = integrationsStore.slack.list || []; const msTeamsChannels: Channel[] = integrationsStore.msteams.list || []; const slackLoaded = integrationsStore.slack.loaded; const msTeamsLoaded = integrationsStore.msteams.loaded; const fetchSlack = integrationsStore.slack.fetchIntegrations; const fetchTeams = integrationsStore.msteams.fetchIntegrations; const sendSlackMsg = integrationsStore.slack.sendMessage; const sendMsTeamsMsg = integrationsStore.msteams.sendMessage; const [shareTo, setShareTo] = useState<'slack' | 'teams'>('slack'); const [comment, setComment] = useState(''); const [channelId, setChannelId] = useState(slackChannels[0]?.webhookId); const [teamsChannel, setTeamsChannel] = useState(msTeamsChannels[0]?.webhookId); const [loadingSlack, setLoadingSlack] = useState(false); const [loadingTeams, setLoadingTeams] = useState(false); useEffect(() => { if (slackChannels.length === 0 && !slackLoaded) void fetchSlack(); }, [slackChannels, slackLoaded, fetchSlack]); useEffect(() => { if (msTeamsChannels.length === 0 && !msTeamsLoaded) void fetchTeams(); }, [msTeamsChannels, msTeamsLoaded, fetchTeams]); useEffect(() => { if (slackChannels.length && !channelId) { setChannelId(slackChannels[0].webhookId); } }, [slackChannels, channelId]); useEffect(() => { if (msTeamsChannels.length && !teamsChannel) { setTeamsChannel(msTeamsChannels[0].webhookId); } }, [msTeamsChannels, teamsChannel]); const editMessage = (e: React.ChangeEvent) => setComment(e.target.value); const shareToSlack = async () => { if (!channelId) return; setLoadingSlack(true); try { await sendSlackMsg({ integrationId: channelId, entity: 'sessions', entityId: sessionId, data: { comment } }); toast.success('Sent to Slack.'); hideModal(); } catch { toast.error('Failed to send to Slack.'); } finally { setLoadingSlack(false); } }; const shareToMSTeams = async () => { if (!teamsChannel) return; setLoadingTeams(true); try { await sendMsTeamsMsg({ integrationId: teamsChannel, entity: 'sessions', entityId: sessionId, data: { comment } }); toast.success('Sent to MS Teams.'); hideModal(); } catch { toast.error('Failed to send to MS Teams.'); } finally { setLoadingTeams(false); } }; const changeSlackChannel = (value: string) => setChannelId(value); const changeTeamsChannel = (value: string) => setTeamsChannel(value); const slackOptions = useMemo( () => slackChannels.map(({ webhookId, name }) => ({ value: webhookId, label: name })), [slackChannels] ); const msTeamsOptions = useMemo( () => msTeamsChannels.map(({ webhookId, name }) => ({ value: webhookId, label: name })), [msTeamsChannels] ); const sendMsg = async () => { shareTo === 'slack' ? await shareToSlack() : await shareToMSTeams(); }; const hasBoth = slackOptions.length > 0 && msTeamsOptions.length > 0; const hasNothing = slackOptions.length === 0 && msTeamsOptions.length === 0; const isLoading = loadingSlack || loadingTeams; const handleSegmentChange = (value: string) => { const newShareTo = value as 'slack' | 'teams'; setShareTo(newShareTo); if (newShareTo === 'slack' && slackOptions.length > 0) { setChannelId(slackOptions[0].value); } else if (newShareTo === 'teams' && msTeamsOptions.length > 0) { setTeamsChannel(msTeamsOptions[0].value); } }; return (
{isLoading ? ( ) : ( <> {!hasNothing ? ( <>
{hasBoth ? (
Slack
), value: 'slack' }, { label: (
MS Teams
), value: 'teams' } ]} onChange={handleSegmentChange} value={shareTo} /> ) : (
0 ? 'integrations/slack-bw' : 'integrations/teams-white'} size={16} />
{slackOptions.length > 0 ? 'Slack' : 'MS Teams'}
)} {shareTo === 'slack' ? ( ) : ( )} ) : ( <> {showCopyLink && ( <>
)} )} )}
); }; export default observer(ShareModalComp);