Repository files navigation

Logo

react-use-intercom

A React Intercom integration powered by hooks.

civersiondownloadsminzipped sizeknown vulnerabilities

Features

  • Hooks
  • Written in TypeScript
  • Documented, self explaining methods
  • Tiny size without any external libraries
  • Safeguard for SSR environments (NextJS, Gatsby)

Installation

yarn add react-use-intercom

Quickstart

import*asReactfrom'react';import{IntercomProvider,useIntercom}from'react-use-intercom';constINTERCOM_APP_ID='your-intercom-app-id';constApp=()=>(<IntercomProviderappId={INTERCOM_APP_ID}><HomePage/></IntercomProvider>);// Anywhere in your appconstHomePage=()=>{const{ boot, shutdown, hide, show, update }=useIntercom();return<buttononClick={boot}>Boot intercom! ☎️</button>;};

Links

API

IntercomProvider

IntercomProvider is used to initialize the window.Intercom instance. It makes sure the initialization is only done once. If any listeners are passed, the IntercomProvider will make sure these are attached.

Place the IntercomProvider as high as possible in your application. This will make sure you can call useIntercom anywhere.

Props

nametypedescriptionrequireddefault
appIdstringapp ID of your Intercom instancetrue
childrenReact.ReactNodeReact childrentrue
autoBootbooleanindicates if Intercom should be automatically booted. If true no need to call boot, the IntercomProvider will call it for youfalsefalse
onHide() => voidtriggered when the Messenger hidesfalse
onShow() => voidtriggered when the Messenger showsfalse
onUnreadCountChange(number) => voidtriggered when the current number of unread messages changesfalse
shouldInitializebooleanindicates if the Intercom should be initialized. Can be used in multistaged environmentfalsetrue
apiBasestringIf you need to route your Messenger requests through a different endpoint than the default. Generally speaking, this is not needed.
Format: https://${INTERCOM_APP_ID}.intercom-messenger.com (See: devrnt#96)
false

Example

constApp=()=>{const[unreadMessagesCount,setUnreadMessagesCount]=React.useState(0);constonHide=()=>console.log('Intercom did hide the Messenger');constonShow=()=>console.log('Intercom did show the Messenger');constonUnreadCountChange=(amount: number)=>{console.log('Intercom has a new unread message');setUnreadMessagesCount(amount);};return(<IntercomProviderappId={INTERCOM_APP_ID}onHide={onHide}onShow={onShow}onUnreadCountChange={onUnreadCountChange}autoBoot><p>Hi there, I am a child of the IntercomProvider</p></IntercomProvider>);};

useIntercom

Used to retrieve all methods bundled with Intercom. These are based on the official Intercom docs. Some extra methods were added to improve convenience.

Make sure IntercomProvider is wrapped around your component when calling useIntercom().

Remark - You can't use useIntercom() in the same component where IntercomProvider is initialized.

Methods

nametypedescription
boot(props?: IntercomProps) => voidboots the Intercom instance, not needed if autoBoot in IntercomProvider is true
shutdown() => voidshuts down the Intercom instance
hardShutdown() => voidsame functionality as shutdown, but makes sure the Intercom cookies, window.Intercom and window.intercomSettings are removed.
update(props?: IntercomProps) => voidupdates the Intercom instance with the supplied props. To initiate a 'ping', call update without props
hide() => voidhides the Messenger, will call onHide if supplied to IntercomProvider
show() => voidshows the Messenger, will call onShow if supplied to IntercomProvider
showMessages() => voidshows the Messenger with the message list
showNewMessages(content?: string) => voidshows the Messenger as if a new conversation was just created. If content is passed, it will fill in the message composer
getVisitorId() => stringgets the visitor id
startTour(tourId: number) => voidstarts a tour based on the tourId
trackEvent(event: string, metaData?: object) => voidsubmits an event with optional metaData

Example

import*asReactfrom'react';import{IntercomProvider,useIntercom}from'react-use-intercom';constINTERCOM_APP_ID='your-intercom-app-id';constApp=()=>(<IntercomProviderappId={INTERCOM_APP_ID}><HomePage/></IntercomProvider>);constHomePage=()=>{const{
boot,
shutdown,
hardShutdown,
update,
hide,
show,
showMessages,
showNewMessages,
getVisitorId,
startTour,
trackEvent,}=useIntercom();constbootWithProps=()=>boot({name: 'Russo'});constupdateWithProps=()=>update({name: 'Ossur'});consthandleNewMessages=()=>showNewMessages();consthandleNewMessagesWithContent=()=>showNewMessages('content');consthandleGetVisitorId=()=>console.log(getVisitorId());consthandleStartTour=()=>startTour(123);consthandleTrackEvent=()=>trackEvent('invited-friend');consthandleTrackEventWithMetaData=()=>trackEvent('invited-frind',{name: 'Russo',});return(<><buttononClick={boot}>Boot intercom</button><buttononClick={bootWithProps}>Boot with props</button><buttononClick={shutdown}>Shutdown</button><buttononClick={hardShutdown}>Hard shutdown</button><buttononClick={update}>Update clean session</button><buttononClick={updateWithProps}>Update session with props</button><buttononClick={show}>Show messages</button><buttononClick={hide}>Hide messages</button><buttononClick={showMessages}>Show message list</button><buttononClick={handleNewMessages}>Show new messages</button><buttononClick={handleNewMessagesWithContent}>
Show new message with pre-filled content
</button><buttononClick={handleGetVisitorId}>Get visitor id</button><buttononClick={handleStartTour}>Start tour</button><buttononClick={handleTrackEvent}>Track event</button><buttononClick={handleTrackEventWithMetaData}>
Track event with metadata
</button></>);};

IntercomProps

All the Intercom default attributes/props are camel cased (appId instead of app_id) in react-use-intercom, see IntercomProps to see what attributes you can pass to boot or update. Or check the Intercom docs to see all the available attributes/props.

Remark - all the listed Intercom attributes here are snake cased, in react-use-intercom are these camel cased.

Custom attributes

Still want to pass custom attributes to Intercom? Whether boot or update is used, you can add your custom properties by passing these through customAttributes in the boot or update method.

Remark - the keys of the customAttributes object should be snake cased (this is how Intercom wants them). They are rawly passed to Intercom.

const{ boot }=useIntercom();boot({name: 'Russo',customAttributes: {custom_attribute_key: 'hi there'},})

Playground

Small playground to showcase the functionalities of react-use-intercom.

useIntercom

https://devrnt.github.io/react-use-intercom/#/useIntercom

useIntercom (with Intercom tour)

https://devrnt.github.io/react-use-intercom/#/useIntercomTour

Examples

Go to examples to check out some integrations (Gatsby, NextJS...).

TypeScript

All the possible pre-defined options to pass to the Intercom instance are typed. So whenever you have to pass IntercomProps, all the possible properties will be available out of the box. These props are JavaScript 'friendly', so camelCase. No need to pass the props with snake_cased keys.

Remark - if you want to pass custom properties, you should still use snake_cased keys.

Troubleshoot

  • I'm seeing Please wrap your component with IntercomProvider in the console.

Make sure IntercomProvider is initialized before calling useIntercom(). You only need to initialize IntercomProvider once. It is advised to initialize IntercomProvider as high as possible in your application tree.

Make sure you aren't calling useIntercom() in the same component where you initialized IntercomProvider.

  • I'm seeing Some invalid props were passed to IntercomProvider. Please check following props: [properties] in the console.

Make sure you're passing the correct properties to the IntercomProvider. Check IntercomProvider to see all the properties. Mind that all the properties in react-use-intercom are camel cased, except for the customAttributes property in the boot and update method from useIntercom.

Advanced

To reduce the amount of re-renders in your React application I suggest to make use of useCallback

TLDR:useCallback will return a memoized version of the callback that only changes if one of the dependencies has changed.

This can be applied to both the IntercomProvider events and the useIntercom methods. It depends on how many times your main app gets re-rendered.

Example

