{"version":3,"file":"index-DGnORKci.js","sources":["../../src/components/ConversationDetails/Sentiment/scoreToEmoji.ts","../../src/components/ConversationDetails/Sentiment/SentimentContents.tsx","../../src/components/ConversationDetails/Sentiment/index.tsx"],"sourcesContent":["export const scoreToEmoji = (score: number) => {\n if (score >= 2) return '😄' // +2\n if (score > 0 && score < 2) return '🙂' // +1\n if (score > -2 && score <= 0) return '😕' // -1\n return '😠' // -2 or less\n}\n","import { SentimentWord } from '@capturi/api-conversations'\nimport { formatTime } from '@capturi/audio'\nimport { useCurrentUser } from '@capturi/core'\nimport { useOrganization, useSingleUser } from '@capturi/stores'\nimport { PlayButton } from '@capturi/ui-components'\nimport { Flex, Table, Tbody, Td, Text, Th, Thead, Tr } from '@chakra-ui/react'\nimport { Trans, select, t } from '@lingui/macro'\nimport React from 'react'\nimport { scoreToEmoji } from './scoreToEmoji'\n\ntype Props = {\n words: SentimentWord[]\n agentUid: string\n handlePlay: (timestamp: number, trackId: string) => void\n isPlayable?: boolean\n hasAudio: boolean\n isPlaying: boolean\n playingTrackId: string\n}\n\nconst SentimentContents: React.FC = ({\n words,\n agentUid,\n handlePlay,\n isPlayable,\n hasAudio,\n isPlaying,\n playingTrackId,\n}) => {\n const user = useCurrentUser()\n const { organizationType } = useOrganization()\n const { name } = useSingleUser(agentUid)\n\n return (\n \n \n \n \n \n \n \n \n \n \n {words.map((w) => {\n const id = `${w.speaker}:${w.word}:${w.when}`\n const isTrackPlaying = isPlaying && id === playingTrackId\n return (\n handlePlay(w.when, id)}\n aria-label={t`Play audio`}\n >\n \n \n \n \n \n )\n })}\n \n
{isPlayable ? Play : Timestamp}\n Word\n \n Sentiment\n \n Speaker\n
\n \n \n {formatTime(w.when)}\n \n {w.word}{scoreToEmoji(w.score)}\n {w.speaker === 'User' ? (\n {name}\n ) : (\n <>\n {select(organizationType, {\n public: 'Citizen',\n other: 'Customer',\n })}\n \n )}\n
\n )\n}\n\nexport default SentimentContents\n","import analytics from '@capturi/analytics'\nimport {\n ConversationResponseModel,\n ConversationSentimentResponseModel,\n SentimentWord,\n conversationsAPI,\n} from '@capturi/api-conversations'\nimport { SentimentScore, SentimentSpeaker } from '@capturi/api-sentiment'\nimport { useAPI } from '@capturi/api-utils'\nimport { useAudioContext } from '@capturi/audio'\nimport { useOrganization, useSingleUser } from '@capturi/stores'\nimport {\n ButtonCheckbox,\n ContentPlaceholder,\n Emoji,\n} from '@capturi/ui-components'\nimport {\n Avatar,\n Box,\n Circle,\n Flex,\n FlexProps,\n Grid,\n Stack,\n StackDivider,\n Text,\n TextProps,\n useCheckboxGroup,\n} from '@chakra-ui/react'\nimport { Trans, plural, select, t } from '@lingui/macro'\nimport Link from 'components/Link'\nimport UserAvatar from 'components/UserAvatar'\nimport React, { useEffect, useMemo, useState } from 'react'\n\nimport { Hit } from '../Audio/types'\nimport SentimentContents from './SentimentContents'\n\ntype SentimentViewProps = {\n conversation: ConversationResponseModel\n setHits: (hits: Hit[]) => void\n}\n\nconst transScore = (score: SentimentScore): string =>\n select(score ?? 'Medium', {\n Low: 'Low',\n Medium: 'Medium',\n High: 'High',\n other: 'Medium',\n })\n\ntype ScoreFilterValue = 'all' | 'positive' | 'negative'\n\nconst MenuItem: React.FC<\n TextProps & { isActive: boolean; isDisabled?: boolean; count?: number }\n> = ({ children, isActive, isDisabled = false, count, onClick, ...props }) => {\n const styleProps: FlexProps = {\n cursor: 'pointer',\n color: isActive ? 'primary.500' : 'inherit',\n }\n if (isDisabled) {\n props.cursor = 'not-allowed'\n props.opacity = '0.6'\n }\n return (\n {\n if (isDisabled) return\n onClick?.(e)\n }}\n {...styleProps}\n {...props}\n >\n {children} {count != null ? `(${count})` : ''}\n \n )\n}\n\nconst Sentiments: React.FC = ({\n conversation,\n setHits,\n}) => {\n const { userUid: agentUid, uid, dateTime } = conversation\n const isPlayable = !conversation.deleted\n const { data } = useAPI(\n conversationsAPI.getSentiment(conversation.uid),\n )\n const { isPlaying, play, pause } = useAudioContext(\n `/playback/audio/${conversation.uid}`,\n {\n rollbackSeconds: 3,\n },\n )\n const { organizationType } = useOrganization()\n const [playingTrackId, setPlayingTrackId] = React.useState('')\n\n const [scoreFilterValue, setScoreFilterValue] =\n useState('all')\n const [speakerFilterValues, setSpeakerFilterValues] = useState<\n SentimentSpeaker[]\n >(['User', 'Other'])\n\n const { getCheckboxProps } = useCheckboxGroup({\n defaultValue: speakerFilterValues,\n onChange: (values) => {\n setSpeakerFilterValues(values as SentimentSpeaker[])\n },\n })\n\n const { name, profileImage } = useSingleUser(agentUid)\n\n const {\n filteredWords,\n filteredPositiveWords,\n filteredNegativeWords,\n counts,\n } = useMemo(() => {\n if (data == null) {\n return {\n filteredWords: [],\n extraWords: [],\n counts: {\n negative: 0,\n positive: 0,\n totalUnfiltered: 0,\n },\n }\n }\n\n const speakerFilter = (w: SentimentWord): boolean =>\n speakerFilterValues.includes(w.speaker)\n\n const totalWordsUnfiltered = data.negativeWords.concat(\n data.positiveWords,\n ).length\n const filteredNegativeWords = data.negativeWords.filter(speakerFilter)\n const filteredPositiveWords = data.positiveWords.filter(speakerFilter)\n\n let filteredWords = [...filteredNegativeWords, ...filteredPositiveWords]\n if (scoreFilterValue === 'negative') {\n filteredWords = filteredNegativeWords\n }\n if (scoreFilterValue === 'positive') {\n filteredWords = filteredPositiveWords\n }\n\n return {\n filteredWords: filteredWords.sort((a, b) => a.when - b.when),\n filteredPositiveWords: filteredPositiveWords.sort(\n (a, b) => a.when - b.when,\n ),\n filteredNegativeWords: filteredNegativeWords.sort(\n (a, b) => a.when - b.when,\n ),\n counts: {\n negative: filteredNegativeWords.length,\n positive: filteredPositiveWords.length,\n totalUnfiltered: totalWordsUnfiltered,\n },\n }\n }, [data, scoreFilterValue, speakerFilterValues])\n\n useEffect(() => {\n const positiveHits: Hit[] =\n filteredPositiveWords?.map((word) => ({\n id: word.word + word.speaker + word.when,\n title: word.word,\n timestamp: word.when,\n speakerId: word.speaker,\n shape: 'Circle',\n color: 'segments.quaternary.500',\n tooltipIsOpen: true,\n isDimmed: scoreFilterValue === 'negative',\n })) ?? []\n\n const negativeHits: Hit[] =\n filteredNegativeWords?.map((word) => ({\n id: word.word + word.speaker + word.when,\n title: word.word,\n timestamp: word.when,\n speakerId: word.speaker,\n shape: 'Circle',\n color: 'segments.senary.500',\n tooltipIsOpen: true,\n isDimmed: scoreFilterValue === 'positive',\n })) ?? []\n\n const allHits =\n scoreFilterValue === 'positive'\n ? [...negativeHits, ...positiveHits]\n : [...positiveHits, ...negativeHits]\n setHits?.(allHits)\n }, [filteredPositiveWords, filteredNegativeWords, setHits, scoreFilterValue])\n\n const handlePlay = (timestamp: number, trackId: string): void => {\n if (isPlaying && trackId === playingTrackId) {\n pause()\n } else {\n play(timestamp, true)\n setPlayingTrackId(trackId)\n analytics.event('conversationDetails_sentimentList_playAudio', {\n timestamp,\n uid,\n date: dateTime.toUTCString(),\n })\n }\n }\n\n if (!data) return null\n\n return (\n <>\n \n \n \n {name}\n \n \n {transScore(data.wordScore.user)}\n \n \n Sentiment\n \n \n \n \n \n \n {select(organizationType, {\n public: 'Citizen',\n other: 'Customer',\n })}\n \n \n \n {transScore(data.wordScore.other)}\n \n \n Sentiment\n \n \n \n \n \n {speakerFilterValues.length === 0 ? (\n \n ) : filteredWords.length === 0 ? (\n \n ) : (\n \n }\n >\n setScoreFilterValue('all')}\n fontWeight=\"regular\"\n fontSize=\"md\"\n mt=\"0.35rem\"\n mb=\"2px\"\n >\n All words\n \n \n setScoreFilterValue('positive')}\n count={counts.positive}\n isDisabled={counts.positive === 0}\n alignItems=\"center\"\n >\n \n Positive phrases\n \n setScoreFilterValue('negative')}\n count={counts.negative}\n isDisabled={counts.negative === 0}\n alignItems=\"center\"\n >\n \n Negative phrases\n \n \n \n \n \n )}\n \n \n )\n}\n\nexport default Sentiments\n\nconst renderNoResultsMessage = (\n speakers: SentimentSpeaker[],\n scoreFilter: ScoreFilterValue,\n): React.ReactNode => {\n if (scoreFilter === 'all') {\n return t`No words with either positive or negative score were recognized for the selected ${plural(\n speakers.length,\n {\n one: 'speaker',\n other: 'speakers',\n },\n )}.`\n }\n\n const wordScoreSentiment = select(scoreFilter, {\n positive: 'positive',\n negative: 'negative',\n other: 'unknown',\n })\n\n return t`No words with ${wordScoreSentiment} score were recognized for the selected ${plural(\n speakers.length,\n {\n one: 'speaker',\n other: 'speakers',\n },\n )}.`\n}\n\nconst NoFilteredWordsPlaceholder: React.FC<{\n speakers: SentimentSpeaker[]\n scoreFilter: ScoreFilterValue\n}> = ({ speakers, scoreFilter }) => {\n return (\n \n \n Medium sentiment\n \n \n \n {renderNoResultsMessage(speakers, scoreFilter)}\n \n \n \n Read about which words affect sentiment\n \n \n \n )\n}\n\nconst NoSpeakerPlaceholder: React.FC = () => {\n return (\n \n \n Select a speaker\n \n \n \n )\n}\n"],"names":["scoreToEmoji","score","SentimentContents","words","agentUid","handlePlay","isPlayable","hasAudio","isPlaying","playingTrackId","user","useCurrentUser","organizationType","useOrganization","name","useSingleUser","Table","Thead","fontSize","fontWeight","Tr","Th","_jsx","Trans","Tbody","map","w","id","speaker","word","when","isTrackPlaying","cursor","onClick","aria-label","i18n","Td","Flex","alignItems","PlayButton","isDisabled","permissions","playback","size","mr","Text","formatTime","_Fragment","transScore","MenuItem","children","isActive","count","props","styleProps","color","opacity","e","Sentiments","conversation","setHits","userUid","uid","dateTime","deleted","data","useAPI","conversationsAPI","getSentiment","play","pause","useAudioContext","rollbackSeconds","setPlayingTrackId","React","useState","scoreFilterValue","setScoreFilterValue","speakerFilterValues","setSpeakerFilterValues","getCheckboxProps","useCheckboxGroup","defaultValue","onChange","values","profileImage","filteredWords","filteredPositiveWords","filteredNegativeWords","counts","useMemo","extraWords","negative","positive","totalUnfiltered","speakerFilter","includes","totalWordsUnfiltered","negativeWords","concat","positiveWords","length","filter","sort","a","b","useEffect","positiveHits","title","timestamp","speakerId","shape","tooltipIsOpen","isDimmed","negativeHits","allHits","trackId","analytics","event","date","toUTCString","Grid","columnGap","rowGap","templateColumns","md","ButtonCheckbox","value","UserAvatar","Box","flex","textAlign","textShadow","wordScore","lineHeight","Avatar","other","mt","NoSpeakerPlaceholder","NoFilteredWordsPlaceholder","speakers","scoreFilter","_jsxs","Stack","direction","spacing","divider","StackDivider","borderColor","mb","minW","maxW","Circle","bg","renderNoResultsMessage","wordScoreSentiment","ContentPlaceholder","Emoji","symbol","pl","Link","to"],"mappings":"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"}