Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,7 @@ private void initializeAvatar() {
avatar.setSizeFull();
this.getElement().appendChild(avatar.getElement());
this.addAttachListener(ev -> this.getElement().executeJs("return;")
.then(ev2 -> this.getElement().executeJs("this.childNodes[1].childNodes[0].appendChild($0)", avatar.getElement())
.then(ev2 -> this.getElement().executeJs("this.childNodes[1].childNodes[0].childNodes[0].appendChild($0)", avatar.getElement())
.then(ev3 -> chatWindow.setTarget(avatar))));
}

Expand Down Expand Up @@ -385,5 +385,22 @@ public void setAvatarProvider(SerializableSupplier<Avatar> avatarProvider) {
this.avatarProvider = avatarProvider;
this.initializeAvatar();
}

/**
* Return the number of unread messages to be displayed in the chat assistant.
* @return the number of unread messages
*/
public int getUnreadMessages() {
Integer unreadMessages = getState("unreadMessages", Integer.class);
return unreadMessages==null?0:unreadMessages;
}

/**
* Sets the number of unread messages to be displayed in the chat assistant.
* @param unreadMessages
*/
public void setUnreadMessages(int unreadMessages) {
setState("unreadMessages",unreadMessages);
}

}
10 changes: 10 additions & 0 deletions src/main/resources/META-INF/frontend/react/animated-fab.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import React from 'react';
import {useState} from 'react';
import Draggable from 'react-draggable';
import Fab from '@mui/material/Fab';
import Badge from '@mui/material/Badge';
import { createTheme, ThemeProvider } from '@mui/material/styles';
import { ReactAdapterElement, type RenderHooks } from 'Frontend/generated/flow/ReactAdapter';

Expand All @@ -14,6 +15,12 @@ const lumoTheme = createTheme({
dark: 'var(--lumo-primary-color-20pct)',
contrastText: 'rgb(var(--lumo-primary-contrast-color))',
},
warning: {
main: 'var(--lumo-warning-color)',
light: 'var(--lumo-warning-color-50pct)',
dark: 'var(--lumo-warning-color-20pct)',
contrastText: 'rgb(var(--lumo-warning-contrast-color))',
}
},
components: {
MuiFab: {
Expand All @@ -36,6 +43,7 @@ class AnimatedFABElement extends ReactAdapterElement {

protected override render(hooks: RenderHooks): ReactElement | null {
const [isDragging, setIsDragging] = useState<boolean>(false);
const [unreadMessages] = hooks.useState<integer>('unreadMessages');
const eventControl = (event: { type: any; }) => {
if (event.type === 'mousemove' || event.type === 'touchmove') {
setIsDragging(true)
Expand Down Expand Up @@ -63,11 +71,13 @@ class AnimatedFABElement extends ReactAdapterElement {
right: 16
}}
>
<Badge badgeContent={unreadMessages} color="warning" overlap="circular">
<Fab
color="primary"
aria-label="open chat assistant"
>
</Fab>
</Badge>
</div>
</Draggable>
</ThemeProvider>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,4 +33,8 @@ vaadin-vertical-layout.chat-assistant-container-vertical-layout {
Together, these two rotations position the resize handle in the upper-left corner.
This new position is more suitable for resizing the chat window because the chat bubble
is positioned by default in the bottom-right of the view. */
}

.MuiBadge-badge {
z-index: 2000 !important;
}
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,8 @@ public void run() {
chatAssistant.sendMessage(CustomMessage.builder().content("Hello, I am here to assist you")
.messageTime(LocalDateTime.now())
.name("Assistant").avatar("chatbot.png").tagline("Generated by assistant").build());

chatAssistant.setUnreadMessages(4);

add(message, chat, chatWithThinking, chatAssistant);
}
Expand Down
Loading