Skip to content

Commit 623f3f1

Browse files
epwinchelljosejuliojustinorringer
authored
full screen toggle (#100)
* full screen toggle * Implement expand/collapse logic * more updates --------- Co-authored-by: Josejulio Martínez <[email protected]> Co-authored-by: Justin Orringer <[email protected]>
1 parent 1d8c0f0 commit 623f3f1

File tree

4 files changed

+84
-26
lines changed

4 files changed

+84
-26
lines changed

src/Components/AstroChat/AstroChat.tsx

+44-13
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,19 @@
11
import React, { Dispatch, KeyboardEventHandler, SetStateAction, useCallback, useLayoutEffect, useRef, useState } from 'react';
2-
import { Button, InputGroup, InputGroupText, Split, SplitItem, Stack, StackItem, Text, TextArea, TextContent } from '@patternfly/react-core';
2+
import {
3+
Button,
4+
InputGroup,
5+
InputGroupText,
6+
Split,
7+
SplitItem,
8+
Stack,
9+
StackItem,
10+
Text,
11+
TextArea,
12+
TextContent,
13+
Toolbar,
14+
ToolbarGroup,
15+
ToolbarItem,
16+
} from '@patternfly/react-core';
317
import { original, produce } from 'immer';
418
import AngleDownIcon from '@patternfly/react-icons/dist/esm/icons/angle-down-icon';
519
import { LoadingMessageEntry } from '../Message/LoadingMessageEntry';
@@ -9,6 +23,8 @@ import { SystemMessageEntry } from '../Message/SystemMessageEntry';
923
import { UserMessageEntry } from '../Message/UserMessageEntry';
1024
import { FeedbackAssistantEntry } from '../Message/FeedbackMessageEntry';
1125
import PlaneIcon from '@patternfly/react-icons/dist/esm/icons/paper-plane-icon';
26+
import CompressAltIcon from '@patternfly/react-icons/dist/esm/icons/compress-alt-icon';
27+
import ExpandAltIcon from '@patternfly/react-icons/dist/esm/icons/expand-alt-icon';
1228
import { AskOptions } from './useAstro';
1329
import { BannerEntry } from '../Message/BannerEntry';
1430
import { ThumbsMessageEntry } from '../Message/ThumbsMessageEntry';
@@ -20,11 +36,22 @@ interface AstroChatProps {
2036
preview: boolean;
2137
onClose: () => void;
2238
blockInput: boolean;
39+
fullscreen: boolean;
40+
setFullScreen: (isFullScreen: boolean) => void;
2341
}
2442

2543
const findConversationEndBanner = (message: Message) => message.from === From.INTERFACE && message.type === 'finish_conversation_banner';
2644

27-
export const AstroChat: React.FunctionComponent<AstroChatProps> = ({ messages, setMessages, ask, preview, onClose, blockInput }) => {
45+
export const AstroChat: React.FunctionComponent<AstroChatProps> = ({
46+
messages,
47+
setMessages,
48+
ask,
49+
preview,
50+
onClose,
51+
blockInput,
52+
fullscreen,
53+
setFullScreen,
54+
}) => {
2855
const astroContainer = useRef<HTMLDivElement>(null);
2956
const [input, setInput] = useState<string>('');
3057

@@ -85,23 +112,27 @@ export const AstroChat: React.FunctionComponent<AstroChatProps> = ({ messages, s
85112

86113
return (
87114
<div ref={astroContainer}>
88-
<Stack className="astro-l-stack">
89-
<StackItem className="astro-l-stack__header pf-v5-pt-xs">
115+
<Stack className={`astro-l-stack ${fullscreen ? 'astro-l-stack-full-screen' : ''}`}>
116+
<StackItem className="astro-l-stack__header pf-v5-u-py-md">
90117
<Split hasGutter>
91118
<SplitItem isFilled>
92-
<TextContent className="pf-v5-u-pt-md pf-v5-u-pl-lg pf-u-color-light-100 pf-v5-u-font-size-xl">
119+
<TextContent className="pf-v5-u-pl-lg pf-u-color-light-100 pf-v5-u-font-size-xl">
93120
<Text>Virtual Assistant</Text>
94121
</TextContent>
95122
</SplitItem>
96123
<SplitItem>
97-
<Button
98-
variant="plain"
99-
aria-label="Close virtual assistant"
100-
className="astro-c-button-minimize pf-v5-u-p-md pf-v5-u-pl-sm pf-v5-u-color-light-100"
101-
onClick={onClose}
102-
>
103-
<AngleDownIcon />
104-
</Button>
124+
<ToolbarGroup variant="icon-button-group">
125+
<ToolbarItem>
126+
<Button variant="plain" aria-label="Full screen" onClick={() => setFullScreen(!fullscreen)} className="pf-v5-u-color-light-100">
127+
{fullscreen ? <CompressAltIcon /> : <ExpandAltIcon />}
128+
</Button>
129+
</ToolbarItem>
130+
<ToolbarItem>
131+
<Button variant="plain" aria-label="Close virtual assistant" onClick={onClose} className="pf-v5-u-color-light-100">
132+
<AngleDownIcon />
133+
</Button>
134+
</ToolbarItem>
135+
</ToolbarGroup>
105136
</SplitItem>
106137
</Split>
107138
</StackItem>

src/Components/AstroChat/AstroChatSkeleton.tsx

+17-10
Original file line numberDiff line numberDiff line change
@@ -12,30 +12,37 @@ import {
1212
TextArea,
1313
TextAreaReadOnlyVariant,
1414
TextContent,
15+
ToolbarGroup,
16+
ToolbarItem,
1517
} from '@patternfly/react-core';
1618
import AngleDownIcon from '@patternfly/react-icons/dist/esm/icons/angle-down-icon';
19+
import ExpandAltIcon from '@patternfly/react-icons/dist/esm/icons/expand-alt-icon';
1720
import PlaneIcon from '@patternfly/react-icons/dist/esm/icons/paper-plane-icon';
1821

1922
export const AstroChatSkeleton: React.FunctionComponent<unknown> = () => {
2023
return (
2124
<div>
2225
<Stack className="astro-l-stack">
23-
<StackItem className="astro-l-stack__header pf-v5-pt-xs">
26+
<StackItem className="astro-l-stack__header pf-v5-u-py-md">
2427
<Split hasGutter>
2528
<SplitItem isFilled>
26-
<TextContent className="pf-v5-u-pt-md pf-v5-u-pl-lg pf-u-color-light-100 pf-v5-u-font-size-xl">
29+
<TextContent className="pf-v5-u-pl-lg pf-u-color-light-100 pf-v5-u-font-size-xl">
2730
<Text>Virtual Assistant</Text>
2831
</TextContent>
2932
</SplitItem>
3033
<SplitItem>
31-
<Button
32-
variant="plain"
33-
aria-label="Close virtual assistant"
34-
className="astro-c-button-minimize pf-v5-u-p-md pf-v5-u-pl-sm pf-v5-u-color-light-100"
35-
isDisabled
36-
>
37-
<AngleDownIcon />
38-
</Button>
34+
<ToolbarGroup variant="icon-button-group">
35+
<ToolbarItem>
36+
<Button variant="plain" aria-label="Full screen" className="pf-v5-u-color-light-100">
37+
<ExpandAltIcon />
38+
</Button>
39+
</ToolbarItem>
40+
<ToolbarItem>
41+
<Button variant="plain" aria-label="Close virtual assistant" className="pf-v5-u-color-light-100">
42+
<AngleDownIcon />
43+
</Button>
44+
</ToolbarItem>
45+
</ToolbarGroup>
3946
</SplitItem>
4047
</Split>
4148
</StackItem>

src/SharedComponents/AstroVirtualAssistant/AstroVirtualAssistant.tsx

+4-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ const messageProcessors = [commandMessageProcessor];
1818

1919
export const AstroVirtualAssistant: FunctionComponent = () => {
2020
const { messages, setMessages, ask, start, status, loadingResponse } = useAstro(messageProcessors);
21-
const [isOpen, setOpen] = useState<boolean>();
21+
const [isOpen, setOpen] = useState<boolean>(false);
22+
const [isFullScreen, setFullScreen] = useState<boolean>(false);
2223
const [sessionStatus, setSessionStatus] = useState<SessionStatus>();
2324
const chrome = useChrome();
2425

@@ -53,6 +54,8 @@ export const AstroVirtualAssistant: FunctionComponent = () => {
5354
blockInput={loadingResponse}
5455
preview={chrome.isBeta()}
5556
onClose={() => setOpen(false)}
57+
fullscreen={isFullScreen}
58+
setFullScreen={setFullScreen}
5659
/>
5760
)}
5861
{status === Status.LOADING && isOpen && <AstroChatSkeleton />}

src/SharedComponents/AstroVirtualAssistant/astro-virtual-assistant.scss

+19-2
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,9 @@
2424
background: url(../../assets/header-background-01.svg) var(--pf-v5-global--palette--red-200);
2525
background-repeat: no-repeat;
2626
background-position: 75% 0%;
27-
.astro-c-button-minimize {
28-
font-size: 24px;
27+
button {
28+
padding-left: 0;
29+
padding-right: 14px;
2930
}
3031
}
3132
&__body {
@@ -146,6 +147,22 @@
146147
}
147148
}
148149

150+
.astro-l-stack-full-screen {
151+
height: calc(100vh - 220px);
152+
@media screen and (max-width: 768px) {
153+
width: 100vw;
154+
}
155+
@media screen and (min-width: 769px) {
156+
width: 75vw;
157+
}
158+
@media screen and (min-width: 992px) {
159+
width: 50vw;
160+
}
161+
@media screen and (min-width: 1200px) {
162+
width: 40vw;
163+
}
164+
}
165+
149166
.astro-wrapper-stack {
150167
.astro-wrapper-stack__badge {
151168
align-self: end;

0 commit comments

Comments
 (0)