Skip to content

Commit c089ea7

Browse files
committed
Chat Split: land. Controls in Page Menu. Fixes #208
1 parent 190010b commit c089ea7

File tree

5 files changed

+36
-51
lines changed

5 files changed

+36
-51
lines changed

src/apps/chat/AppChat.tsx

+12-13
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import { themeBgAppChatComposer } from '~/common/app.theme';
2222
import { useFolderStore } from '~/common/state/store-folders';
2323
import { useIsMobile } from '~/common/components/useMatchMedia';
2424
import { useOptimaLayout, usePluggableOptimaLayout } from '~/common/layout/optima/useOptimaLayout';
25-
import { useUXLabsStore } from '~/common/state/store-ux-labs';
2625

2726
import type { ComposerOutputMultiPart } from './components/composer/composer.types';
2827
import { ChatDrawerMemo } from './components/applayout/ChatDrawer';
@@ -311,24 +310,23 @@ export function AppChat() {
311310
const handleConversationBranch = React.useCallback((conversationId: DConversationId, messageId: string | null): DConversationId | null => {
312311
showNextTitle.current = true;
313312
const branchedConversationId = branchConversation(conversationId, messageId);
313+
if (isSplitPane)
314+
openSplitConversationId(branchedConversationId);
315+
else
316+
setFocusedConversationId(branchedConversationId);
314317
addSnackbar({
315318
key: 'branch-conversation',
316319
message: 'Branch started.',
317320
type: 'success',
318321
overrides: {
319-
autoHideDuration: 3000,
322+
autoHideDuration: 2000,
320323
startDecorator: <ForkRightIcon />,
321324
},
322325
});
323-
const branchInAltPanel = useUXLabsStore.getState().labsSplitBranching;
324-
if (branchInAltPanel)
325-
openSplitConversationId(branchedConversationId);
326-
else
327-
setFocusedConversationId(branchedConversationId);
328326
return branchedConversationId;
329-
}, [branchConversation, openSplitConversationId, setFocusedConversationId]);
327+
}, [branchConversation, isSplitPane, openSplitConversationId, setFocusedConversationId]);
330328

331-
const handleConversationFlatten = (conversationId: DConversationId) => setFlattenConversationId(conversationId);
329+
const handleConversationFlatten = React.useCallback((conversationId: DConversationId) => setFlattenConversationId(conversationId), []);
332330

