Skip to content

Commit 7050631

Browse files
authored
feat: add support for display unread messages badge
Closes #40
1 parent ba5d7a6 commit 7050631

File tree

4 files changed

+34
-1
lines changed

4 files changed

+34
-1
lines changed

src/main/java/com/flowingcode/vaadin/addons/chatassistant/ChatAssistant.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ private void initializeAvatar() {
189189
avatar.setSizeFull();
190190
this.getElement().appendChild(avatar.getElement());
191191
this.addAttachListener(ev -> this.getElement().executeJs("return;")
192-
.then(ev2 -> this.getElement().executeJs("this.childNodes[1].childNodes[0].appendChild($0)", avatar.getElement())
192+
.then(ev2 -> this.getElement().executeJs("this.childNodes[1].childNodes[0].childNodes[0].appendChild($0)", avatar.getElement())
193193
.then(ev3 -> chatWindow.setTarget(avatar))));
194194
}
195195

@@ -385,5 +385,22 @@ public void setAvatarProvider(SerializableSupplier<Avatar> avatarProvider) {
385385
this.avatarProvider = avatarProvider;
386386
this.initializeAvatar();
387387
}
388+
389+
/**
390+
* Return the number of unread messages to be displayed in the chat assistant.
391+
* @return the number of unread messages
392+
*/
393+
public int getUnreadMessages() {
394+
Integer unreadMessages = getState("unreadMessages", Integer.class);
395+
return unreadMessages==null?0:unreadMessages;
396+
}
397+
398+
/**
399+
* Sets the number of unread messages to be displayed in the chat assistant.
400+
* @param unreadMessages
401+
*/
402+
public void setUnreadMessages(int unreadMessages) {
403+
setState("unreadMessages",unreadMessages);
404+
}
388405

389406
}

src/main/resources/META-INF/frontend/react/animated-fab.tsx

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import React from 'react';
33
import {useState} from 'react';
44
import Draggable from 'react-draggable';
55
import Fab from '@mui/material/Fab';
6+
import Badge from '@mui/material/Badge';
67
import { createTheme, ThemeProvider } from '@mui/material/styles';
78
import { ReactAdapterElement, type RenderHooks } from 'Frontend/generated/flow/ReactAdapter';
89

@@ -14,6 +15,12 @@ const lumoTheme = createTheme({
1415
dark: 'var(--lumo-primary-color-20pct)',
1516
contrastText: 'rgb(var(--lumo-primary-contrast-color))',
1617
},
18+
warning: {
19+
main: 'var(--lumo-warning-color)',
20+
light: 'var(--lumo-warning-color-50pct)',
21+
dark: 'var(--lumo-warning-color-20pct)',
22+
contrastText: 'rgb(var(--lumo-warning-contrast-color))',
23+
}
1724
},
1825
components: {
1926
MuiFab: {
@@ -36,6 +43,7 @@ class AnimatedFABElement extends ReactAdapterElement {
3643

3744
protected override render(hooks: RenderHooks): ReactElement | null {
3845
const [isDragging, setIsDragging] = useState<boolean>(false);
46+
const [unreadMessages] = hooks.useState<integer>('unreadMessages');
3947
const eventControl = (event: { type: any; }) => {
4048
if (event.type === 'mousemove' || event.type === 'touchmove') {
4149
setIsDragging(true)
@@ -63,11 +71,13 @@ class AnimatedFABElement extends ReactAdapterElement {
6371
right: 16
6472
}}
6573
>
74+
<Badge badgeContent={unreadMessages} color="warning" overlap="circular">
6675
<Fab
6776
color="primary"
6877
aria-label="open chat assistant"
6978
>
7079
</Fab>
80+
</Badge>
7181
</div>
7282
</Draggable>
7383
</ThemeProvider>

src/main/resources/META-INF/frontend/styles/chat-assistant-styles.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,8 @@ vaadin-vertical-layout.chat-assistant-container-vertical-layout {
3333
Together, these two rotations position the resize handle in the upper-left corner.
3434
This new position is more suitable for resizing the chat window because the chat bubble
3535
is positioned by default in the bottom-right of the view. */
36+
}
37+
38+
.MuiBadge-badge {
39+
z-index: 2000 !important;
3640
}

src/test/java/com/flowingcode/vaadin/addons/chatassistant/ChatAssistantDemo.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,8 @@ public void run() {
9797
chatAssistant.sendMessage(CustomMessage.builder().content("Hello, I am here to assist you")
9898
.messageTime(LocalDateTime.now())
9999
.name("Assistant").avatar("chatbot.png").tagline("Generated by assistant").build());
100+
101+
chatAssistant.setUnreadMessages(4);
100102

101103
add(message, chat, chatWithThinking, chatAssistant);
102104
}

0 commit comments

Comments
 (0)