web
You’re offline. This is a read only version of the page.
close
Skip to main content

Announcements

News and Announcements icon
Community site session details

Community site session details

Session Id :
Copilot Studio
Unanswered

Botframework-webchat

(0) ShareShare
ReportReport
Posted on by 3

Hello,

I use Botframework-webchat and create a react18 project from url below

https://github.com/microsoft/BotFramework-WebChat/tree/master/samples

I use the sample demo from

https://microsoft.github.io/BotFramework-WebChat/01.getting-started/b.minimal-bundle/

It can upload file and click download link from the responsed file(newfile.png).

but in my code below i don't known how to handle it to response my file url(i already upload my file to my blob container)

and i also don't known how to use the dispatchs and meanings

Could somebody help me handle this and explain how to use dispatchs in React18 BotFramework-WebChat  thanks.

 

 

import classNames from 'classnames';
import React, { useCallback, useMemo, useState } from 'react';
import { createStore, createStyleSet } from 'botframework-webchat';

import WebChat from './WebChat';

import './fabric-icons-inline.css';
import './MinimizableWebChat.css';
import { BlobItem,BlobServiceClient,BlockBlobClient } from '@azure/storage-blob';
const MinimizableWebChat = () => {
 const store = useMemo(
 () =>
 createStore({}, ({ dispatch }) => next => action => {
 if (action.type === 'DIRECT_LINE/CONNECT_FULFILLED') {
 dispatch({
 type: 'WEB_CHAT/SEND_EVENT',
 payload: {
 name: 'webchat/join',
 value: {
 language: window.navigator.language
 }
 }
 });
 }
 else if(action.type==='WEB_CHAT/SEND_FILES'){
 (async function() {
 // Tells the bot that you are uploading files. This is optional.
 dispatch({ type: 'WEB_CHAT/SEND_TYPING' });
 const account = "";
 const sas = "";
 const files = action.payload.files[0]
 const fileName = files.name
 const blobServiceClient = new BlobServiceClient(
 `https://${account}.blob.core.windows.net${sas}`
 );
 const containerClient = blobServiceClient.getContainerClient(
 "userupload"
 );
 const blockBlobClient = containerClient.getBlockBlobClient(fileName);
 fetch(files.url)
 .then(response => {
 if (!response.ok) {
 throw new Error('Network response was not ok');
 }
 return response.blob();
 })
 .then(async blobData => {
 
 await blockBlobClient.uploadBrowserData(blobData);

 console.log(`Blob "${fileName}" uploaded successfully.`);
 })
 .catch(error => {
 console.error('Error:', error);
 });
 })().catch(err => console.error(err));
 }
 else if (action.type === 'DIRECT_LINE/INCOMING_ACTIVITY') {
 if (action.payload.activity.from.role === 'bot') {
 setNewMessage(true);
 }
 }
 return next(action);
 }),
 []
 );
 const styleSet = useMemo(
 () =>
 createStyleSet({
 backgroundColor: 'Transparent'
 }),
 []
 );
 const [loaded, setLoaded] = useState(false);
 const [minimized, setMinimized] = useState(true);
 const [newMessage, setNewMessage] = useState(false);
 const [side, setSide] = useState('right');
 const [token, setToken] = useState();
 const [userID,setUserID]=useState();
 const handleFetchToken = useCallback(async () => {
 let token;
 if (!token) {
 const res = await fetch('', { method: 'GET' });
 const { token,conversationId } = await res.json();
 console.log(conversationId)
 setUserID(conversationId);
 setToken(token);
 }
 }, [ ]);
 const handleMaximizeButtonClick = useCallback(async () => {
 setLoaded(true);
 setMinimized(false);
 setNewMessage(false);
 }, [setMinimized, setNewMessage]);

 const handleMinimizeButtonClick = useCallback(() => {
 setMinimized(true);
 setNewMessage(false);
 }, [setMinimized, setNewMessage]);

 const handleSwitchButtonClick = useCallback(() => {
 setSide(side === 'left' ? 'right' : 'left');
 }, [setSide, side]);

 return (
 <div className="minimizable-web-chat">
 {minimized && (
 <button className="maximize" onClick={handleMaximizeButtonClick}>
 <span className={token ? 'ms-Icon ms-Icon--MessageFill' : 'ms-Icon ms-Icon--Message'} />
 {newMessage && <span className="ms-Icon ms-Icon--CircleShapeSolid red-dot" />}
 </button>
 )}
 {loaded && (
 <div className={classNames(side === 'left' ? 'chat-box left' : 'chat-box right', minimized ? 'hide' : '')}>
 <header>
 <div className="filler" />
 <button className="switch" onClick={handleSwitchButtonClick}>
 <span className="ms-Icon ms-Icon--Switch" />
 </button>
 <button className="minimize" onClick={handleMinimizeButtonClick}>
 <span className="ms-Icon ms-Icon--ChromeMinimize" />
 </button>
 </header>
 <WebChat
 className="react-web-chat"
 onFetchToken={handleFetchToken}
 store={store}
 styleSet={styleSet}
 token={token}
 userID={userID}
 />
 </div>
 )}
 </div>
 );
};

export default MinimizableWebChat;

 

 

 

 

 

 

 

upload.png
newfile.png
Categories:
I have the same question (0)

Under review

Thank you for your reply! To ensure a great experience for everyone, your content is awaiting approval by our Community Managers. Please check back later.

Helpful resources

Quick Links

Introducing the 2026 Season 1 community Super Users

Congratulations to our 2026 Super Users!

Kudos to our 2025 Community Spotlight Honorees

Congratulations to our 2025 community superstars!

Congratulations to the April Top 10 Community Leaders!

These are the community rock stars!

Leaderboard > Copilot Studio

#1
Valantis Profile Picture

Valantis 796

#2
Vish WR Profile Picture

Vish WR 335

#3
Haque Profile Picture

Haque 278

Last 30 days Overall leaderboard