This repository was archived by the owner on Jan 2, 2026. It is now read-only.

Repository files navigation

react-chat-widget

circle-cinpm

FEArmy

Features

  • Plain text message UI
  • Snippet style for links (only as responses for now)
  • Fully customizable
  • Easy to use

demonstration

Installation

npm

npm install --save react-chat-widget

yarn

yarn add react-chat-widget

Usage

1- Add the Widget component to your root component

importReact,{Component}from'react';import{Widget}from'react-chat-widget';import'react-chat-widget/lib/styles.css';classAppextendsComponent{render(){return(<divclassName="App"><Widget/></div>);}}exportdefaultApp;

2- The only required prop you need to use is the handleNewUserMessage, which will receive the input from the user.

importReact,{Component}from'react';import{Widget}from'react-chat-widget';import'react-chat-widget/lib/styles.css';classAppextendsComponent{handleNewUserMessage=(newMessage)=>{console.log(`New message incoming! ${newMessage}`);// Now send the message throught the backend API}render(){return(<divclassName="App"><WidgethandleNewUserMessage={this.handleNewUserMessage}/></div>);}}exportdefaultApp;

3- Import the methods for you to add messages in the Widget. (See messages)

importReact,{Component}from'react';import{Widget,addResponseMessage}from'react-chat-widget';import'react-chat-widget/lib/styles.css';classAppextendsComponent{componentDidMount(){addResponseMessage("Welcome to this awesome chat!");}handleNewUserMessage=(newMessage)=>{console.log(`New message incoming! ${newMessage}`);// Now send the message throught the backend APIaddResponseMessage(response);}render(){return(<divclassName="App"><WidgethandleNewUserMessage={this.handleNewUserMessage}/></div>);}}exportdefaultApp;

4- Customize the widget to match your app design! You can add both props to manage the title of the widget and the avatar it will use. Of course, feel free to change the styles the widget will have in the CSS

importReact,{Component}from'react';import{Widget,addResponseMessage,addLinkSnippet,addUserMessage}from'react-chat-widget';import'react-chat-widget/lib/styles.css';importlogofrom'./logo.svg';classAppextendsComponent{componentDidMount(){addResponseMessage("Welcome to this awesome chat!");}handleNewUserMessage=(newMessage)=>{console.log(`New message incoming! ${newMessage}`);// Now send the message throught the backend API}render(){return(<divclassName="App"><WidgethandleNewUserMessage={this.handleNewUserMessage}profileAvatar={logo}title="My new awesome title"subtitle="And my cool subtitle"/></div>);}}exportdefaultApp;

API

Props

typerequireddefault valuedescription
handleNewUserMessagePropTypes.funcYESFunction to handle the user input, will receive the full text message when submitted
titlePropTypes.stringNO'Welcome'Title of the widget
subtitlePropTypes.stringNO'This is your chat subtitle'Subtitle of the widget
senderPlaceHolderPropTypes.stringNO'Type a message...'The placeholder of the message input
profileAvatarPropTypes.stringNOThe profile image that will be set on the responses
titleAvatarPropTypes.stringNOThe picture image that will be shown next to the chat title
showCloseButtonPropTypes.boolNOfalseShow or hide the close button in full screen mode
fullScreenModePropTypes.boolNOfalseAllow the use of full screen in full desktop mode
badgePropTypes.numberNO0Display a notification badge on the launcher if the value is greater than 0
autofocusPropTypes.boolNOtrueAutofocus or not the user input
launcherPropTypes.funcNOCustom Launcher component to use instead of the default
handleQuickButtonClickedPropTypes.funcNOFunction to handle the user clicking a quick button, will receive the 'value' when clicked.

Styles

To change the styles you need the widget to have, simply override the CSS classes wrapping them within the containers and add your own style to them! All classes are prefixed with rcw- so they don't override your other classes in case you are not hasing them. To verride, you can do, for expample:

.rcw-conversation-container> .rcw-header {
background-color: red;
}
.rcw-message> .rcw-response {
background-color: black;
color: white;
}

That way, you can leave the JS clean and keep the styles within the CSS.

Messages

If you want to add new messages, you can use the following methods:

  • addResponseMessage

    • params:
      • text
    • Method to add a new message written as a response to a user input.
  • addUserMessage

    • params:
      • text
    • This method will add a new message written as a user. Keep in mind it will not trigger the prop handleNewUserMessage()
  • addLinkSnippet

    • params:
      • link
    • Method to add a link snippet. For now, you need to provide this method with a link object, which must be in the shape of:
      {title: 'My awesome link',link: 'https://github.com/Wolox/react-chat-widget',target: '_blank'}
    • By default, target value is _blank which will open the link in a new window.
  • renderCustomComponent

    • params:
      • component: Component to be render,
      • props: props the component needs,
      • showAvatar: boolean, default value: false; the component will be rendered with the avatar like the messages
    • Method to render a custom component inse the messages container. With this method, you can add whatever component you need the widget to have.
  • setQuickButtons

    • params:
      • buttons: An array of objects with the keys label and value

Markdown is supported for the responses and user messages.

Widget behavior

You can also control certain actions of the widget:

  • toggleWidget

    • params: No params expected
    • This method is to toggle the widget at will without the need to trigger the click event on the launcher
  • toggleInputDisabled

    • params: No params expected
    • Method to toggle the availability of the message input for the user to write on

Widget components

Custom Launcher

You can use a custom component for the Launcher if you need one that's not the default, simply use the launcher prop like:

launcher={handleToggle=>this.getCustomLauncher(handleToggle)}

getCustomLauncher() is a method that will return the Launcher component. By default, the function passed by that prop, will receive the handleToggle parameter which is the method that will toggle the widget.

For example, if you want to use a simple button to toggle the widget:

launcher={handleToggle=>(<buttononClick={handleToggle}>Toggle</button>)}

About

This project is maintained by Martín Callegari and it was written by Wolox.

Wolox

About

Awesome chat widget for your React App

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
This repository was archived by the owner on Jan 2, 2026. It is now read-only.

Repository files navigation

react-chat-widget

circle-cinpm

FEArmy

Features

  • Plain text message UI
  • Snippet style for links (only as responses for now)
  • Fully customizable
  • Easy to use

demonstration

Installation

npm

npm install --save react-chat-widget

yarn

yarn add react-chat-widget

Usage

1- Add the Widget component to your root component

importReact,{Component}from'react';import{Widget}from'react-chat-widget';import'react-chat-widget/lib/styles.css';classAppextendsComponent{render(){return(<divclassName="App"><Widget/></div>);}}exportdefaultApp;

2- The only required prop you need to use is the handleNewUserMessage, which will receive the input from the user.

importReact,{Component}from'react';import{Widget}from'react-chat-widget';import'react-chat-widget/lib/styles.css';classAppextendsComponent{handleNewUserMessage=(newMessage)=>{console.log(`New message incoming! ${newMessage}`);// Now send the message throught the backend API}render(){return(<divclassName="App"><WidgethandleNewUserMessage={this.handleNewUserMessage}/></div>);}}exportdefaultApp;

3- Import the methods for you to add messages in the Widget. (See messages)

importReact,{Component}from'react';import{Widget,addResponseMessage}from'react-chat-widget';import'react-chat-widget/lib/styles.css';classAppextendsComponent{componentDidMount(){addResponseMessage("Welcome to this awesome chat!");}handleNewUserMessage=(newMessage)=>{console.log(`New message incoming! ${newMessage}`);// Now send the message throught the backend APIaddResponseMessage(response);}render(){return(<divclassName="App"><WidgethandleNewUserMessage={this.handleNewUserMessage}/></div>);}}exportdefaultApp;

4- Customize the widget to match your app design! You can add both props to manage the title of the widget and the avatar it will use. Of course, feel free to change the styles the widget will have in the CSS

importReact,{Component}from'react';import{Widget,addResponseMessage,addLinkSnippet,addUserMessage}from'react-chat-widget';import'react-chat-widget/lib/styles.css';importlogofrom'./logo.svg';classAppextendsComponent{componentDidMount(){addResponseMessage("Welcome to this awesome chat!");}handleNewUserMessage=(newMessage)=>{console.log(`New message incoming! ${newMessage}`);// Now send the message throught the backend API}render(){return(<divclassName="App"><WidgethandleNewUserMessage={this.handleNewUserMessage}profileAvatar={logo}title="My new awesome title"subtitle="And my cool subtitle"/></div>);}}exportdefaultApp;

API

Props

typerequireddefault valuedescription
handleNewUserMessagePropTypes.funcYESFunction to handle the user input, will receive the full text message when submitted
titlePropTypes.stringNO'Welcome'Title of the widget
subtitlePropTypes.stringNO'This is your chat subtitle'Subtitle of the widget
senderPlaceHolderPropTypes.stringNO'Type a message...'The placeholder of the message input
profileAvatarPropTypes.stringNOThe profile image that will be set on the responses
titleAvatarPropTypes.stringNOThe picture image that will be shown next to the chat title
showCloseButtonPropTypes.boolNOfalseShow or hide the close button in full screen mode
fullScreenModePropTypes.boolNOfalseAllow the use of full screen in full desktop mode
badgePropTypes.numberNO0Display a notification badge on the launcher if the value is greater than 0
autofocusPropTypes.boolNOtrueAutofocus or not the user input
launcherPropTypes.funcNOCustom Launcher component to use instead of the default
handleQuickButtonClickedPropTypes.funcNOFunction to handle the user clicking a quick button, will receive the 'value' when clicked.

Styles

To change the styles you need the widget to have, simply override the CSS classes wrapping them within the containers and add your own style to them! All classes are prefixed with rcw- so they don't override your other classes in case you are not hasing them. To verride, you can do, for expample:

.rcw-conversation-container> .rcw-header {
background-color: red;
}
.rcw-message> .rcw-response {
background-color: black;
color: white;
}

That way, you can leave the JS clean and keep the styles within the CSS.

Messages

If you want to add new messages, you can use the following methods:

  • addResponseMessage

    • params:
      • text
    • Method to add a new message written as a response to a user input.
  • addUserMessage

    • params:
      • text
    • This method will add a new message written as a user. Keep in mind it will not trigger the prop handleNewUserMessage()
  • addLinkSnippet

    • params:
      • link
    • Method to add a link snippet. For now, you need to provide this method with a link object, which must be in the shape of:
      {title: 'My awesome link',link: 'https://github.com/Wolox/react-chat-widget',target: '_blank'}
    • By default, target value is _blank which will open the link in a new window.
  • renderCustomComponent

    • params:
      • component: Component to be render,
      • props: props the component needs,
      • showAvatar: boolean, default value: false; the component will be rendered with the avatar like the messages
    • Method to render a custom component inse the messages container. With this method, you can add whatever component you need the widget to have.
  • setQuickButtons

    • params:
      • buttons: An array of objects with the keys label and value

Markdown is supported for the responses and user messages.

Widget behavior

You can also control certain actions of the widget:

  • toggleWidget

    • params: No params expected
    • This method is to toggle the widget at will without the need to trigger the click event on the launcher
  • toggleInputDisabled

    • params: No params expected
    • Method to toggle the availability of the message input for the user to write on

Widget components

Custom Launcher

You can use a custom component for the Launcher if you need one that's not the default, simply use the launcher prop like:

launcher={handleToggle=>this.getCustomLauncher(handleToggle)}

getCustomLauncher() is a method that will return the Launcher component. By default, the function passed by that prop, will receive the handleToggle parameter which is the method that will toggle the widget.

For example, if you want to use a simple button to toggle the widget:

launcher={handleToggle=>(<buttononClick={handleToggle}>Toggle</button>)}

About

This project is maintained by Martín Callegari and it was written by Wolox.

Wolox

About

Awesome chat widget for your React App

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Jan 2, 2026. It is now read-only.

Repository files navigation

react-chat-widget

circle-cinpm

FEArmy

Features

  • Plain text message UI
  • Snippet style for links (only as responses for now)
  • Fully customizable
  • Easy to use

demonstration

Installation

npm

npm install --save react-chat-widget

yarn

yarn add react-chat-widget

Usage

1- Add the Widget component to your root component

importReact,{Component}from'react';import{Widget}from'react-chat-widget';import'react-chat-widget/lib/styles.css';classAppextendsComponent{render(){return(<divclassName="App"><Widget/></div>);}}exportdefaultApp;

2- The only required prop you need to use is the handleNewUserMessage, which will receive the input from the user.

importReact,{Component}from'react';import{Widget}from'react-chat-widget';import'react-chat-widget/lib/styles.css';classAppextendsComponent{handleNewUserMessage=(newMessage)=>{console.log(`New message incoming! ${newMessage}`);// Now send the message throught the backend API}render(){return(<divclassName="App"><WidgethandleNewUserMessage={this.handleNewUserMessage}/></div>);}}exportdefaultApp;

3- Import the methods for you to add messages in the Widget. (See messages)

importReact,{Component}from'react';import{Widget,addResponseMessage}from'react-chat-widget';import'react-chat-widget/lib/styles.css';classAppextendsComponent{componentDidMount(){addResponseMessage("Welcome to this awesome chat!");}handleNewUserMessage=(newMessage)=>{console.log(`New message incoming! ${newMessage}`);// Now send the message throught the backend APIaddResponseMessage(response);}render(){return(<divclassName="App"><WidgethandleNewUserMessage={this.handleNewUserMessage}/></div>);}}exportdefaultApp;

4- Customize the widget to match your app design! You can add both props to manage the title of the widget and the avatar it will use. Of course, feel free to change the styles the widget will have in the CSS

importReact,{Component}from'react';import{Widget,addResponseMessage,addLinkSnippet,addUserMessage}from'react-chat-widget';import'react-chat-widget/lib/styles.css';importlogofrom'./logo.svg';classAppextendsComponent{componentDidMount(){addResponseMessage("Welcome to this awesome chat!");}handleNewUserMessage=(newMessage)=>{console.log(`New message incoming! ${newMessage}`);// Now send the message throught the backend API}render(){return(<divclassName="App"><WidgethandleNewUserMessage={this.handleNewUserMessage}profileAvatar={logo}title="My new awesome title"subtitle="And my cool subtitle"/></div>);}}exportdefaultApp;

API

Props

typerequireddefault valuedescription
handleNewUserMessagePropTypes.funcYESFunction to handle the user input, will receive the full text message when submitted
titlePropTypes.stringNO'Welcome'Title of the widget
subtitlePropTypes.stringNO'This is your chat subtitle'Subtitle of the widget
senderPlaceHolderPropTypes.stringNO'Type a message...'The placeholder of the message input
profileAvatarPropTypes.stringNOThe profile image that will be set on the responses
titleAvatarPropTypes.stringNOThe picture image that will be shown next to the chat title
showCloseButtonPropTypes.boolNOfalseShow or hide the close button in full screen mode
fullScreenModePropTypes.boolNOfalseAllow the use of full screen in full desktop mode
badgePropTypes.numberNO0Display a notification badge on the launcher if the value is greater than 0
autofocusPropTypes.boolNOtrueAutofocus or not the user input
launcherPropTypes.funcNOCustom Launcher component to use instead of the default
handleQuickButtonClickedPropTypes.funcNOFunction to handle the user clicking a quick button, will receive the 'value' when clicked.

Styles

To change the styles you need the widget to have, simply override the CSS classes wrapping them within the containers and add your own style to them! All classes are prefixed with rcw- so they don't override your other classes in case you are not hasing them. To verride, you can do, for expample:

.rcw-conversation-container> .rcw-header {
background-color: red;
}
.rcw-message> .rcw-response {
background-color: black;
color: white;
}

That way, you can leave the JS clean and keep the styles within the CSS.

Messages

If you want to add new messages, you can use the following methods:

  • addResponseMessage

    • params:
      • text
    • Method to add a new message written as a response to a user input.
  • addUserMessage

    • params:
      • text
    • This method will add a new message written as a user. Keep in mind it will not trigger the prop handleNewUserMessage()
  • addLinkSnippet

    • params:
      • link
    • Method to add a link snippet. For now, you need to provide this method with a link object, which must be in the shape of:
      {title: 'My awesome link',link: 'https://github.com/Wolox/react-chat-widget',target: '_blank'}
    • By default, target value is _blank which will open the link in a new window.
  • renderCustomComponent

    • params:
      • component: Component to be render,
      • props: props the component needs,
      • showAvatar: boolean, default value: false; the component will be rendered with the avatar like the messages
    • Method to render a custom component inse the messages container. With this method, you can add whatever component you need the widget to have.
  • setQuickButtons

    • params:
      • buttons: An array of objects with the keys label and value

Markdown is supported for the responses and user messages.

Widget behavior

You can also control certain actions of the widget:

  • toggleWidget

    • params: No params expected
    • This method is to toggle the widget at will without the need to trigger the click event on the launcher
  • toggleInputDisabled

    • params: No params expected
    • Method to toggle the availability of the message input for the user to write on

Widget components

Custom Launcher

You can use a custom component for the Launcher if you need one that's not the default, simply use the launcher prop like:

launcher={handleToggle=>this.getCustomLauncher(handleToggle)}

getCustomLauncher() is a method that will return the Launcher component. By default, the function passed by that prop, will receive the handleToggle parameter which is the method that will toggle the widget.

For example, if you want to use a simple button to toggle the widget:

launcher={handleToggle=>(<buttononClick={handleToggle}>Toggle</button>)}

About

This project is maintained by Martín Callegari and it was written by Wolox.

Wolox

About

Awesome chat widget for your React App

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Jan 2, 2026. It is now read-only.

Repository files navigation

react-chat-widget

circle-cinpm

FEArmy

Features

  • Plain text message UI
  • Snippet style for links (only as responses for now)
  • Fully customizable
  • Easy to use

demonstration

Installation

npm

npm install --save react-chat-widget

yarn

yarn add react-chat-widget

Usage

1- Add the Widget component to your root component

importReact,{Component}from'react';import{Widget}from'react-chat-widget';import'react-chat-widget/lib/styles.css';classAppextendsComponent{render(){return(<divclassName="App"><Widget/></div>);}}exportdefaultApp;

2- The only required prop you need to use is the handleNewUserMessage, which will receive the input from the user.

importReact,{Component}from'react';import{Widget}from'react-chat-widget';import'react-chat-widget/lib/styles.css';classAppextendsComponent{handleNewUserMessage=(newMessage)=>{console.log(`New message incoming! ${newMessage}`);// Now send the message throught the backend API}render(){return(<divclassName="App"><WidgethandleNewUserMessage={this.handleNewUserMessage}/></div>);}}exportdefaultApp;

3- Import the methods for you to add messages in the Widget. (See messages)

importReact,{Component}from'react';import{Widget,addResponseMessage}from'react-chat-widget';import'react-chat-widget/lib/styles.css';classAppextendsComponent{componentDidMount(){addResponseMessage("Welcome to this awesome chat!");}handleNewUserMessage=(newMessage)=>{console.log(`New message incoming! ${newMessage}`);// Now send the message throught the backend APIaddResponseMessage(response);}render(){return(<divclassName="App"><WidgethandleNewUserMessage={this.handleNewUserMessage}/></div>);}}exportdefaultApp;

4- Customize the widget to match your app design! You can add both props to manage the title of the widget and the avatar it will use. Of course, feel free to change the styles the widget will have in the CSS

importReact,{Component}from'react';import{Widget,addResponseMessage,addLinkSnippet,addUserMessage}from'react-chat-widget';import'react-chat-widget/lib/styles.css';importlogofrom'./logo.svg';classAppextendsComponent{componentDidMount(){addResponseMessage("Welcome to this awesome chat!");}handleNewUserMessage=(newMessage)=>{console.log(`New message incoming! ${newMessage}`);// Now send the message throught the backend API}render(){return(<divclassName="App"><WidgethandleNewUserMessage={this.handleNewUserMessage}profileAvatar={logo}title="My new awesome title"subtitle="And my cool subtitle"/></div>);}}exportdefaultApp;

API

Props

typerequireddefault valuedescription
handleNewUserMessagePropTypes.funcYESFunction to handle the user input, will receive the full text message when submitted
titlePropTypes.stringNO'Welcome'Title of the widget
subtitlePropTypes.stringNO'This is your chat subtitle'Subtitle of the widget
senderPlaceHolderPropTypes.stringNO'Type a message...'The placeholder of the message input
profileAvatarPropTypes.stringNOThe profile image that will be set on the responses
titleAvatarPropTypes.stringNOThe picture image that will be shown next to the chat title
showCloseButtonPropTypes.boolNOfalseShow or hide the close button in full screen mode
fullScreenModePropTypes.boolNOfalseAllow the use of full screen in full desktop mode
badgePropTypes.numberNO0Display a notification badge on the launcher if the value is greater than 0
autofocusPropTypes.boolNOtrueAutofocus or not the user input
launcherPropTypes.funcNOCustom Launcher component to use instead of the default
handleQuickButtonClickedPropTypes.funcNOFunction to handle the user clicking a quick button, will receive the 'value' when clicked.

Styles

To change the styles you need the widget to have, simply override the CSS classes wrapping them within the containers and add your own style to them! All classes are prefixed with rcw- so they don't override your other classes in case you are not hasing them. To verride, you can do, for expample:

.rcw-conversation-container> .rcw-header {
background-color: red;
}
.rcw-message> .rcw-response {
background-color: black;
color: white;
}

That way, you can leave the JS clean and keep the styles within the CSS.

Messages

If you want to add new messages, you can use the following methods:

  • addResponseMessage

    • params:
      • text
    • Method to add a new message written as a response to a user input.
  • addUserMessage

    • params:
      • text
    • This method will add a new message written as a user. Keep in mind it will not trigger the prop handleNewUserMessage()
  • addLinkSnippet

    • params:
      • link
    • Method to add a link snippet. For now, you need to provide this method with a link object, which must be in the shape of:
      {title: 'My awesome link',link: 'https://github.com/Wolox/react-chat-widget',target: '_blank'}
    • By default, target value is _blank which will open the link in a new window.
  • renderCustomComponent

    • params:
      • component: Component to be render,
      • props: props the component needs,
      • showAvatar: boolean, default value: false; the component will be rendered with the avatar like the messages
    • Method to render a custom component inse the messages container. With this method, you can add whatever component you need the widget to have.
  • setQuickButtons

    • params:
      • buttons: An array of objects with the keys label and value

Markdown is supported for the responses and user messages.

Widget behavior

You can also control certain actions of the widget:

  • toggleWidget

    • params: No params expected
    • This method is to toggle the widget at will without the need to trigger the click event on the launcher
  • toggleInputDisabled

    • params: No params expected
    • Method to toggle the availability of the message input for the user to write on

Widget components

Custom Launcher

You can use a custom component for the Launcher if you need one that's not the default, simply use the launcher prop like:

launcher={handleToggle=>this.getCustomLauncher(handleToggle)}

getCustomLauncher() is a method that will return the Launcher component. By default, the function passed by that prop, will receive the handleToggle parameter which is the method that will toggle the widget.

For example, if you want to use a simple button to toggle the widget:

launcher={handleToggle=>(<buttononClick={handleToggle}>Toggle</button>)}

About

This project is maintained by Martín Callegari and it was written by Wolox.

Wolox

About

Awesome chat widget for your React App

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
This repository was archived by the owner on Jan 2, 2026. It is now read-only.

Repository files navigation

react-chat-widget

circle-cinpm

FEArmy

Features

  • Plain text message UI
  • Snippet style for links (only as responses for now)
  • Fully customizable
  • Easy to use

demonstration

Installation

npm

npm install --save react-chat-widget

yarn

yarn add react-chat-widget

Usage

1- Add the Widget component to your root component

importReact,{Component}from'react';import{Widget}from'react-chat-widget';import'react-chat-widget/lib/styles.css';classAppextendsComponent{render(){return(<divclassName="App"><Widget/></div>);}}exportdefaultApp;

2- The only required prop you need to use is the handleNewUserMessage, which will receive the input from the user.

importReact,{Component}from'react';import{Widget}from'react-chat-widget';import'react-chat-widget/lib/styles.css';classAppextendsComponent{handleNewUserMessage=(newMessage)=>{console.log(`New message incoming! ${newMessage}`);// Now send the message throught the backend API}render(){return(<divclassName="App"><WidgethandleNewUserMessage={this.handleNewUserMessage}/></div>);}}exportdefaultApp;

3- Import the methods for you to add messages in the Widget. (See messages)

importReact,{Component}from'react';import{Widget,addResponseMessage}from'react-chat-widget';import'react-chat-widget/lib/styles.css';classAppextendsComponent{componentDidMount(){addResponseMessage("Welcome to this awesome chat!");}handleNewUserMessage=(newMessage)=>{console.log(`New message incoming! ${newMessage}`);// Now send the message throught the backend APIaddResponseMessage(response);}render(){return(<divclassName="App"><WidgethandleNewUserMessage={this.handleNewUserMessage}/></div>);}}exportdefaultApp;

4- Customize the widget to match your app design! You can add both props to manage the title of the widget and the avatar it will use. Of course, feel free to change the styles the widget will have in the CSS

importReact,{Component}from'react';import{Widget,addResponseMessage,addLinkSnippet,addUserMessage}from'react-chat-widget';import'react-chat-widget/lib/styles.css';importlogofrom'./logo.svg';classAppextendsComponent{componentDidMount(){addResponseMessage("Welcome to this awesome chat!");}handleNewUserMessage=(newMessage)=>{console.log(`New message incoming! ${newMessage}`);// Now send the message throught the backend API}render(){return(<divclassName="App"><WidgethandleNewUserMessage={this.handleNewUserMessage}profileAvatar={logo}title="My new awesome title"subtitle="And my cool subtitle"/></div>);}}exportdefaultApp;

API

Props

typerequireddefault valuedescription
handleNewUserMessagePropTypes.funcYESFunction to handle the user input, will receive the full text message when submitted
titlePropTypes.stringNO'Welcome'Title of the widget
subtitlePropTypes.stringNO'This is your chat subtitle'Subtitle of the widget
senderPlaceHolderPropTypes.stringNO'Type a message...'The placeholder of the message input
profileAvatarPropTypes.stringNOThe profile image that will be set on the responses
titleAvatarPropTypes.stringNOThe picture image that will be shown next to the chat title
showCloseButtonPropTypes.boolNOfalseShow or hide the close button in full screen mode
fullScreenModePropTypes.boolNOfalseAllow the use of full screen in full desktop mode
badgePropTypes.numberNO0Display a notification badge on the launcher if the value is greater than 0
autofocusPropTypes.boolNOtrueAutofocus or not the user input
launcherPropTypes.funcNOCustom Launcher component to use instead of the default
handleQuickButtonClickedPropTypes.funcNOFunction to handle the user clicking a quick button, will receive the 'value' when clicked.

Styles

To change the styles you need the widget to have, simply override the CSS classes wrapping them within the containers and add your own style to them! All classes are prefixed with rcw- so they don't override your other classes in case you are not hasing them. To verride, you can do, for expample:

.rcw-conversation-container> .rcw-header {
background-color: red;
}
.rcw-message> .rcw-response {
background-color: black;
color: white;
}

That way, you can leave the JS clean and keep the styles within the CSS.

Messages

If you want to add new messages, you can use the following methods:

  • addResponseMessage

    • params:
      • text
    • Method to add a new message written as a response to a user input.
  • addUserMessage

    • params:
      • text
    • This method will add a new message written as a user. Keep in mind it will not trigger the prop handleNewUserMessage()
  • addLinkSnippet

    • params:
      • link
    • Method to add a link snippet. For now, you need to provide this method with a link object, which must be in the shape of:
      {title: 'My awesome link',link: 'https://github.com/Wolox/react-chat-widget',target: '_blank'}
    • By default, target value is _blank which will open the link in a new window.
  • renderCustomComponent

    • params:
      • component: Component to be render,
      • props: props the component needs,
      • showAvatar: boolean, default value: false; the component will be rendered with the avatar like the messages
    • Method to render a custom component inse the messages container. With this method, you can add whatever component you need the widget to have.
  • setQuickButtons

    • params:
      • buttons: An array of objects with the keys label and value

Markdown is supported for the responses and user messages.

Widget behavior

You can also control certain actions of the widget:

  • toggleWidget

    • params: No params expected
    • This method is to toggle the widget at will without the need to trigger the click event on the launcher
  • toggleInputDisabled

    • params: No params expected
    • Method to toggle the availability of the message input for the user to write on

Widget components

Custom Launcher

You can use a custom component for the Launcher if you need one that's not the default, simply use the launcher prop like:

launcher={handleToggle=>this.getCustomLauncher(handleToggle)}

getCustomLauncher() is a method that will return the Launcher component. By default, the function passed by that prop, will receive the handleToggle parameter which is the method that will toggle the widget.

For example, if you want to use a simple button to toggle the widget:

launcher={handleToggle=>(<buttononClick={handleToggle}>Toggle</button>)}

About

This project is maintained by Martín Callegari and it was written by Wolox.

Wolox

About

Awesome chat widget for your React App

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Jan 2, 2026. It is now read-only.

Repository files navigation

react-chat-widget

circle-cinpm

FEArmy

Features

  • Plain text message UI
  • Snippet style for links (only as responses for now)
  • Fully customizable
  • Easy to use

demonstration

Installation

npm

npm install --save react-chat-widget

yarn

yarn add react-chat-widget

Usage

1- Add the Widget component to your root component

importReact,{Component}from'react';import{Widget}from'react-chat-widget';import'react-chat-widget/lib/styles.css';classAppextendsComponent{render(){return(<divclassName="App"><Widget/></div>);}}exportdefaultApp;

2- The only required prop you need to use is the handleNewUserMessage, which will receive the input from the user.

importReact,{Component}from'react';import{Widget}from'react-chat-widget';import'react-chat-widget/lib/styles.css';classAppextendsComponent{handleNewUserMessage=(newMessage)=>{console.log(`New message incoming! ${newMessage}`);// Now send the message throught the backend API}render(){return(<divclassName="App"><WidgethandleNewUserMessage={this.handleNewUserMessage}/></div>);}}exportdefaultApp;

3- Import the methods for you to add messages in the Widget. (See messages)

importReact,{Component}from'react';import{Widget,addResponseMessage}from'react-chat-widget';import'react-chat-widget/lib/styles.css';classAppextendsComponent{componentDidMount(){addResponseMessage("Welcome to this awesome chat!");}handleNewUserMessage=(newMessage)=>{console.log(`New message incoming! ${newMessage}`);// Now send the message throught the backend APIaddResponseMessage(response);}render(){return(<divclassName="App"><WidgethandleNewUserMessage={this.handleNewUserMessage}/></div>);}}exportdefaultApp;

4- Customize the widget to match your app design! You can add both props to manage the title of the widget and the avatar it will use. Of course, feel free to change the styles the widget will have in the CSS

importReact,{Component}from'react';import{Widget,addResponseMessage,addLinkSnippet,addUserMessage}from'react-chat-widget';import'react-chat-widget/lib/styles.css';importlogofrom'./logo.svg';classAppextendsComponent{componentDidMount(){addResponseMessage("Welcome to this awesome chat!");}handleNewUserMessage=(newMessage)=>{console.log(`New message incoming! ${newMessage}`);// Now send the message throught the backend API}render(){return(<divclassName="App"><WidgethandleNewUserMessage={this.handleNewUserMessage}profileAvatar={logo}title="My new awesome title"subtitle="And my cool subtitle"/></div>);}}exportdefaultApp;

API

Props

typerequireddefault valuedescription
handleNewUserMessagePropTypes.funcYESFunction to handle the user input, will receive the full text message when submitted
titlePropTypes.stringNO'Welcome'Title of the widget
subtitlePropTypes.stringNO'This is your chat subtitle'Subtitle of the widget
senderPlaceHolderPropTypes.stringNO'Type a message...'The placeholder of the message input
profileAvatarPropTypes.stringNOThe profile image that will be set on the responses
titleAvatarPropTypes.stringNOThe picture image that will be shown next to the chat title
showCloseButtonPropTypes.boolNOfalseShow or hide the close button in full screen mode
fullScreenModePropTypes.boolNOfalseAllow the use of full screen in full desktop mode
badgePropTypes.numberNO0Display a notification badge on the launcher if the value is greater than 0
autofocusPropTypes.boolNOtrueAutofocus or not the user input
launcherPropTypes.funcNOCustom Launcher component to use instead of the default
handleQuickButtonClickedPropTypes.funcNOFunction to handle the user clicking a quick button, will receive the 'value' when clicked.

Styles

To change the styles you need the widget to have, simply override the CSS classes wrapping them within the containers and add your own style to them! All classes are prefixed with rcw- so they don't override your other classes in case you are not hasing them. To verride, you can do, for expample:

.rcw-conversation-container> .rcw-header {
background-color: red;
}
.rcw-message> .rcw-response {
background-color: black;
color: white;
}

That way, you can leave the JS clean and keep the styles within the CSS.

Messages

If you want to add new messages, you can use the following methods:

  • addResponseMessage

    • params:
      • text
    • Method to add a new message written as a response to a user input.
  • addUserMessage

    • params:
      • text
    • This method will add a new message written as a user. Keep in mind it will not trigger the prop handleNewUserMessage()
  • addLinkSnippet

    • params:
      • link
    • Method to add a link snippet. For now, you need to provide this method with a link object, which must be in the shape of:
      {title: 'My awesome link',link: 'https://github.com/Wolox/react-chat-widget',target: '_blank'}
    • By default, target value is _blank which will open the link in a new window.
  • renderCustomComponent

    • params:
      • component: Component to be render,
      • props: props the component needs,
      • showAvatar: boolean, default value: false; the component will be rendered with the avatar like the messages
    • Method to render a custom component inse the messages container. With this method, you can add whatever component you need the widget to have.
  • setQuickButtons

    • params:
      • buttons: An array of objects with the keys label and value

Markdown is supported for the responses and user messages.

Widget behavior

You can also control certain actions of the widget:

  • toggleWidget

    • params: No params expected
    • This method is to toggle the widget at will without the need to trigger the click event on the launcher
  • toggleInputDisabled

    • params: No params expected
    • Method to toggle the availability of the message input for the user to write on

Widget components

Custom Launcher

You can use a custom component for the Launcher if you need one that's not the default, simply use the launcher prop like:

launcher={handleToggle=>this.getCustomLauncher(handleToggle)}

getCustomLauncher() is a method that will return the Launcher component. By default, the function passed by that prop, will receive the handleToggle parameter which is the method that will toggle the widget.

For example, if you want to use a simple button to toggle the widget:

launcher={handleToggle=>(<buttononClick={handleToggle}>Toggle</button>)}

About

This project is maintained by Martín Callegari and it was written by Wolox.

Wolox

About

Awesome chat widget for your React App

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Jan 2, 2026. It is now read-only.

Repository files navigation

react-chat-widget

circle-cinpm

FEArmy

Features

  • Plain text message UI
  • Snippet style for links (only as responses for now)
  • Fully customizable
  • Easy to use

demonstration

Installation

npm

npm install --save react-chat-widget

yarn

yarn add react-chat-widget

Usage

1- Add the Widget component to your root component

importReact,{Component}from'react';import{Widget}from'react-chat-widget';import'react-chat-widget/lib/styles.css';classAppextendsComponent{render(){return(<divclassName="App"><Widget/></div>);}}exportdefaultApp;

2- The only required prop you need to use is the handleNewUserMessage, which will receive the input from the user.

importReact,{Component}from'react';import{Widget}from'react-chat-widget';import'react-chat-widget/lib/styles.css';classAppextendsComponent{handleNewUserMessage=(newMessage)=>{console.log(`New message incoming! ${newMessage}`);// Now send the message throught the backend API}render(){return(<divclassName="App"><WidgethandleNewUserMessage={this.handleNewUserMessage}/></div>);}}exportdefaultApp;

3- Import the methods for you to add messages in the Widget. (See messages)

importReact,{Component}from'react';import{Widget,addResponseMessage}from'react-chat-widget';import'react-chat-widget/lib/styles.css';classAppextendsComponent{componentDidMount(){addResponseMessage("Welcome to this awesome chat!");}handleNewUserMessage=(newMessage)=>{console.log(`New message incoming! ${newMessage}`);// Now send the message throught the backend APIaddResponseMessage(response);}render(){return(<divclassName="App"><WidgethandleNewUserMessage={this.handleNewUserMessage}/></div>);}}exportdefaultApp;

4- Customize the widget to match your app design! You can add both props to manage the title of the widget and the avatar it will use. Of course, feel free to change the styles the widget will have in the CSS

importReact,{Component}from'react';import{Widget,addResponseMessage,addLinkSnippet,addUserMessage}from'react-chat-widget';import'react-chat-widget/lib/styles.css';importlogofrom'./logo.svg';classAppextendsComponent{componentDidMount(){addResponseMessage("Welcome to this awesome chat!");}handleNewUserMessage=(newMessage)=>{console.log(`New message incoming! ${newMessage}`);// Now send the message throught the backend API}render(){return(<divclassName="App"><WidgethandleNewUserMessage={this.handleNewUserMessage}profileAvatar={logo}title="My new awesome title"subtitle="And my cool subtitle"/></div>);}}exportdefaultApp;

API

Props

typerequireddefault valuedescription
handleNewUserMessagePropTypes.funcYESFunction to handle the user input, will receive the full text message when submitted
titlePropTypes.stringNO'Welcome'Title of the widget
subtitlePropTypes.stringNO'This is your chat subtitle'Subtitle of the widget
senderPlaceHolderPropTypes.stringNO'Type a message...'The placeholder of the message input
profileAvatarPropTypes.stringNOThe profile image that will be set on the responses
titleAvatarPropTypes.stringNOThe picture image that will be shown next to the chat title
showCloseButtonPropTypes.boolNOfalseShow or hide the close button in full screen mode
fullScreenModePropTypes.boolNOfalseAllow the use of full screen in full desktop mode
badgePropTypes.numberNO0Display a notification badge on the launcher if the value is greater than 0
autofocusPropTypes.boolNOtrueAutofocus or not the user input
launcherPropTypes.funcNOCustom Launcher component to use instead of the default
handleQuickButtonClickedPropTypes.funcNOFunction to handle the user clicking a quick button, will receive the 'value' when clicked.

Styles

To change the styles you need the widget to have, simply override the CSS classes wrapping them within the containers and add your own style to them! All classes are prefixed with rcw- so they don't override your other classes in case you are not hasing them. To verride, you can do, for expample:

.rcw-conversation-container> .rcw-header {
background-color: red;
}
.rcw-message> .rcw-response {
background-color: black;
color: white;
}

That way, you can leave the JS clean and keep the styles within the CSS.

Messages

If you want to add new messages, you can use the following methods:

  • addResponseMessage

    • params:
      • text
    • Method to add a new message written as a response to a user input.
  • addUserMessage

    • params:
      • text
    • This method will add a new message written as a user. Keep in mind it will not trigger the prop handleNewUserMessage()
  • addLinkSnippet

    • params:
      • link
    • Method to add a link snippet. For now, you need to provide this method with a link object, which must be in the shape of:
      {title: 'My awesome link',link: 'https://github.com/Wolox/react-chat-widget',target: '_blank'}
    • By default, target value is _blank which will open the link in a new window.
  • renderCustomComponent

    • params:
      • component: Component to be render,
      • props: props the component needs,
      • showAvatar: boolean, default value: false; the component will be rendered with the avatar like the messages
    • Method to render a custom component inse the messages container. With this method, you can add whatever component you need the widget to have.
  • setQuickButtons

    • params:
      • buttons: An array of objects with the keys label and value

Markdown is supported for the responses and user messages.

Widget behavior

You can also control certain actions of the widget:

  • toggleWidget

    • params: No params expected
    • This method is to toggle the widget at will without the need to trigger the click event on the launcher
  • toggleInputDisabled

    • params: No params expected
    • Method to toggle the availability of the message input for the user to write on

Widget components

Custom Launcher

You can use a custom component for the Launcher if you need one that's not the default, simply use the launcher prop like:

launcher={handleToggle=>this.getCustomLauncher(handleToggle)}

getCustomLauncher() is a method that will return the Launcher component. By default, the function passed by that prop, will receive the handleToggle parameter which is the method that will toggle the widget.

For example, if you want to use a simple button to toggle the widget:

launcher={handleToggle=>(<buttononClick={handleToggle}>Toggle</button>)}

About

This project is maintained by Martín Callegari and it was written by Wolox.

Wolox

About

Awesome chat widget for your React App

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
This repository was archived by the owner on Jan 2, 2026. It is now read-only.

Repository files navigation

react-chat-widget

circle-cinpm

FEArmy

Features

  • Plain text message UI
  • Snippet style for links (only as responses for now)
  • Fully customizable
  • Easy to use

demonstration

Installation

npm

npm install --save react-chat-widget

yarn

yarn add react-chat-widget

Usage

1- Add the Widget component to your root component

importReact,{Component}from'react';import{Widget}from'react-chat-widget';import'react-chat-widget/lib/styles.css';classAppextendsComponent{render(){return(<divclassName="App"><Widget/></div>);}}exportdefaultApp;

2- The only required prop you need to use is the handleNewUserMessage, which will receive the input from the user.

importReact,{Component}from'react';import{Widget}from'react-chat-widget';import'react-chat-widget/lib/styles.css';classAppextendsComponent{handleNewUserMessage=(newMessage)=>{console.log(`New message incoming! ${newMessage}`);// Now send the message throught the backend API}render(){return(<divclassName="App"><WidgethandleNewUserMessage={this.handleNewUserMessage}/></div>);}}exportdefaultApp;

3- Import the methods for you to add messages in the Widget. (See messages)

importReact,{Component}from'react';import{Widget,addResponseMessage}from'react-chat-widget';import'react-chat-widget/lib/styles.css';classAppextendsComponent{componentDidMount(){addResponseMessage("Welcome to this awesome chat!");}handleNewUserMessage=(newMessage)=>{console.log(`New message incoming! ${newMessage}`);// Now send the message throught the backend APIaddResponseMessage(response);}render(){return(<divclassName="App"><WidgethandleNewUserMessage={this.handleNewUserMessage}/></div>);}}exportdefaultApp;

4- Customize the widget to match your app design! You can add both props to manage the title of the widget and the avatar it will use. Of course, feel free to change the styles the widget will have in the CSS

importReact,{Component}from'react';import{Widget,addResponseMessage,addLinkSnippet,addUserMessage}from'react-chat-widget';import'react-chat-widget/lib/styles.css';importlogofrom'./logo.svg';classAppextendsComponent{componentDidMount(){addResponseMessage("Welcome to this awesome chat!");}handleNewUserMessage=(newMessage)=>{console.log(`New message incoming! ${newMessage}`);// Now send the message throught the backend API}render(){return(<divclassName="App"><WidgethandleNewUserMessage={this.handleNewUserMessage}profileAvatar={logo}title="My new awesome title"subtitle="And my cool subtitle"/></div>);}}exportdefaultApp;

API

Props

typerequireddefault valuedescription
handleNewUserMessagePropTypes.funcYESFunction to handle the user input, will receive the full text message when submitted
titlePropTypes.stringNO'Welcome'Title of the widget
subtitlePropTypes.stringNO'This is your chat subtitle'Subtitle of the widget
senderPlaceHolderPropTypes.stringNO'Type a message...'The placeholder of the message input
profileAvatarPropTypes.stringNOThe profile image that will be set on the responses
titleAvatarPropTypes.stringNOThe picture image that will be shown next to the chat title
showCloseButtonPropTypes.boolNOfalseShow or hide the close button in full screen mode
fullScreenModePropTypes.boolNOfalseAllow the use of full screen in full desktop mode
badgePropTypes.numberNO0Display a notification badge on the launcher if the value is greater than 0
autofocusPropTypes.boolNOtrueAutofocus or not the user input
launcherPropTypes.funcNOCustom Launcher component to use instead of the default
handleQuickButtonClickedPropTypes.funcNOFunction to handle the user clicking a quick button, will receive the 'value' when clicked.

Styles

To change the styles you need the widget to have, simply override the CSS classes wrapping them within the containers and add your own style to them! All classes are prefixed with rcw- so they don't override your other classes in case you are not hasing them. To verride, you can do, for expample:

.rcw-conversation-container> .rcw-header {
background-color: red;
}
.rcw-message> .rcw-response {
background-color: black;
color: white;
}

That way, you can leave the JS clean and keep the styles within the CSS.

Messages

If you want to add new messages, you can use the following methods:

  • addResponseMessage

    • params:
      • text
    • Method to add a new message written as a response to a user input.
  • addUserMessage

    • params:
      • text
    • This method will add a new message written as a user. Keep in mind it will not trigger the prop handleNewUserMessage()
  • addLinkSnippet

    • params:
      • link
    • Method to add a link snippet. For now, you need to provide this method with a link object, which must be in the shape of:
      {title: 'My awesome link',link: 'https://github.com/Wolox/react-chat-widget',target: '_blank'}
    • By default, target value is _blank which will open the link in a new window.
  • renderCustomComponent

    • params:
      • component: Component to be render,
      • props: props the component needs,
      • showAvatar: boolean, default value: false; the component will be rendered with the avatar like the messages
    • Method to render a custom component inse the messages container. With this method, you can add whatever component you need the widget to have.
  • setQuickButtons

    • params:
      • buttons: An array of objects with the keys label and value

Markdown is supported for the responses and user messages.

Widget behavior

You can also control certain actions of the widget:

  • toggleWidget

    • params: No params expected
    • This method is to toggle the widget at will without the need to trigger the click event on the launcher
  • toggleInputDisabled

    • params: No params expected
    • Method to toggle the availability of the message input for the user to write on

Widget components

Custom Launcher

You can use a custom component for the Launcher if you need one that's not the default, simply use the launcher prop like:

launcher={handleToggle=>this.getCustomLauncher(handleToggle)}

getCustomLauncher() is a method that will return the Launcher component. By default, the function passed by that prop, will receive the handleToggle parameter which is the method that will toggle the widget.

For example, if you want to use a simple button to toggle the widget:

launcher={handleToggle=>(<buttononClick={handleToggle}>Toggle</button>)}

About

This project is maintained by Martín Callegari and it was written by Wolox.

Wolox

About

Awesome chat widget for your React App

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages