Reactions - Connected reaction picker

The ConnectedReactionPicker component renders the Reaction picker custom selector to add a new reaction to the content displayed.

Usage

Import the component in your React app as follows:

import { ReactionStore, ConnectedReactionPicker, State, MemoryReactionsStore, ReactionServiceClient } from '@atlaskit/reactions'; import { EmojiResource, EmojiResourceConfig } from '@atlaskit/emoji/resource'; // Config object for the emoji resource const config: EmojiResourceConfig = { singleEmojiApi: { getUrl: (emojiId: string) => 'https://emoji-example/emoji/site-id/emojiId', securityProvider: () => ({ headers: { 'User-Context': '{{token}}', Authorization: 'Bearer {{token}}', }, }) }, optimisticImageApi: { getUrl: (emojiId: string) => 'https://emoji-example/emoji/site-id/emojiId/path', securityProvider: () => ({ headers: { 'User-Context': '{{token}}', Authorization: 'Bearer {{token}}', }, }) }, providers: [ { url: 'https://emoji-example/emoji/standard', }, { url: 'https://emoji-example/emoji/site-id/site', securityProvider: () => ({ headers: { Authorization: 'Bearer {{token}}', }, }), }, ] }; const apiConfig = { baseUrl: 'http://www.example.org', // optional, generate token from asap, check \`pf-emoji-service\` for more info authHeader: 'Bearer token', }; // Create a client object fetching the reactions data from the specified url const client = new ReactionServiceClient(apiConfig.baseUrl, apiConfig.authHeader); // Define the initial state object const intialState: State = { reactions: {}, flash: {} }; // Define the store object that will handle all the reactions data (get/set/remove) and the API calls to the server const store = new MemoryReactionsStore(client, intialState, { subproduct: 'atlaskit', }); // Define an emoji resource object instance (EmojiResource implements the EmojiProvider interface) that will be passed as prop to the ConnectedReactionPicker component const emojiResource = new EmojiResource(config); //See warning below /** * fetch from all the providers in the config object and cache the results (see EmojiResource for more info). * Note: this is a one time fetch, so if you want to fetch from the same providers again, you need to create a new EmojiResource instance. Furhermore, you'll need to handle for a failed fetch and retry requests if your app logic requires this. */ emojiResource.fetchEmojiProvider(); // Retrieve your ari and containerAri values from the server const ari = 'ari:cloud:owner:demo-cloud-id:item/1'; const containerAri = 'ari:cloud:owner:demo-cloud-id:container/1'; const emojiProvider = new EmojiResource(config); const emojiId = { shortName: ':grimacing:', id: '1f603' }; ReactDOM.render( <ConnectedReactionPicker store={store} containerAri={containerAri} ari={demoAri} emojiProvider={Promise.resolve(emojiResource)} /> );

There should be only one instance of EmojiResource in your application

Make sure EmojiResource is initialised only once to avoid performance issues using useMemo.

Example:

Connected Reactions Picker

Memory store and Connected Picker view (same store)


Regular picker view


Use picker to add reaction, it will update reactions in a separate ConnectedReactionsView component below.

ConnectedReactionPicker Props

containerAri string required

Wrapper id for reactions list

ari string required

Individual id for a reaction

store union required

Reference to the store. @remarks This was initially implemented with a sync and Async versions and will be replaced with just a sync Store in a future release (Please use only the sync version)

One of
getReactions required function
containerId,
aris
=> undefined
toggleReaction required function
containerAri,
ari,
emojiId,
onSuccess
=> undefined
addReaction required function
containerAri,
ari,
emojiId,
onSuccess
=> undefined
getDetailedReaction required function
containerAri,
ari,
emojiId,
onSuccess
=> undefined
getState required =>
reactions object required
[key: string] required One of
status required ReactionStatus.notLoaded
,
status required ReactionStatus.loading
,
status required ReactionStatus.ready
reactions arrayType required Array
ari string required
containerAri string required
emojiId string required
count number required
reacted boolean required
users arrayType Array
id string required
displayName string required
profilePicture
path string required
accountId string
optimisticallyUpdated boolean
,
status required ReactionStatus.error
message string required
flash object required
[key: string] object required
[emojiId: string] boolean required
particleEffectByEmoji object required
[key: string] object required
[emojiId: string] boolean required
onChange required callback => undefined
removeOnChangeListener required callback => undefined
setCreateAnalyticsEvent createAnalyticsEvent => undefined
,
Promise
getReactions required function
containerId,
aris
=> undefined
toggleReaction required function
containerAri,
ari,
emojiId,
onSuccess
=> undefined
addReaction required function
containerAri,
ari,
emojiId,
onSuccess
=> undefined
getDetailedReaction required function
containerAri,
ari,
emojiId,
onSuccess
=> undefined
getState required =>
reactions object required
[key: string] required One of
status required ReactionStatus.notLoaded
,
status required ReactionStatus.loading
,
status required ReactionStatus.ready
reactions arrayType required Array
ari string required
containerAri string required
emojiId string required
count number required
reacted boolean required
users arrayType Array
id string required
displayName string required
profilePicture
path string required
accountId string
optimisticallyUpdated boolean
,
status required ReactionStatus.error
message string required
flash object required
[key: string] object required
[emojiId: string] boolean required
particleEffectByEmoji object required
[key: string] object required
[emojiId: string] boolean required
onChange required callback => undefined
removeOnChangeListener required callback => undefined
setCreateAnalyticsEvent createAnalyticsEvent => undefined