333331
const handleConfirmedClearConversation = React.useCallback(() => {
334332
if (clearConversationId) {
@@ -386,10 +384,8 @@ export function AppChat() {
386384
const centerItems = React.useMemo(() =>
387385
<ChatDropdowns
388386
conversationId={focusedConversationId}
389-
isSplitPanes={isSplitPane}
390-
onToggleSplitPanes={toggleSplitPane}
391387
/>,
392-
[focusedConversationId, isSplitPane, toggleSplitPane],
388+
[focusedConversationId],
393389
);
394390

395391
const drawerContent = React.useMemo(() =>
@@ -410,16 +406,19 @@ export function AppChat() {
410406

411407
const menuItems = React.useMemo(() =>
412408
<ChatMenuItems
409+
isMobile={isMobile}
413410
conversationId={focusedConversationId}
414411
hasConversations={!areChatsEmpty}
415412
isConversationEmpty={isFocusedChatEmpty}
416413
isMessageSelectionMode={isMessageSelectionMode}
414+
isSplitPane={isSplitPane}
417415
setIsMessageSelectionMode={setIsMessageSelectionMode}
418416
onConversationBranch={handleConversationBranch}
419417
onConversationClear={handleConversationClear}
420418
onConversationFlatten={handleConversationFlatten}
419+
onToggleSplitPanes={toggleSplitPane}
421420
/>,
422-
[areChatsEmpty, focusedConversationId, handleConversationBranch, handleConversationClear, isFocusedChatEmpty, isMessageSelectionMode],
421+
[areChatsEmpty, focusedConversationId, handleConversationBranch, handleConversationClear, handleConversationFlatten, isFocusedChatEmpty, isMessageSelectionMode, isMobile, isSplitPane, toggleSplitPane],
423422
);
424423

425424
usePluggableOptimaLayout(drawerContent, centerItems, menuItems, 'AppChat');
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,6 @@
11
import * as React from 'react';
22

3-
import { IconButton } from '@mui/joy';
4-
import VerticalSplitIcon from '@mui/icons-material/VerticalSplit';
5-
import VerticalSplitOutlinedIcon from '@mui/icons-material/VerticalSplitOutlined';
6-
73
import type { DConversationId } from '~/common/state/store-chats';
8-
import { GoodTooltip } from '~/common/components/GoodTooltip';
9-
import { useUXLabsStore } from '~/common/state/store-ux-labs';
104

115
import { useChatLLMDropdown } from './useLLMDropdown';
126
import { usePersonaIdDropdown } from './usePersonaDropdown';
@@ -15,18 +9,13 @@ import { useFolderDropdown } from './folder/useFolderDropdown';
159

1610
export function ChatDropdowns(props: {
1711
conversationId: DConversationId | null
18-
isSplitPanes: boolean
19-
onToggleSplitPanes: () => void
2012
}) {
2113

2214
// state
2315
const { chatLLMDropdown } = useChatLLMDropdown();
2416
const { personaDropdown } = usePersonaIdDropdown(props.conversationId);
2517
const { folderDropdown } = useFolderDropdown(props.conversationId);
2618

27-
// external state
28-
const labsSplitBranching = useUXLabsStore(state => state.labsSplitBranching);
29-
3019
return <>
3120

3221
{/* Persona selector */}
@@ -38,18 +27,5 @@ export function ChatDropdowns(props: {
3827
{/* Folder selector */}
3928
{folderDropdown}
4029

41-
{/* Split Panes button */}
42-
{labsSplitBranching && (
43-
<GoodTooltip title={props.isSplitPanes ? 'Close Split Panes' : 'Split Conversation Vertically'}>
44-
<IconButton
45-
variant={props.isSplitPanes ? 'outlined' : undefined}
46-
onClick={props.onToggleSplitPanes}
47-
// sx={{ mx: 'auto' }}
48-
>
49-
{props.isSplitPanes ? <VerticalSplitIcon /> : <VerticalSplitOutlinedIcon />}
50-
</IconButton>
51-
</GoodTooltip>
52-
)}
53-
5430
</>;
5531
}

src/apps/chat/components/applayout/ChatMenuItems.tsx

+22
Original file line numberDiff line numberDiff line change
@@ -6,24 +6,32 @@ import CheckBoxOutlinedIcon from '@mui/icons-material/CheckBoxOutlined';
66
import ClearIcon from '@mui/icons-material/Clear';
77
import CompressIcon from '@mui/icons-material/Compress';
88
import ForkRightIcon from '@mui/icons-material/ForkRight';
9+
import HorizontalSplitIcon from '@mui/icons-material/HorizontalSplit';
10+
import HorizontalSplitOutlinedIcon from '@mui/icons-material/HorizontalSplitOutlined';
911
import SettingsSuggestIcon from '@mui/icons-material/SettingsSuggest';
12+
import VerticalSplitIcon from '@mui/icons-material/VerticalSplit';
13+
import VerticalSplitOutlinedIcon from '@mui/icons-material/VerticalSplitOutlined';
1014

1115
import type { DConversationId } from '~/common/state/store-chats';
16+
import { GoodTooltip } from '~/common/components/GoodTooltip';
1217
import { KeyStroke } from '~/common/components/KeyStroke';
1318
import { useOptimaDrawers } from '~/common/layout/optima/useOptimaDrawers';
1419

1520
import { useChatShowSystemMessages } from '../../store-app-chat';
1621

1722

1823
export function ChatMenuItems(props: {
24+
isMobile: boolean,
1925
conversationId: DConversationId | null,
2026
hasConversations: boolean,
2127
isConversationEmpty: boolean,
2228
isMessageSelectionMode: boolean,
29+
isSplitPane: boolean
2330
setIsMessageSelectionMode: (isMessageSelectionMode: boolean) => void,
2431
onConversationBranch: (conversationId: DConversationId, messageId: string | null) => void,
2532
onConversationClear: (conversationId: DConversationId) => void,
2633
onConversationFlatten: (conversationId: DConversationId) => void,
34+
onToggleSplitPanes: () => void,
2735
}) {
2836

2937
// external state
@@ -64,6 +72,20 @@ export function ChatMenuItems(props: {
6472

6573
return <>
6674

75+
{/* Split/Unsplit panes */}
76+
<GoodTooltip title={props.isSplitPane ? 'Close Split Panes' : 'Split Conversation Vertically'}>
77+
<MenuItem onClick={props.onToggleSplitPanes}>
78+
<ListItemDecorator>{
79+
props.isMobile
80+
? (props.isSplitPane ? <HorizontalSplitIcon /> : <HorizontalSplitOutlinedIcon />)
81+
: (props.isSplitPane ? <VerticalSplitIcon /> : <VerticalSplitOutlinedIcon />)
82+
}</ListItemDecorator>
83+
{props.isSplitPane ? 'Unsplit' : props.isMobile ? 'Split Down' : 'Split Right'}
84+
</MenuItem>
85+
</GoodTooltip>
86+
87+
<ListDivider />
88+
6789
{/*<ListItem>*/}
6890
{/* <Typography level='body-sm'>*/}
6991
{/* Conversation*/}

src/apps/settings-modal/UxLabsSettings.tsx

+2-8
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import * as React from 'react';
33
import { FormControl, Typography } from '@mui/joy';
44
import AddAPhotoIcon from '@mui/icons-material/AddAPhoto';
55
import ScreenshotMonitorIcon from '@mui/icons-material/ScreenshotMonitor';
6-
import VerticalSplitIcon from '@mui/icons-material/VerticalSplit';
76

87
import { FormLabelStart } from '~/common/components/forms/FormLabelStart';
98
import { FormSwitchControl } from '~/common/components/forms/FormSwitchControl';
@@ -19,7 +18,6 @@ export function UxLabsSettings() {
1918
const {
2019
labsAttachScreenCapture, setLabsAttachScreenCapture,
2120
labsCameraDesktop, setLabsCameraDesktop,
22-
labsSplitBranching, setLabsSplitBranching,
2321
} = useUXLabsStore();
2422

2523
return <>
@@ -34,15 +32,11 @@ export function UxLabsSettings() {
3432
checked={labsCameraDesktop} onChange={setLabsCameraDesktop}
3533
/>}
3634

37-
<FormSwitchControl
38-
title={<><VerticalSplitIcon color={labsSplitBranching ? 'primary' : undefined} sx={{ mr: 0.25 }} /> Split Branching</>} description={/*'v1.6 · ' +*/ (labsSplitBranching ? 'Enabled' : 'Disabled')}
39-
checked={labsSplitBranching} onChange={setLabsSplitBranching}
40-
/>
41-
4235
<FormControl orientation='horizontal' sx={{ justifyContent: 'space-between', alignItems: 'center' }}>
4336
<FormLabelStart title='Graduated' description='Ex-labs' />
4437
<Typography level='body-xs'>
45-
<Link href='https://github.com/enricoros/big-AGI/issues/359' target='_blank'>Draw App</Link>
38+
<Link href='https://github.com/enricoros/big-AGI/issues/208' target='_blank'>Split Chats</Link>
39+
{' · '}<Link href='https://github.com/enricoros/big-AGI/issues/359' target='_blank'>Draw App</Link>
4640
{' · '}<Link href='https://github.com/enricoros/big-AGI/issues/354' target='_blank'>Call AGI</Link>
4741
{' · '}<Link href='https://github.com/enricoros/big-AGI/issues/282' target='_blank'>Persona Creator</Link>
4842
{' · '}<Link href='https://github.com/enricoros/big-agi/issues/192' target='_blank'>Auto Diagrams</Link>

src/common/state/store-ux-labs.ts

-6
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,6 @@ interface UXLabsStore {
1818
labsCameraDesktop: boolean;
1919
setLabsCameraDesktop: (labsCameraDesktop: boolean) => void;
2020

21-
labsSplitBranching: boolean;
22-
setLabsSplitBranching: (labsSplitBranching: boolean) => void;
23-
2421
}
2522

2623
export const useUXLabsStore = create<UXLabsStore>()(
@@ -33,9 +30,6 @@ export const useUXLabsStore = create<UXLabsStore>()(
3330
labsCameraDesktop: false,
3431
setLabsCameraDesktop: (labsCameraDesktop: boolean) => set({ labsCameraDesktop }),
3532

36-
labsSplitBranching: false,
37-
setLabsSplitBranching: (labsSplitBranching: boolean) => set({ labsSplitBranching }),
38-
3933
}),
4034
{
4135
name: 'app-ux-labs',

0 commit comments

Comments
 (0)