import*asReactfrom'react';import{IntercomProvider,useIntercom}from'react-use-intercom';constINTERCOM_APP_ID='your-intercom-app-id';constApp=()=>{// const onHide = () => console.log('Intercom did hide the Messenger');constonHide=React.useCallback(()=>console.log('Intercom did hide the Messenger'),[],);return(<IntercomProviderappId={INTERCOM_APP_ID}onHide={onHide}><HomePage/></IntercomProvider>);};constHomePage=()=>{const{ boot }=useIntercom();// const bootWithProps = () => boot({ name: 'Russo' });constbootWithProps=React.useCallback(()=>boot({name: 'Russo'}),[boot]);return<buttononClick={bootWithProps}>Boot with props</button>;};

About

☎️ React Intercom integration without the hassle, powered by hooks.

Resources

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

Repository files navigation

Logo

react-use-intercom

A React Intercom integration powered by hooks.

civersiondownloadsminzipped sizeknown vulnerabilities

Features

  • Hooks
  • Written in TypeScript
  • Documented, self explaining methods
  • Tiny size without any external libraries
  • Safeguard for SSR environments (NextJS, Gatsby)

Installation

yarn add react-use-intercom

Quickstart

import*asReactfrom'react';import{IntercomProvider,useIntercom}from'react-use-intercom';constINTERCOM_APP_ID='your-intercom-app-id';constApp=()=>(<IntercomProviderappId={INTERCOM_APP_ID}><HomePage/></IntercomProvider>);// Anywhere in your appconstHomePage=()=>{const{ boot, shutdown, hide, show, update }=useIntercom();return<buttononClick={boot}>Boot intercom! ☎️</button>;};

Links

API

IntercomProvider

IntercomProvider is used to initialize the window.Intercom instance. It makes sure the initialization is only done once. If any listeners are passed, the IntercomProvider will make sure these are attached.

Place the IntercomProvider as high as possible in your application. This will make sure you can call useIntercom anywhere.

Props

nametypedescriptionrequireddefault
appIdstringapp ID of your Intercom instancetrue
childrenReact.ReactNodeReact childrentrue
autoBootbooleanindicates if Intercom should be automatically booted. If true no need to call boot, the IntercomProvider will call it for youfalsefalse
onHide() => voidtriggered when the Messenger hidesfalse
onShow() => voidtriggered when the Messenger showsfalse
onUnreadCountChange(number) => voidtriggered when the current number of unread messages changesfalse
shouldInitializebooleanindicates if the Intercom should be initialized. Can be used in multistaged environmentfalsetrue
apiBasestringIf you need to route your Messenger requests through a different endpoint than the default. Generally speaking, this is not needed.
Format: https://${INTERCOM_APP_ID}.intercom-messenger.com (See: devrnt#96)
false

Example

constApp=()=>{const[unreadMessagesCount,setUnreadMessagesCount]=React.useState(0);constonHide=()=>console.log('Intercom did hide the Messenger');constonShow=()=>console.log('Intercom did show the Messenger');constonUnreadCountChange=(amount: number)=>{console.log('Intercom has a new unread message');setUnreadMessagesCount(amount);};return(<IntercomProviderappId={INTERCOM_APP_ID}onHide={onHide}onShow={onShow}onUnreadCountChange={onUnreadCountChange}autoBoot><p>Hi there, I am a child of the IntercomProvider</p></IntercomProvider>);};

useIntercom

Used to retrieve all methods bundled with Intercom. These are based on the official Intercom docs. Some extra methods were added to improve convenience.

Make sure IntercomProvider is wrapped around your component when calling useIntercom().

Remark - You can't use useIntercom() in the same component where IntercomProvider is initialized.

Methods

nametypedescription
boot(props?: IntercomProps) => voidboots the Intercom instance, not needed if autoBoot in IntercomProvider is true
shutdown() => voidshuts down the Intercom instance
hardShutdown() => voidsame functionality as shutdown, but makes sure the Intercom cookies, window.Intercom and window.intercomSettings are removed.
update(props?: IntercomProps) => voidupdates the Intercom instance with the supplied props. To initiate a 'ping', call update without props
hide() => voidhides the Messenger, will call onHide if supplied to IntercomProvider
show() => voidshows the Messenger, will call onShow if supplied to IntercomProvider
showMessages() => voidshows the Messenger with the message list
showNewMessages(content?: string) => voidshows the Messenger as if a new conversation was just created. If content is passed, it will fill in the message composer
getVisitorId() => stringgets the visitor id
startTour(tourId: number) => voidstarts a tour based on the tourId
trackEvent(event: string, metaData?: object) => voidsubmits an event with optional metaData

Example

import*asReactfrom'react';import{IntercomProvider,useIntercom}from'react-use-intercom';constINTERCOM_APP_ID='your-intercom-app-id';constApp=()=>(<IntercomProviderappId={INTERCOM_APP_ID}><HomePage/></IntercomProvider>);constHomePage=()=>{const{
boot,
shutdown,
hardShutdown,
update,
hide,
show,
showMessages,
showNewMessages,
getVisitorId,
startTour,
trackEvent,}=useIntercom();constbootWithProps=()=>boot({name: 'Russo'});constupdateWithProps=()=>update({name: 'Ossur'});consthandleNewMessages=()=>showNewMessages();consthandleNewMessagesWithContent=()=>showNewMessages('content');consthandleGetVisitorId=()=>console.log(getVisitorId());consthandleStartTour=()=>startTour(123);consthandleTrackEvent=()=>trackEvent('invited-friend');consthandleTrackEventWithMetaData=()=>trackEvent('invited-frind',{name: 'Russo',});return(<><buttononClick={boot}>Boot intercom</button><buttononClick={bootWithProps}>Boot with props</button><buttononClick={shutdown}>Shutdown</button><buttononClick={hardShutdown}>Hard shutdown</button><buttononClick={update}>Update clean session</button><buttononClick={updateWithProps}>Update session with props</button><buttononClick={show}>Show messages</button><buttononClick={hide}>Hide messages</button><buttononClick={showMessages}>Show message list</button><buttononClick={handleNewMessages}>Show new messages</button><buttononClick={handleNewMessagesWithContent}>
Show new message with pre-filled content
</button><buttononClick={handleGetVisitorId}>Get visitor id</button><buttononClick={handleStartTour}>Start tour</button><buttononClick={handleTrackEvent}>Track event</button><buttononClick={handleTrackEventWithMetaData}>
Track event with metadata
</button></>);};

IntercomProps

All the Intercom default attributes/props are camel cased (appId instead of app_id) in react-use-intercom, see IntercomProps to see what attributes you can pass to boot or update. Or check the Intercom docs to see all the available attributes/props.

Remark - all the listed Intercom attributes here are snake cased, in react-use-intercom are these camel cased.

Custom attributes

Still want to pass custom attributes to Intercom? Whether boot or update is used, you can add your custom properties by passing these through customAttributes in the boot or update method.

Remark - the keys of the customAttributes object should be snake cased (this is how Intercom wants them). They are rawly passed to Intercom.

const{ boot }=useIntercom();boot({name: 'Russo',customAttributes: {custom_attribute_key: 'hi there'},})

Playground

Small playground to showcase the functionalities of react-use-intercom.

useIntercom

https://devrnt.github.io/react-use-intercom/#/useIntercom

useIntercom (with Intercom tour)

https://devrnt.github.io/react-use-intercom/#/useIntercomTour

Examples

Go to examples to check out some integrations (Gatsby, NextJS...).

TypeScript

All the possible pre-defined options to pass to the Intercom instance are typed. So whenever you have to pass IntercomProps, all the possible properties will be available out of the box. These props are JavaScript 'friendly', so camelCase. No need to pass the props with snake_cased keys.

Remark - if you want to pass custom properties, you should still use snake_cased keys.

Troubleshoot

  • I'm seeing Please wrap your component with IntercomProvider in the console.

Make sure IntercomProvider is initialized before calling useIntercom(). You only need to initialize IntercomProvider once. It is advised to initialize IntercomProvider as high as possible in your application tree.

Make sure you aren't calling useIntercom() in the same component where you initialized IntercomProvider.

  • I'm seeing Some invalid props were passed to IntercomProvider. Please check following props: [properties] in the console.

Make sure you're passing the correct properties to the IntercomProvider. Check IntercomProvider to see all the properties. Mind that all the properties in react-use-intercom are camel cased, except for the customAttributes property in the boot and update method from useIntercom.

Advanced

To reduce the amount of re-renders in your React application I suggest to make use of useCallback

TLDR:useCallback will return a memoized version of the callback that only changes if one of the dependencies has changed.

This can be applied to both the IntercomProvider events and the useIntercom methods. It depends on how many times your main app gets re-rendered.

Example

import*asReactfrom'react';import{IntercomProvider,useIntercom}from'react-use-intercom';constINTERCOM_APP_ID='your-intercom-app-id';constApp=()=>{// const onHide = () => console.log('Intercom did hide the Messenger');constonHide=React.useCallback(()=>console.log('Intercom did hide the Messenger'),[],);return(<IntercomProviderappId={INTERCOM_APP_ID}onHide={onHide}><HomePage/></IntercomProvider>);};constHomePage=()=>{const{ boot }=useIntercom();// const bootWithProps = () => boot({ name: 'Russo' });constbootWithProps=React.useCallback(()=>boot({name: 'Russo'}),[boot]);return<buttononClick={bootWithProps}>Boot with props</button>;};

About

☎️ React Intercom integration without the hassle, powered by hooks.

Resources

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

Repository files navigation

Logo

react-use-intercom

A React Intercom integration powered by hooks.

civersiondownloadsminzipped sizeknown vulnerabilities

Features

  • Hooks
  • Written in TypeScript
  • Documented, self explaining methods
  • Tiny size without any external libraries
  • Safeguard for SSR environments (NextJS, Gatsby)

Installation

yarn add react-use-intercom

Quickstart

import*asReactfrom'react';import{IntercomProvider,useIntercom}from'react-use-intercom';constINTERCOM_APP_ID='your-intercom-app-id';constApp=()=>(<IntercomProviderappId={INTERCOM_APP_ID}><HomePage/></IntercomProvider>);// Anywhere in your appconstHomePage=()=>{const{ boot, shutdown, hide, show, update }=useIntercom();return<buttononClick={boot}>Boot intercom! ☎️</button>;};

Links

API

IntercomProvider

IntercomProvider is used to initialize the window.Intercom instance. It makes sure the initialization is only done once. If any listeners are passed, the IntercomProvider will make sure these are attached.

Place the IntercomProvider as high as possible in your application. This will make sure you can call useIntercom anywhere.

Props

nametypedescriptionrequireddefault
appIdstringapp ID of your Intercom instancetrue
childrenReact.ReactNodeReact childrentrue
autoBootbooleanindicates if Intercom should be automatically booted. If true no need to call boot, the IntercomProvider will call it for youfalsefalse
onHide() => voidtriggered when the Messenger hidesfalse
onShow() => voidtriggered when the Messenger showsfalse
onUnreadCountChange(number) => voidtriggered when the current number of unread messages changesfalse
shouldInitializebooleanindicates if the Intercom should be initialized. Can be used in multistaged environmentfalsetrue
apiBasestringIf you need to route your Messenger requests through a different endpoint than the default. Generally speaking, this is not needed.
Format: https://${INTERCOM_APP_ID}.intercom-messenger.com (See: devrnt#96)
false

Example

constApp=()=>{const[unreadMessagesCount,setUnreadMessagesCount]=React.useState(0);constonHide=()=>console.log('Intercom did hide the Messenger');constonShow=()=>console.log('Intercom did show the Messenger');constonUnreadCountChange=(amount: number)=>{console.log('Intercom has a new unread message');setUnreadMessagesCount(amount);};return(<IntercomProviderappId={INTERCOM_APP_ID}onHide={onHide}onShow={onShow}onUnreadCountChange={onUnreadCountChange}autoBoot><p>Hi there, I am a child of the IntercomProvider</p></IntercomProvider>);};

useIntercom

Used to retrieve all methods bundled with Intercom. These are based on the official Intercom docs. Some extra methods were added to improve convenience.

Make sure IntercomProvider is wrapped around your component when calling useIntercom().

Remark - You can't use useIntercom() in the same component where IntercomProvider is initialized.

Methods

nametypedescription
boot(props?: IntercomProps) => voidboots the Intercom instance, not needed if autoBoot in IntercomProvider is true
shutdown() => voidshuts down the Intercom instance
hardShutdown() => voidsame functionality as shutdown, but makes sure the Intercom cookies, window.Intercom and window.intercomSettings are removed.
update(props?: IntercomProps) => voidupdates the Intercom instance with the supplied props. To initiate a 'ping', call update without props
hide() => voidhides the Messenger, will call onHide if supplied to IntercomProvider
show() => voidshows the Messenger, will call onShow if supplied to IntercomProvider
showMessages() => voidshows the Messenger with the message list
showNewMessages(content?: string) => voidshows the Messenger as if a new conversation was just created. If content is passed, it will fill in the message composer
getVisitorId() => stringgets the visitor id
startTour(tourId: number) => voidstarts a tour based on the tourId
trackEvent(event: string, metaData?: object) => voidsubmits an event with optional metaData

Example

import*asReactfrom'react';import{IntercomProvider,useIntercom}from'react-use-intercom';constINTERCOM_APP_ID='your-intercom-app-id';constApp=()=>(<IntercomProviderappId={INTERCOM_APP_ID}><HomePage/></IntercomProvider>);constHomePage=()=>{const{
boot,
shutdown,
hardShutdown,
update,
hide,
show,
showMessages,
showNewMessages,
getVisitorId,
startTour,
trackEvent,}=useIntercom();constbootWithProps=()=>boot({name: 'Russo'});constupdateWithProps=()=>update({name: 'Ossur'});consthandleNewMessages=()=>showNewMessages();consthandleNewMessagesWithContent=()=>showNewMessages('content');consthandleGetVisitorId=()=>console.log(getVisitorId());consthandleStartTour=()=>startTour(123);consthandleTrackEvent=()=>trackEvent('invited-friend');consthandleTrackEventWithMetaData=()=>trackEvent('invited-frind',{name: 'Russo',});return(<><buttononClick={boot}>Boot intercom</button><buttononClick={bootWithProps}>Boot with props</button><buttononClick={shutdown}>Shutdown</button><buttononClick={hardShutdown}>Hard shutdown</button><buttononClick={update}>Update clean session</button><buttononClick={updateWithProps}>Update session with props</button><buttononClick={show}>Show messages</button><buttononClick={hide}>Hide messages</button><buttononClick={showMessages}>Show message list</button><buttononClick={handleNewMessages}>Show new messages</button><buttononClick={handleNewMessagesWithContent}>
Show new message with pre-filled content
</button><buttononClick={handleGetVisitorId}>Get visitor id</button><buttononClick={handleStartTour}>Start tour</button><buttononClick={handleTrackEvent}>Track event</button><buttononClick={handleTrackEventWithMetaData}>
Track event with metadata
</button></>);};

IntercomProps

All the Intercom default attributes/props are camel cased (appId instead of app_id) in react-use-intercom, see IntercomProps to see what attributes you can pass to boot or update. Or check the Intercom docs to see all the available attributes/props.

Remark - all the listed Intercom attributes here are snake cased, in react-use-intercom are these camel cased.

Custom attributes

Still want to pass custom attributes to Intercom? Whether boot or update is used, you can add your custom properties by passing these through customAttributes in the boot or update method.

Remark - the keys of the customAttributes object should be snake cased (this is how Intercom wants them). They are rawly passed to Intercom.

const{ boot }=useIntercom();boot({name: 'Russo',customAttributes: {custom_attribute_key: 'hi there'},})

Playground

Small playground to showcase the functionalities of react-use-intercom.

useIntercom

https://devrnt.github.io/react-use-intercom/#/useIntercom

useIntercom (with Intercom tour)

https://devrnt.github.io/react-use-intercom/#/useIntercomTour

Examples

Go to examples to check out some integrations (Gatsby, NextJS...).

TypeScript

All the possible pre-defined options to pass to the Intercom instance are typed. So whenever you have to pass IntercomProps, all the possible properties will be available out of the box. These props are JavaScript 'friendly', so camelCase. No need to pass the props with snake_cased keys.

Remark - if you want to pass custom properties, you should still use snake_cased keys.

Troubleshoot

  • I'm seeing Please wrap your component with IntercomProvider in the console.

Make sure IntercomProvider is initialized before calling useIntercom(). You only need to initialize IntercomProvider once. It is advised to initialize IntercomProvider as high as possible in your application tree.

Make sure you aren't calling useIntercom() in the same component where you initialized IntercomProvider.

  • I'm seeing Some invalid props were passed to IntercomProvider. Please check following props: [properties] in the console.

Make sure you're passing the correct properties to the IntercomProvider. Check IntercomProvider to see all the properties. Mind that all the properties in react-use-intercom are camel cased, except for the customAttributes property in the boot and update method from useIntercom.

Advanced

To reduce the amount of re-renders in your React application I suggest to make use of useCallback

TLDR:useCallback will return a memoized version of the callback that only changes if one of the dependencies has changed.

This can be applied to both the IntercomProvider events and the useIntercom methods. It depends on how many times your main app gets re-rendered.

Example

import*asReactfrom'react';import{IntercomProvider,useIntercom}from'react-use-intercom';constINTERCOM_APP_ID='your-intercom-app-id';constApp=()=>{// const onHide = () => console.log('Intercom did hide the Messenger');constonHide=React.useCallback(()=>console.log('Intercom did hide the Messenger'),[],);return(<IntercomProviderappId={INTERCOM_APP_ID}onHide={onHide}><HomePage/></IntercomProvider>);};constHomePage=()=>{const{ boot }=useIntercom();// const bootWithProps = () => boot({ name: 'Russo' });constbootWithProps=React.useCallback(()=>boot({name: 'Russo'}),[boot]);return<buttononClick={bootWithProps}>Boot with props</button>;};

About

☎️ React Intercom integration without the hassle, powered by hooks.

Resources

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

Repository files navigation

Logo

react-use-intercom

A React Intercom integration powered by hooks.

civersiondownloadsminzipped sizeknown vulnerabilities

Features

  • Hooks
  • Written in TypeScript
  • Documented, self explaining methods
  • Tiny size without any external libraries
  • Safeguard for SSR environments (NextJS, Gatsby)

Installation

yarn add react-use-intercom

Quickstart

import*asReactfrom'react';import{IntercomProvider,useIntercom}from'react-use-intercom';constINTERCOM_APP_ID='your-intercom-app-id';constApp=()=>(<IntercomProviderappId={INTERCOM_APP_ID}><HomePage/></IntercomProvider>);// Anywhere in your appconstHomePage=()=>{const{ boot, shutdown, hide, show, update }=useIntercom();return<buttononClick={boot}>Boot intercom! ☎️</button>;};

Links

API

IntercomProvider

IntercomProvider is used to initialize the window.Intercom instance. It makes sure the initialization is only done once. If any listeners are passed, the IntercomProvider will make sure these are attached.

Place the IntercomProvider as high as possible in your application. This will make sure you can call useIntercom anywhere.

Props

nametypedescriptionrequireddefault
appIdstringapp ID of your Intercom instancetrue
childrenReact.ReactNodeReact childrentrue
autoBootbooleanindicates if Intercom should be automatically booted. If true no need to call boot, the IntercomProvider will call it for youfalsefalse
onHide() => voidtriggered when the Messenger hidesfalse
onShow() => voidtriggered when the Messenger showsfalse
onUnreadCountChange(number) => voidtriggered when the current number of unread messages changesfalse
shouldInitializebooleanindicates if the Intercom should be initialized. Can be used in multistaged environmentfalsetrue
apiBasestringIf you need to route your Messenger requests through a different endpoint than the default. Generally speaking, this is not needed.
Format: https://${INTERCOM_APP_ID}.intercom-messenger.com (See: devrnt#96)
false

Example

constApp=()=>{const[unreadMessagesCount,setUnreadMessagesCount]=React.useState(0);constonHide=()=>console.log('Intercom did hide the Messenger');constonShow=()=>console.log('Intercom did show the Messenger');constonUnreadCountChange=(amount: number)=>{console.log('Intercom has a new unread message');setUnreadMessagesCount(amount);};return(<IntercomProviderappId={INTERCOM_APP_ID}onHide={onHide}onShow={onShow}onUnreadCountChange={onUnreadCountChange}autoBoot><p>Hi there, I am a child of the IntercomProvider</p></IntercomProvider>);};

useIntercom

Used to retrieve all methods bundled with Intercom. These are based on the official Intercom docs. Some extra methods were added to improve convenience.

Make sure IntercomProvider is wrapped around your component when calling useIntercom().

Remark - You can't use useIntercom() in the same component where IntercomProvider is initialized.

Methods

nametypedescription
boot(props?: IntercomProps) => voidboots the Intercom instance, not needed if autoBoot in IntercomProvider is true
shutdown() => voidshuts down the Intercom instance
hardShutdown() => voidsame functionality as shutdown, but makes sure the Intercom cookies, window.Intercom and window.intercomSettings are removed.
update(props?: IntercomProps) => voidupdates the Intercom instance with the supplied props. To initiate a 'ping', call update without props
hide() => voidhides the Messenger, will call onHide if supplied to IntercomProvider
show() => voidshows the Messenger, will call onShow if supplied to IntercomProvider
showMessages() => voidshows the Messenger with the message list
showNewMessages(content?: string) => voidshows the Messenger as if a new conversation was just created. If content is passed, it will fill in the message composer
getVisitorId() => stringgets the visitor id
startTour(tourId: number) => voidstarts a tour based on the tourId
trackEvent(event: string, metaData?: object) => voidsubmits an event with optional metaData

Example

import*asReactfrom'react';import{IntercomProvider,useIntercom}from'react-use-intercom';constINTERCOM_APP_ID='your-intercom-app-id';constApp=()=>(<IntercomProviderappId={INTERCOM_APP_ID}><HomePage/></IntercomProvider>);constHomePage=()=>{const{
boot,
shutdown,
hardShutdown,
update,
hide,
show,
showMessages,
showNewMessages,
getVisitorId,
startTour,
trackEvent,}=useIntercom();constbootWithProps=()=>boot({name: 'Russo'});constupdateWithProps=()=>update({name: 'Ossur'});consthandleNewMessages=()=>showNewMessages();consthandleNewMessagesWithContent=()=>showNewMessages('content');consthandleGetVisitorId=()=>console.log(getVisitorId());consthandleStartTour=()=>startTour(123);consthandleTrackEvent=()=>trackEvent('invited-friend');consthandleTrackEventWithMetaData=()=>trackEvent('invited-frind',{name: 'Russo',});return(<><buttononClick={boot}>Boot intercom</button><buttononClick={bootWithProps}>Boot with props</button><buttononClick={shutdown}>Shutdown</button><buttononClick={hardShutdown}>Hard shutdown</button><buttononClick={update}>Update clean session</button><buttononClick={updateWithProps}>Update session with props</button><buttononClick={show}>Show messages</button><buttononClick={hide}>Hide messages</button><buttononClick={showMessages}>Show message list</button><buttononClick={handleNewMessages}>Show new messages</button><buttononClick={handleNewMessagesWithContent}>
Show new message with pre-filled content
</button><buttononClick={handleGetVisitorId}>Get visitor id</button><buttononClick={handleStartTour}>Start tour</button><buttononClick={handleTrackEvent}>Track event</button><buttononClick={handleTrackEventWithMetaData}>
Track event with metadata
</button></>);};

IntercomProps

All the Intercom default attributes/props are camel cased (appId instead of app_id) in react-use-intercom, see IntercomProps to see what attributes you can pass to boot or update. Or check the Intercom docs to see all the available attributes/props.

Remark - all the listed Intercom attributes here are snake cased, in react-use-intercom are these camel cased.

Custom attributes

Still want to pass custom attributes to Intercom? Whether boot or update is used, you can add your custom properties by passing these through customAttributes in the boot or update method.

Remark - the keys of the customAttributes object should be snake cased (this is how Intercom wants them). They are rawly passed to Intercom.

const{ boot }=useIntercom();boot({name: 'Russo',customAttributes: {custom_attribute_key: 'hi there'},})

Playground

Small playground to showcase the functionalities of react-use-intercom.

useIntercom

https://devrnt.github.io/react-use-intercom/#/useIntercom

useIntercom (with Intercom tour)

https://devrnt.github.io/react-use-intercom/#/useIntercomTour

Examples

Go to examples to check out some integrations (Gatsby, NextJS...).

TypeScript

All the possible pre-defined options to pass to the Intercom instance are typed. So whenever you have to pass IntercomProps, all the possible properties will be available out of the box. These props are JavaScript 'friendly', so camelCase. No need to pass the props with snake_cased keys.

Remark - if you want to pass custom properties, you should still use snake_cased keys.

Troubleshoot

  • I'm seeing Please wrap your component with IntercomProvider in the console.

Make sure IntercomProvider is initialized before calling useIntercom(). You only need to initialize IntercomProvider once. It is advised to initialize IntercomProvider as high as possible in your application tree.

Make sure you aren't calling useIntercom() in the same component where you initialized IntercomProvider.

  • I'm seeing Some invalid props were passed to IntercomProvider. Please check following props: [properties] in the console.

Make sure you're passing the correct properties to the IntercomProvider. Check IntercomProvider to see all the properties. Mind that all the properties in react-use-intercom are camel cased, except for the customAttributes property in the boot and update method from useIntercom.

Advanced

To reduce the amount of re-renders in your React application I suggest to make use of useCallback

TLDR:useCallback will return a memoized version of the callback that only changes if one of the dependencies has changed.

This can be applied to both the IntercomProvider events and the useIntercom methods. It depends on how many times your main app gets re-rendered.

Example

import*asReactfrom'react';import{IntercomProvider,useIntercom}from'react-use-intercom';constINTERCOM_APP_ID='your-intercom-app-id';constApp=()=>{// const onHide = () => console.log('Intercom did hide the Messenger');constonHide=React.useCallback(()=>console.log('Intercom did hide the Messenger'),[],);return(<IntercomProviderappId={INTERCOM_APP_ID}onHide={onHide}><HomePage/></IntercomProvider>);};constHomePage=()=>{const{ boot }=useIntercom();// const bootWithProps = () => boot({ name: 'Russo' });constbootWithProps=React.useCallback(()=>boot({name: 'Russo'}),[boot]);return<buttononClick={bootWithProps}>Boot with props</button>;};

About

☎️ React Intercom integration without the hassle, powered by hooks.

Resources

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

Repository files navigation

Logo

react-use-intercom

A React Intercom integration powered by hooks.

civersiondownloadsminzipped sizeknown vulnerabilities

Features

  • Hooks
  • Written in TypeScript
  • Documented, self explaining methods
  • Tiny size without any external libraries
  • Safeguard for SSR environments (NextJS, Gatsby)

Installation

yarn add react-use-intercom

Quickstart

import*asReactfrom'react';import{IntercomProvider,useIntercom}from'react-use-intercom';constINTERCOM_APP_ID='your-intercom-app-id';constApp=()=>(<IntercomProviderappId={INTERCOM_APP_ID}><HomePage/></IntercomProvider>);// Anywhere in your appconstHomePage=()=>{const{ boot, shutdown, hide, show, update }=useIntercom();return<buttononClick={boot}>Boot intercom! ☎️</button>;};

Links

API

IntercomProvider

IntercomProvider is used to initialize the window.Intercom instance. It makes sure the initialization is only done once. If any listeners are passed, the IntercomProvider will make sure these are attached.

Place the IntercomProvider as high as possible in your application. This will make sure you can call useIntercom anywhere.

Props

nametypedescriptionrequireddefault
appIdstringapp ID of your Intercom instancetrue
childrenReact.ReactNodeReact childrentrue
autoBootbooleanindicates if Intercom should be automatically booted. If true no need to call boot, the IntercomProvider will call it for youfalsefalse
onHide() => voidtriggered when the Messenger hidesfalse
onShow() => voidtriggered when the Messenger showsfalse
onUnreadCountChange(number) => voidtriggered when the current number of unread messages changesfalse
shouldInitializebooleanindicates if the Intercom should be initialized. Can be used in multistaged environmentfalsetrue
apiBasestringIf you need to route your Messenger requests through a different endpoint than the default. Generally speaking, this is not needed.
Format: https://${INTERCOM_APP_ID}.intercom-messenger.com (See: devrnt#96)
false

Example

constApp=()=>{const[unreadMessagesCount,setUnreadMessagesCount]=React.useState(0);constonHide=()=>console.log('Intercom did hide the Messenger');constonShow=()=>console.log('Intercom did show the Messenger');constonUnreadCountChange=(amount: number)=>{console.log('Intercom has a new unread message');setUnreadMessagesCount(amount);};return(<IntercomProviderappId={INTERCOM_APP_ID}onHide={onHide}onShow={onShow}onUnreadCountChange={onUnreadCountChange}autoBoot><p>Hi there, I am a child of the IntercomProvider</p></IntercomProvider>);};

useIntercom

Used to retrieve all methods bundled with Intercom. These are based on the official Intercom docs. Some extra methods were added to improve convenience.

Make sure IntercomProvider is wrapped around your component when calling useIntercom().

Remark - You can't use useIntercom() in the same component where IntercomProvider is initialized.

Methods

nametypedescription
boot(props?: IntercomProps) => voidboots the Intercom instance, not needed if autoBoot in IntercomProvider is true
shutdown() => voidshuts down the Intercom instance
hardShutdown() => voidsame functionality as shutdown, but makes sure the Intercom cookies, window.Intercom and window.intercomSettings are removed.
update(props?: IntercomProps) => voidupdates the Intercom instance with the supplied props. To initiate a 'ping', call update without props
hide() => voidhides the Messenger, will call onHide if supplied to IntercomProvider
show() => voidshows the Messenger, will call onShow if supplied to IntercomProvider
showMessages() => voidshows the Messenger with the message list
showNewMessages(content?: string) => voidshows the Messenger as if a new conversation was just created. If content is passed, it will fill in the message composer
getVisitorId() => stringgets the visitor id
startTour(tourId: number) => voidstarts a tour based on the tourId
trackEvent(event: string, metaData?: object) => voidsubmits an event with optional metaData

Example

import*asReactfrom'react';import{IntercomProvider,useIntercom}from'react-use-intercom';constINTERCOM_APP_ID='your-intercom-app-id';constApp=()=>(<IntercomProviderappId={INTERCOM_APP_ID}><HomePage/></IntercomProvider>);constHomePage=()=>{const{
boot,
shutdown,
hardShutdown,
update,
hide,
show,
showMessages,
showNewMessages,
getVisitorId,
startTour,
trackEvent,}=useIntercom();constbootWithProps=()=>boot({name: 'Russo'});constupdateWithProps=()=>update({name: 'Ossur'});consthandleNewMessages=()=>showNewMessages();consthandleNewMessagesWithContent=()=>showNewMessages('content');consthandleGetVisitorId=()=>console.log(getVisitorId());consthandleStartTour=()=>startTour(123);consthandleTrackEvent=()=>trackEvent('invited-friend');consthandleTrackEventWithMetaData=()=>trackEvent('invited-frind',{name: 'Russo',});return(<><buttononClick={boot}>Boot intercom</button><buttononClick={bootWithProps}>Boot with props</button><buttononClick={shutdown}>Shutdown</button><buttononClick={hardShutdown}>Hard shutdown</button><buttononClick={update}>Update clean session</button><buttononClick={updateWithProps}>Update session with props</button><buttononClick={show}>Show messages</button><buttononClick={hide}>Hide messages</button><buttononClick={showMessages}>Show message list</button><buttononClick={handleNewMessages}>Show new messages</button><buttononClick={handleNewMessagesWithContent}>
Show new message with pre-filled content
</button><buttononClick={handleGetVisitorId}>Get visitor id</button><buttononClick={handleStartTour}>Start tour</button><buttononClick={handleTrackEvent}>Track event</button><buttononClick={handleTrackEventWithMetaData}>
Track event with metadata
</button></>);};

IntercomProps

All the Intercom default attributes/props are camel cased (appId instead of app_id) in react-use-intercom, see IntercomProps to see what attributes you can pass to boot or update. Or check the Intercom docs to see all the available attributes/props.

Remark - all the listed Intercom attributes here are snake cased, in react-use-intercom are these camel cased.

Custom attributes

Still want to pass custom attributes to Intercom? Whether boot or update is used, you can add your custom properties by passing these through customAttributes in the boot or update method.

Remark - the keys of the customAttributes object should be snake cased (this is how Intercom wants them). They are rawly passed to Intercom.

const{ boot }=useIntercom();boot({name: 'Russo',customAttributes: {custom_attribute_key: 'hi there'},})

Playground

Small playground to showcase the functionalities of react-use-intercom.

useIntercom

https://devrnt.github.io/react-use-intercom/#/useIntercom

useIntercom (with Intercom tour)

https://devrnt.github.io/react-use-intercom/#/useIntercomTour

Examples

Go to examples to check out some integrations (Gatsby, NextJS...).

TypeScript

All the possible pre-defined options to pass to the Intercom instance are typed. So whenever you have to pass IntercomProps, all the possible properties will be available out of the box. These props are JavaScript 'friendly', so camelCase. No need to pass the props with snake_cased keys.

Remark - if you want to pass custom properties, you should still use snake_cased keys.

Troubleshoot

  • I'm seeing Please wrap your component with IntercomProvider in the console.

Make sure IntercomProvider is initialized before calling useIntercom(). You only need to initialize IntercomProvider once. It is advised to initialize IntercomProvider as high as possible in your application tree.

Make sure you aren't calling useIntercom() in the same component where you initialized IntercomProvider.

  • I'm seeing Some invalid props were passed to IntercomProvider. Please check following props: [properties] in the console.

Make sure you're passing the correct properties to the IntercomProvider. Check IntercomProvider to see all the properties. Mind that all the properties in react-use-intercom are camel cased, except for the customAttributes property in the boot and update method from useIntercom.

Advanced

To reduce the amount of re-renders in your React application I suggest to make use of useCallback

TLDR:useCallback will return a memoized version of the callback that only changes if one of the dependencies has changed.

This can be applied to both the IntercomProvider events and the useIntercom methods. It depends on how many times your main app gets re-rendered.

Example

import*asReactfrom'react';import{IntercomProvider,useIntercom}from'react-use-intercom';constINTERCOM_APP_ID='your-intercom-app-id';constApp=()=>{// const onHide = () => console.log('Intercom did hide the Messenger');constonHide=React.useCallback(()=>console.log('Intercom did hide the Messenger'),[],);return(<IntercomProviderappId={INTERCOM_APP_ID}onHide={onHide}><HomePage/></IntercomProvider>);};constHomePage=()=>{const{ boot }=useIntercom();// const bootWithProps = () => boot({ name: 'Russo' });constbootWithProps=React.useCallback(()=>boot({name: 'Russo'}),[boot]);return<buttononClick={bootWithProps}>Boot with props</button>;};

About

☎️ React Intercom integration without the hassle, powered by hooks.

Resources

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

Repository files navigation

Logo

react-use-intercom

A React Intercom integration powered by hooks.

civersiondownloadsminzipped sizeknown vulnerabilities

Features

  • Hooks
  • Written in TypeScript
  • Documented, self explaining methods
  • Tiny size without any external libraries
  • Safeguard for SSR environments (NextJS, Gatsby)

Installation

yarn add react-use-intercom

Quickstart

import*asReactfrom'react';import{IntercomProvider,useIntercom}from'react-use-intercom';constINTERCOM_APP_ID='your-intercom-app-id';constApp=()=>(<IntercomProviderappId={INTERCOM_APP_ID}><HomePage/></IntercomProvider>);// Anywhere in your appconstHomePage=()=>{const{ boot, shutdown, hide, show, update }=useIntercom();return<buttononClick={boot}>Boot intercom! ☎️</button>;};

Links

API

IntercomProvider

IntercomProvider is used to initialize the window.Intercom instance. It makes sure the initialization is only done once. If any listeners are passed, the IntercomProvider will make sure these are attached.

Place the IntercomProvider as high as possible in your application. This will make sure you can call useIntercom anywhere.

Props

nametypedescriptionrequireddefault
appIdstringapp ID of your Intercom instancetrue
childrenReact.ReactNodeReact childrentrue
autoBootbooleanindicates if Intercom should be automatically booted. If true no need to call boot, the IntercomProvider will call it for youfalsefalse
onHide() => voidtriggered when the Messenger hidesfalse
onShow() => voidtriggered when the Messenger showsfalse
onUnreadCountChange(number) => voidtriggered when the current number of unread messages changesfalse
shouldInitializebooleanindicates if the Intercom should be initialized. Can be used in multistaged environmentfalsetrue
apiBasestringIf you need to route your Messenger requests through a different endpoint than the default. Generally speaking, this is not needed.
Format: https://${INTERCOM_APP_ID}.intercom-messenger.com (See: devrnt#96)
false

Example

constApp=()=>{const[unreadMessagesCount,setUnreadMessagesCount]=React.useState(0);constonHide=()=>console.log('Intercom did hide the Messenger');constonShow=()=>console.log('Intercom did show the Messenger');constonUnreadCountChange=(amount: number)=>{console.log('Intercom has a new unread message');setUnreadMessagesCount(amount);};return(<IntercomProviderappId={INTERCOM_APP_ID}onHide={onHide}onShow={onShow}onUnreadCountChange={onUnreadCountChange}autoBoot><p>Hi there, I am a child of the IntercomProvider</p></IntercomProvider>);};

useIntercom

Used to retrieve all methods bundled with Intercom. These are based on the official Intercom docs. Some extra methods were added to improve convenience.

Make sure IntercomProvider is wrapped around your component when calling useIntercom().

Remark - You can't use useIntercom() in the same component where IntercomProvider is initialized.

Methods

nametypedescription
boot(props?: IntercomProps) => voidboots the Intercom instance, not needed if autoBoot in IntercomProvider is true
shutdown() => voidshuts down the Intercom instance
hardShutdown() => voidsame functionality as shutdown, but makes sure the Intercom cookies, window.Intercom and window.intercomSettings are removed.
update(props?: IntercomProps) => voidupdates the Intercom instance with the supplied props. To initiate a 'ping', call update without props
hide() => voidhides the Messenger, will call onHide if supplied to IntercomProvider
show() => voidshows the Messenger, will call onShow if supplied to IntercomProvider
showMessages() => voidshows the Messenger with the message list
showNewMessages(content?: string) => voidshows the Messenger as if a new conversation was just created. If content is passed, it will fill in the message composer
getVisitorId() => stringgets the visitor id
startTour(tourId: number) => voidstarts a tour based on the tourId
trackEvent(event: string, metaData?: object) => voidsubmits an event with optional metaData

Example

import*asReactfrom'react';import{IntercomProvider,useIntercom}from'react-use-intercom';constINTERCOM_APP_ID='your-intercom-app-id';constApp=()=>(<IntercomProviderappId={INTERCOM_APP_ID}><HomePage/></IntercomProvider>);constHomePage=()=>{const{
boot,
shutdown,
hardShutdown,
update,
hide,
show,
showMessages,
showNewMessages,
getVisitorId,
startTour,
trackEvent,}=useIntercom();constbootWithProps=()=>boot({name: 'Russo'});constupdateWithProps=()=>update({name: 'Ossur'});consthandleNewMessages=()=>showNewMessages();consthandleNewMessagesWithContent=()=>showNewMessages('content');consthandleGetVisitorId=()=>console.log(getVisitorId());consthandleStartTour=()=>startTour(123);consthandleTrackEvent=()=>trackEvent('invited-friend');consthandleTrackEventWithMetaData=()=>trackEvent('invited-frind',{name: 'Russo',});return(<><buttononClick={boot}>Boot intercom</button><buttononClick={bootWithProps}>Boot with props</button><buttononClick={shutdown}>Shutdown</button><buttononClick={hardShutdown}>Hard shutdown</button><buttononClick={update}>Update clean session</button><buttononClick={updateWithProps}>Update session with props</button><buttononClick={show}>Show messages</button><buttononClick={hide}>Hide messages</button><buttononClick={showMessages}>Show message list</button><buttononClick={handleNewMessages}>Show new messages</button><buttononClick={handleNewMessagesWithContent}>
Show new message with pre-filled content
</button><buttononClick={handleGetVisitorId}>Get visitor id</button><buttononClick={handleStartTour}>Start tour</button><buttononClick={handleTrackEvent}>Track event</button><buttononClick={handleTrackEventWithMetaData}>
Track event with metadata
</button></>);};

IntercomProps

All the Intercom default attributes/props are camel cased (appId instead of app_id) in react-use-intercom, see IntercomProps to see what attributes you can pass to boot or update. Or check the Intercom docs to see all the available attributes/props.

Remark - all the listed Intercom attributes here are snake cased, in react-use-intercom are these camel cased.

Custom attributes

Still want to pass custom attributes to Intercom? Whether boot or update is used, you can add your custom properties by passing these through customAttributes in the boot or update method.

Remark - the keys of the customAttributes object should be snake cased (this is how Intercom wants them). They are rawly passed to Intercom.

const{ boot }=useIntercom();boot({name: 'Russo',customAttributes: {custom_attribute_key: 'hi there'},})

Playground

Small playground to showcase the functionalities of react-use-intercom.

useIntercom

https://devrnt.github.io/react-use-intercom/#/useIntercom

useIntercom (with Intercom tour)

https://devrnt.github.io/react-use-intercom/#/useIntercomTour

Examples

Go to examples to check out some integrations (Gatsby, NextJS...).

TypeScript

All the possible pre-defined options to pass to the Intercom instance are typed. So whenever you have to pass IntercomProps, all the possible properties will be available out of the box. These props are JavaScript 'friendly', so camelCase. No need to pass the props with snake_cased keys.

Remark - if you want to pass custom properties, you should still use snake_cased keys.

Troubleshoot

  • I'm seeing Please wrap your component with IntercomProvider in the console.

Make sure IntercomProvider is initialized before calling useIntercom(). You only need to initialize IntercomProvider once. It is advised to initialize IntercomProvider as high as possible in your application tree.

Make sure you aren't calling useIntercom() in the same component where you initialized IntercomProvider.

  • I'm seeing Some invalid props were passed to IntercomProvider. Please check following props: [properties] in the console.

Make sure you're passing the correct properties to the IntercomProvider. Check IntercomProvider to see all the properties. Mind that all the properties in react-use-intercom are camel cased, except for the customAttributes property in the boot and update method from useIntercom.

Advanced

To reduce the amount of re-renders in your React application I suggest to make use of useCallback

TLDR:useCallback will return a memoized version of the callback that only changes if one of the dependencies has changed.

This can be applied to both the IntercomProvider events and the useIntercom methods. It depends on how many times your main app gets re-rendered.

Example

import*asReactfrom'react';import{IntercomProvider,useIntercom}from'react-use-intercom';constINTERCOM_APP_ID='your-intercom-app-id';constApp=()=>{// const onHide = () => console.log('Intercom did hide the Messenger');constonHide=React.useCallback(()=>console.log('Intercom did hide the Messenger'),[],);return(<IntercomProviderappId={INTERCOM_APP_ID}onHide={onHide}><HomePage/></IntercomProvider>);};constHomePage=()=>{const{ boot }=useIntercom();// const bootWithProps = () => boot({ name: 'Russo' });constbootWithProps=React.useCallback(()=>boot({name: 'Russo'}),[boot]);return<buttononClick={bootWithProps}>Boot with props</button>;};

About

☎️ React Intercom integration without the hassle, powered by hooks.

Resources

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

Repository files navigation

Logo

react-use-intercom

A React Intercom integration powered by hooks.

civersiondownloadsminzipped sizeknown vulnerabilities

Features

  • Hooks
  • Written in TypeScript
  • Documented, self explaining methods
  • Tiny size without any external libraries
  • Safeguard for SSR environments (NextJS, Gatsby)

Installation

yarn add react-use-intercom

Quickstart

import*asReactfrom'react';import{IntercomProvider,useIntercom}from'react-use-intercom';constINTERCOM_APP_ID='your-intercom-app-id';constApp=()=>(<IntercomProviderappId={INTERCOM_APP_ID}><HomePage/></IntercomProvider>);// Anywhere in your appconstHomePage=()=>{const{ boot, shutdown, hide, show, update }=useIntercom();return<buttononClick={boot}>Boot intercom! ☎️</button>;};

Links

API

IntercomProvider

IntercomProvider is used to initialize the window.Intercom instance. It makes sure the initialization is only done once. If any listeners are passed, the IntercomProvider will make sure these are attached.

Place the IntercomProvider as high as possible in your application. This will make sure you can call useIntercom anywhere.

Props

nametypedescriptionrequireddefault
appIdstringapp ID of your Intercom instancetrue
childrenReact.ReactNodeReact childrentrue
autoBootbooleanindicates if Intercom should be automatically booted. If true no need to call boot, the IntercomProvider will call it for youfalsefalse
onHide() => voidtriggered when the Messenger hidesfalse
onShow() => voidtriggered when the Messenger showsfalse
onUnreadCountChange(number) => voidtriggered when the current number of unread messages changesfalse
shouldInitializebooleanindicates if the Intercom should be initialized. Can be used in multistaged environmentfalsetrue
apiBasestringIf you need to route your Messenger requests through a different endpoint than the default. Generally speaking, this is not needed.
Format: https://${INTERCOM_APP_ID}.intercom-messenger.com (See: devrnt#96)
false

Example

constApp=()=>{const[unreadMessagesCount,setUnreadMessagesCount]=React.useState(0);constonHide=()=>console.log('Intercom did hide the Messenger');constonShow=()=>console.log('Intercom did show the Messenger');constonUnreadCountChange=(amount: number)=>{console.log('Intercom has a new unread message');setUnreadMessagesCount(amount);};return(<IntercomProviderappId={INTERCOM_APP_ID}onHide={onHide}onShow={onShow}onUnreadCountChange={onUnreadCountChange}autoBoot><p>Hi there, I am a child of the IntercomProvider</p></IntercomProvider>);};

useIntercom

Used to retrieve all methods bundled with Intercom. These are based on the official Intercom docs. Some extra methods were added to improve convenience.

Make sure IntercomProvider is wrapped around your component when calling useIntercom().

Remark - You can't use useIntercom() in the same component where IntercomProvider is initialized.

Methods

nametypedescription
boot(props?: IntercomProps) => voidboots the Intercom instance, not needed if autoBoot in IntercomProvider is true
shutdown() => voidshuts down the Intercom instance
hardShutdown() => voidsame functionality as shutdown, but makes sure the Intercom cookies, window.Intercom and window.intercomSettings are removed.
update(props?: IntercomProps) => voidupdates the Intercom instance with the supplied props. To initiate a 'ping', call update without props
hide() => voidhides the Messenger, will call onHide if supplied to IntercomProvider
show() => voidshows the Messenger, will call onShow if supplied to IntercomProvider
showMessages() => voidshows the Messenger with the message list
showNewMessages(content?: string) => voidshows the Messenger as if a new conversation was just created. If content is passed, it will fill in the message composer
getVisitorId() => stringgets the visitor id
startTour(tourId: number) => voidstarts a tour based on the tourId
trackEvent(event: string, metaData?: object) => voidsubmits an event with optional metaData

Example

import*asReactfrom'react';import{IntercomProvider,useIntercom}from'react-use-intercom';constINTERCOM_APP_ID='your-intercom-app-id';constApp=()=>(<IntercomProviderappId={INTERCOM_APP_ID}><HomePage/></IntercomProvider>);constHomePage=()=>{const{
boot,
shutdown,
hardShutdown,
update,
hide,
show,
showMessages,
showNewMessages,
getVisitorId,
startTour,
trackEvent,}=useIntercom();constbootWithProps=()=>boot({name: 'Russo'});constupdateWithProps=()=>update({name: 'Ossur'});consthandleNewMessages=()=>showNewMessages();consthandleNewMessagesWithContent=()=>showNewMessages('content');consthandleGetVisitorId=()=>console.log(getVisitorId());consthandleStartTour=()=>startTour(123);consthandleTrackEvent=()=>trackEvent('invited-friend');consthandleTrackEventWithMetaData=()=>trackEvent('invited-frind',{name: 'Russo',});return(<><buttononClick={boot}>Boot intercom</button><buttononClick={bootWithProps}>Boot with props</button><buttononClick={shutdown}>Shutdown</button><buttononClick={hardShutdown}>Hard shutdown</button><buttononClick={update}>Update clean session</button><buttononClick={updateWithProps}>Update session with props</button><buttononClick={show}>Show messages</button><buttononClick={hide}>Hide messages</button><buttononClick={showMessages}>Show message list</button><buttononClick={handleNewMessages}>Show new messages</button><buttononClick={handleNewMessagesWithContent}>
Show new message with pre-filled content
</button><buttononClick={handleGetVisitorId}>Get visitor id</button><buttononClick={handleStartTour}>Start tour</button><buttononClick={handleTrackEvent}>Track event</button><buttononClick={handleTrackEventWithMetaData}>
Track event with metadata
</button></>);};

IntercomProps

All the Intercom default attributes/props are camel cased (appId instead of app_id) in react-use-intercom, see IntercomProps to see what attributes you can pass to boot or update. Or check the Intercom docs to see all the available attributes/props.

Remark - all the listed Intercom attributes here are snake cased, in react-use-intercom are these camel cased.

Custom attributes

Still want to pass custom attributes to Intercom? Whether boot or update is used, you can add your custom properties by passing these through customAttributes in the boot or update method.

Remark - the keys of the customAttributes object should be snake cased (this is how Intercom wants them). They are rawly passed to Intercom.

const{ boot }=useIntercom();boot({name: 'Russo',customAttributes: {custom_attribute_key: 'hi there'},})

Playground

Small playground to showcase the functionalities of react-use-intercom.

useIntercom

https://devrnt.github.io/react-use-intercom/#/useIntercom

useIntercom (with Intercom tour)

https://devrnt.github.io/react-use-intercom/#/useIntercomTour

Examples

Go to examples to check out some integrations (Gatsby, NextJS...).

TypeScript

All the possible pre-defined options to pass to the Intercom instance are typed. So whenever you have to pass IntercomProps, all the possible properties will be available out of the box. These props are JavaScript 'friendly', so camelCase. No need to pass the props with snake_cased keys.

Remark - if you want to pass custom properties, you should still use snake_cased keys.

Troubleshoot

  • I'm seeing Please wrap your component with IntercomProvider in the console.

Make sure IntercomProvider is initialized before calling useIntercom(). You only need to initialize IntercomProvider once. It is advised to initialize IntercomProvider as high as possible in your application tree.

Make sure you aren't calling useIntercom() in the same component where you initialized IntercomProvider.

  • I'm seeing Some invalid props were passed to IntercomProvider. Please check following props: [properties] in the console.

Make sure you're passing the correct properties to the IntercomProvider. Check IntercomProvider to see all the properties. Mind that all the properties in react-use-intercom are camel cased, except for the customAttributes property in the boot and update method from useIntercom.

Advanced

To reduce the amount of re-renders in your React application I suggest to make use of useCallback

TLDR:useCallback will return a memoized version of the callback that only changes if one of the dependencies has changed.

This can be applied to both the IntercomProvider events and the useIntercom methods. It depends on how many times your main app gets re-rendered.

Example

import*asReactfrom'react';import{IntercomProvider,useIntercom}from'react-use-intercom';constINTERCOM_APP_ID='your-intercom-app-id';constApp=()=>{// const onHide = () => console.log('Intercom did hide the Messenger');constonHide=React.useCallback(()=>console.log('Intercom did hide the Messenger'),[],);return(<IntercomProviderappId={INTERCOM_APP_ID}onHide={onHide}><HomePage/></IntercomProvider>);};constHomePage=()=>{const{ boot }=useIntercom();// const bootWithProps = () => boot({ name: 'Russo' });constbootWithProps=React.useCallback(()=>boot({name: 'Russo'}),[boot]);return<buttononClick={bootWithProps}>Boot with props</button>;};

About

☎️ React Intercom integration without the hassle, powered by hooks.

Resources

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

Repository files navigation

Logo

react-use-intercom

A React Intercom integration powered by hooks.

civersiondownloadsminzipped sizeknown vulnerabilities

Features

  • Hooks
  • Written in TypeScript
  • Documented, self explaining methods
  • Tiny size without any external libraries
  • Safeguard for SSR environments (NextJS, Gatsby)

Installation

yarn add react-use-intercom

Quickstart

import*asReactfrom'react';import{IntercomProvider,useIntercom}from'react-use-intercom';constINTERCOM_APP_ID='your-intercom-app-id';constApp=()=>(<IntercomProviderappId={INTERCOM_APP_ID}><HomePage/></IntercomProvider>);// Anywhere in your appconstHomePage=()=>{const{ boot, shutdown, hide, show, update }=useIntercom();return<buttononClick={boot}>Boot intercom! ☎️</button>;};

Links

API

IntercomProvider

IntercomProvider is used to initialize the window.Intercom instance. It makes sure the initialization is only done once. If any listeners are passed, the IntercomProvider will make sure these are attached.

Place the IntercomProvider as high as possible in your application. This will make sure you can call useIntercom anywhere.

Props

nametypedescriptionrequireddefault
appIdstringapp ID of your Intercom instancetrue
childrenReact.ReactNodeReact childrentrue
autoBootbooleanindicates if Intercom should be automatically booted. If true no need to call boot, the IntercomProvider will call it for youfalsefalse
onHide() => voidtriggered when the Messenger hidesfalse
onShow() => voidtriggered when the Messenger showsfalse
onUnreadCountChange(number) => voidtriggered when the current number of unread messages changesfalse
shouldInitializebooleanindicates if the Intercom should be initialized. Can be used in multistaged environmentfalsetrue
apiBasestringIf you need to route your Messenger requests through a different endpoint than the default. Generally speaking, this is not needed.
Format: https://${INTERCOM_APP_ID}.intercom-messenger.com (See: devrnt#96)
false

Example

constApp=()=>{const[unreadMessagesCount,setUnreadMessagesCount]=React.useState(0);constonHide=()=>console.log('Intercom did hide the Messenger');constonShow=()=>console.log('Intercom did show the Messenger');constonUnreadCountChange=(amount: number)=>{console.log('Intercom has a new unread message');setUnreadMessagesCount(amount);};return(<IntercomProviderappId={INTERCOM_APP_ID}onHide={onHide}onShow={onShow}onUnreadCountChange={onUnreadCountChange}autoBoot><p>Hi there, I am a child of the IntercomProvider</p></IntercomProvider>);};

useIntercom

Used to retrieve all methods bundled with Intercom. These are based on the official Intercom docs. Some extra methods were added to improve convenience.

Make sure IntercomProvider is wrapped around your component when calling useIntercom().

Remark - You can't use useIntercom() in the same component where IntercomProvider is initialized.

Methods

nametypedescription
boot(props?: IntercomProps) => voidboots the Intercom instance, not needed if autoBoot in IntercomProvider is true
shutdown() => voidshuts down the Intercom instance
hardShutdown() => voidsame functionality as shutdown, but makes sure the Intercom cookies, window.Intercom and window.intercomSettings are removed.
update(props?: IntercomProps) => voidupdates the Intercom instance with the supplied props. To initiate a 'ping', call update without props
hide() => voidhides the Messenger, will call onHide if supplied to IntercomProvider
show() => voidshows the Messenger, will call onShow if supplied to IntercomProvider
showMessages() => voidshows the Messenger with the message list
showNewMessages(content?: string) => voidshows the Messenger as if a new conversation was just created. If content is passed, it will fill in the message composer
getVisitorId() => stringgets the visitor id
startTour(tourId: number) => voidstarts a tour based on the tourId
trackEvent(event: string, metaData?: object) => voidsubmits an event with optional metaData

Example

import*asReactfrom'react';import{IntercomProvider,useIntercom}from'react-use-intercom';constINTERCOM_APP_ID='your-intercom-app-id';constApp=()=>(<IntercomProviderappId={INTERCOM_APP_ID}><HomePage/></IntercomProvider>);constHomePage=()=>{const{
boot,
shutdown,
hardShutdown,
update,
hide,
show,
showMessages,
showNewMessages,
getVisitorId,
startTour,
trackEvent,}=useIntercom();constbootWithProps=()=>boot({name: 'Russo'});constupdateWithProps=()=>update({name: 'Ossur'});consthandleNewMessages=()=>showNewMessages();consthandleNewMessagesWithContent=()=>showNewMessages('content');consthandleGetVisitorId=()=>console.log(getVisitorId());consthandleStartTour=()=>startTour(123);consthandleTrackEvent=()=>trackEvent('invited-friend');consthandleTrackEventWithMetaData=()=>trackEvent('invited-frind',{name: 'Russo',});return(<><buttononClick={boot}>Boot intercom</button><buttononClick={bootWithProps}>Boot with props</button><buttononClick={shutdown}>Shutdown</button><buttononClick={hardShutdown}>Hard shutdown</button><buttononClick={update}>Update clean session</button><buttononClick={updateWithProps}>Update session with props</button><buttononClick={show}>Show messages</button><buttononClick={hide}>Hide messages</button><buttononClick={showMessages}>Show message list</button><buttononClick={handleNewMessages}>Show new messages</button><buttononClick={handleNewMessagesWithContent}>
Show new message with pre-filled content
</button><buttononClick={handleGetVisitorId}>Get visitor id</button><buttononClick={handleStartTour}>Start tour</button><buttononClick={handleTrackEvent}>Track event</button><buttononClick={handleTrackEventWithMetaData}>
Track event with metadata
</button></>);};

IntercomProps

All the Intercom default attributes/props are camel cased (appId instead of app_id) in react-use-intercom, see IntercomProps to see what attributes you can pass to boot or update. Or check the Intercom docs to see all the available attributes/props.

Remark - all the listed Intercom attributes here are snake cased, in react-use-intercom are these camel cased.

Custom attributes

Still want to pass custom attributes to Intercom? Whether boot or update is used, you can add your custom properties by passing these through customAttributes in the boot or update method.

Remark - the keys of the customAttributes object should be snake cased (this is how Intercom wants them). They are rawly passed to Intercom.

const{ boot }=useIntercom();boot({name: 'Russo',customAttributes: {custom_attribute_key: 'hi there'},})

Playground

Small playground to showcase the functionalities of react-use-intercom.

useIntercom

https://devrnt.github.io/react-use-intercom/#/useIntercom

useIntercom (with Intercom tour)

https://devrnt.github.io/react-use-intercom/#/useIntercomTour

Examples

Go to examples to check out some integrations (Gatsby, NextJS...).

TypeScript

All the possible pre-defined options to pass to the Intercom instance are typed. So whenever you have to pass IntercomProps, all the possible properties will be available out of the box. These props are JavaScript 'friendly', so camelCase. No need to pass the props with snake_cased keys.

Remark - if you want to pass custom properties, you should still use snake_cased keys.

Troubleshoot

  • I'm seeing Please wrap your component with IntercomProvider in the console.

Make sure IntercomProvider is initialized before calling useIntercom(). You only need to initialize IntercomProvider once. It is advised to initialize IntercomProvider as high as possible in your application tree.

Make sure you aren't calling useIntercom() in the same component where you initialized IntercomProvider.

  • I'm seeing Some invalid props were passed to IntercomProvider. Please check following props: [properties] in the console.

Make sure you're passing the correct properties to the IntercomProvider. Check IntercomProvider to see all the properties. Mind that all the properties in react-use-intercom are camel cased, except for the customAttributes property in the boot and update method from useIntercom.

Advanced

To reduce the amount of re-renders in your React application I suggest to make use of useCallback

TLDR:useCallback will return a memoized version of the callback that only changes if one of the dependencies has changed.

This can be applied to both the IntercomProvider events and the useIntercom methods. It depends on how many times your main app gets re-rendered.

Example

import*asReactfrom'react';import{IntercomProvider,useIntercom}from'react-use-intercom';constINTERCOM_APP_ID='your-intercom-app-id';constApp=()=>{// const onHide = () => console.log('Intercom did hide the Messenger');constonHide=React.useCallback(()=>console.log('Intercom did hide the Messenger'),[],);return(<IntercomProviderappId={INTERCOM_APP_ID}onHide={onHide}><HomePage/></IntercomProvider>);};constHomePage=()=>{const{ boot }=useIntercom();// const bootWithProps = () => boot({ name: 'Russo' });constbootWithProps=React.useCallback(()=>boot({name: 'Russo'}),[boot]);return<buttononClick={bootWithProps}>Boot with props</button>;};

About

☎️ React Intercom integration without the hassle, powered by hooks.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages