wahanegi/vibereport

View on GitHub
app/javascript/components/Pages/ResultsPage/Emojis/EmojiPicker.js

Summary

Maintainability
A
2 hrs
Test Coverage
import React, {useEffect} from 'react';
import EmojiPicker, {EmojiStyle} from "emoji-picker-react";
import axios from "axios";
import {isEmptyStr, isPresent} from "../../../helpers/helpers";

const createEmoji = (emojiObject, emojisArr, setEmojisArr, setSelectedEmoji, setEmojiObject) => {
  axios.post(`/api/v1/emojis`, {emoji_object: emojiObject})
    .then(res => {
      const emoji_code = res.data.data.emoji_data.emoji_code
      const updatedData = emojisArr.map(item => {
        if (item.emoji_code !== emojiObject.emoji_code) return item;

        return Object.assign({}, item, {
          emoji_code: item.emoji_code,
          emoji_name: item.emoji_name,
          count: item.count + 1,
          current_user_emoji: res.data.data.emoji_data,
          users: [...item.users, res.data.data.user]
        });
      });
      const addedEmoji = {
        emoji_code: emoji_code,
        emoji_name: res.data.data.emoji_data.emoji_name,
        count: 1,
        current_user_emoji: res.data.data.emoji_data,
        users: [res.data.data.user]
      };
      const addedData = [addedEmoji, ...emojisArr]
      setEmojisArr(emojisArr.some(el => el.emoji_code === emoji_code) ? updatedData : addedData)
      setSelectedEmoji('')
      setEmojiObject({})
    })
}

const removeEmoji = (emojiObject, emojisArr, setEmojisArr, setSelectedEmoji, current_user, setEmojiObject) => {
  axios.delete(`/api/v1/emojis/${emojiObject.id}`)
    .then(res => {
      if (res.data.message !== 'success') return;

      const updatedData = emojisArr.map(item => {
        if (item.emoji_code !== emojiObject.emoji_code) return item;

        const newUsers = item.users.filter(user => user.id !== current_user.id)
        return Object.assign({}, item, {
          emoji_code: item.count > 1 ? item.emoji_code : null,
          emoji_name: item.emoji_name,
          count: item.count - 1,
          users: newUsers
        });
      });

      setEmojisArr(updatedData.filter(item => item.emoji_code))
      setSelectedEmoji('')
      setEmojiObject({})
    })
}
export const onChangeEmojis = (emojiObject, emojisArr, setEmojisArr, setSelectedEmoji, current_user = {}, setEmojiObject) => {
  const repeatEmoji = emojisArr.filter(item => item.emoji_code === emojiObject.emoji_code)
  const reactedUser = repeatEmoji.find(item => item.users.some(user => user.id === current_user.id))
  isPresent(reactedUser) ?
    removeEmoji(emojiObject, emojisArr, setEmojisArr, setSelectedEmoji, current_user, setEmojiObject) :
    createEmoji(emojiObject, emojisArr, setEmojisArr, setSelectedEmoji, setEmojiObject)
}

const EmojiPickerComponent = React.forwardRef(({
                        emojiObject, setSelectedEmoji, current_user, pickerPosition,
                        emojisArr, setEmojisArr, setEmojiObject, setSelectedEmojiName,
                        setPickerPosition
                      }, ref) => {
  const onClick = (emojiData) => {
    const repeatEmoji = emojisArr.filter(item => item.emoji_code === emojiData.unified)
    const reactedUser = repeatEmoji.find(item => item.users.some(user => user.id === current_user.id))
    setEmojiObject(Object.assign({}, emojiObject, {id: reactedUser?.current_user_emoji?.id}))
    setSelectedEmoji(emojiData.unified);
    setSelectedEmojiName(emojiData.names[0])
    setPickerPosition({})
  }

  useEffect(() => {
    if (isEmptyStr(emojiObject.emoji_code)) return;

    onChangeEmojis(emojiObject, emojisArr, setEmojisArr, setSelectedEmoji, current_user, setEmojiObject)
  }, [emojiObject.emoji_code])

  return <div ref={ref} className='emoji-picker' style={pickerPosition}>
    <EmojiPicker
      onEmojiClick={onClick}
      autoFocusSearch={false}
      emojiStyle={EmojiStyle.NATIVE} />
  </div>
})

export default EmojiPickerComponent