Skip to content

Commit 238519e

Browse files
author
Magomed-Elbi_Dzhukalaev
committed
fix(chat): move User to BaseHeader, move SettingsModal to ChatDialogs
1 parent 4b0bec8 commit 238519e

File tree

9 files changed

+70
-155
lines changed

9 files changed

+70
-155
lines changed

apps/chat/src/components/Chat/ChatModalsManager.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { UnshareDialog } from '@/src/components/Common/UnshareDialog';
77
import { UserMobile } from '@/src/components/Header/User/UserMobile';
88
import { DeleteMarketplaceEntityDialog } from '@/src/components/Marketplace/DeleteMarketplaceEntityDialog';
99
import { PromptModal } from '@/src/components/Promptbar/components/PromptModal';
10+
import { SettingDialog } from '@/src/components/Settings/SettingDialog';
1011

1112
import { PromptVariablesForApplyDialog } from './ChatInput/PromptVariablesForApplyDialog';
1213
import { PublishDialog } from './Publish/PublishDialog';
@@ -29,6 +30,7 @@ export function ChatModalsManager() {
2930
<AgentDialogs />
3031
<ToolsetDialogs />
3132
<DeleteMarketplaceEntityDialog />
33+
<SettingDialog />
3234
</>
3335
);
3436
}

apps/chat/src/components/Header/BaseHeader.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import classNames from 'classnames';
33
import { useAppSelector } from '@/src/store/hooks';
44
import { SettingsSelectors } from '@/src/store/selectors';
55

6+
import { User } from '@/src/components/Header/User/User';
7+
68
import { Logo } from './Logo';
79

810
interface Props {
@@ -28,6 +30,7 @@ export const BaseHeader: React.FC<Props> = ({ LeftItems, RightItems }) => {
2830
<Logo />
2931
</div>
3032
<div className="flex w-1/2 items-center justify-end pl-20">
33+
<User />
3134
{RightItems && RightItems}
3235
</div>
3336
</div>

apps/chat/src/components/Header/EditorHeader.tsx

Lines changed: 2 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,13 @@ import { useTranslation } from '@/src/hooks/useTranslation';
88
import { PartialBy } from '@/src/types/common';
99
import { Translation } from '@/src/types/translation';
1010

11-
import { useAppDispatch, useAppSelector } from '@/src/store/hooks';
11+
import { useAppSelector } from '@/src/store/hooks';
1212
import { SettingsSelectors } from '@/src/store/settings/settings.selectors';
13-
import { UIActions } from '@/src/store/ui/ui.reducers';
14-
import { UISelectors } from '@/src/store/ui/ui.selectors';
1513

1614
import { Stepper } from '@/src/components/Common/Stepper';
1715
import { Logo } from '@/src/components/Header/Logo';
1816
import { User } from '@/src/components/Header/User/User';
19-
import { SettingDialog } from '@/src/components/Settings/SettingDialog';
2017

21-
import { Feature } from '@epam/ai-dial-shared';
2218
import { ButtonVariant, DialButton } from '@epam/ai-dial-ui-kit';
2319

2420
interface EditorHeaderTab<T extends string> {
@@ -58,22 +54,10 @@ export const EditorHeader = <T extends string>({
5854
}: EditorHeaderProps<T>) => {
5955
const { t } = useTranslation(Translation.Chat);
6056

61-
const dispatch = useAppDispatch();
62-
6357
const isOverlay = useAppSelector(SettingsSelectors.selectIsOverlay);
64-
const isUserSettingsOpen = useAppSelector(
65-
UISelectors.selectIsUserSettingsOpen,
66-
);
67-
const isUserMenuHidden = useAppSelector((state) =>
68-
SettingsSelectors.isFeatureEnabled(state, Feature.HideUserMenu),
69-
);
7058

7159
const [menuOpen, setMenuOpen] = useState(false);
7260

73-
const handleCloseUserSettings = useCallback(() => {
74-
dispatch(UIActions.setIsUserSettingsOpen(false));
75-
}, [dispatch]);
76-
7761
const handleTabClose = useCallback(
7862
(tab: PartialBy<EditorHeaderTab<T>, 'label'>) => {
7963
onTabClick(tab);
@@ -170,18 +154,9 @@ export const EditorHeader = <T extends string>({
170154
variant={ButtonVariant.Tertiary}
171155
></DialButton>
172156

173-
{!isUserMenuHidden && (
174-
<div className="h-full overflow-hidden max-xl:hidden max-md:pr-2 md:border-l md:border-secondary md:pl-2">
175-
<User />
176-
</div>
177-
)}
157+
<User />
178158
</div>
179159
</div>
180-
181-
<SettingDialog
182-
open={isUserSettingsOpen}
183-
onClose={handleCloseUserSettings}
184-
/>
185160
</div>
186161
);
187162
};

apps/chat/src/components/Header/Header.tsx

Lines changed: 12 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,17 @@ import {
1616
} from '@/src/constants/default-ui-settings';
1717

1818
import { ToggleSidebarButton } from '@/src/components/Buttons/ToggleSidebarButton';
19-
import { SettingDialog } from '@/src/components/Settings/SettingDialog';
2019

2120
import { BaseHeader } from './BaseHeader';
2221
import { CreateNewConversation } from './CreateNewEntity';
23-
import { User } from './User/User';
2422

2523
import { Inversify } from '@epam/ai-dial-modulify-ui';
2624
import { Feature } from '@epam/ai-dial-shared';
2725

2826
export const Header = Inversify.register('Header', () => {
2927
const showChatbar = useAppSelector(UISelectors.selectShowChatbar);
3028
const showPromptbar = useAppSelector(UISelectors.selectShowPromptbar);
31-
const isUserSettingsOpen = useAppSelector(
32-
UISelectors.selectIsUserSettingsOpen,
33-
);
29+
3430
const isOverlay = useAppSelector(SettingsSelectors.selectIsOverlay);
3531

3632
const [windowWidth, setWindowWidth] = useState<number | undefined>(() => {
@@ -106,10 +102,6 @@ export const Header = Inversify.register('Header', () => {
106102
dispatch(UIActions.setShowPromptbar(!showPromptbar));
107103
}, [chatbarWidth, dispatch, promptbarWidth, showPromptbar, windowWidth]);
108104

109-
const onClose = () => {
110-
dispatch(UIActions.setIsUserSettingsOpen(false));
111-
};
112-
113105
const headerIconSize = isOverlay
114106
? OVERLAY_HEADER_ICON_SIZE
115107
: DEFAULT_HEADER_ICON_SIZE;
@@ -142,27 +134,17 @@ export const Header = Inversify.register('Header', () => {
142134
</>
143135
}
144136
RightItems={
145-
<>
146-
{!enabledFeatures.has(Feature.HideUserMenu) && (
147-
<div className="overflow-hidden">
148-
<User />
149-
</div>
150-
)}
151-
{enabledFeatures.has(Feature.PromptsSection) && (
152-
<ToggleSidebarButton
153-
iconSize={headerIconSize}
154-
tooltip="Prompt list"
155-
isOpened={showPromptbar}
156-
onToggle={handleTogglePromtbar}
157-
dataQa="right-panel-toggle"
158-
rightSide
159-
isOverlay={isOverlay}
160-
/>
161-
)}
162-
{!enabledFeatures.has(Feature.HideUserMenu) && (
163-
<SettingDialog open={isUserSettingsOpen} onClose={onClose} />
164-
)}
165-
</>
137+
enabledFeatures.has(Feature.PromptsSection) && (
138+
<ToggleSidebarButton
139+
iconSize={headerIconSize}
140+
tooltip="Prompt list"
141+
isOpened={showPromptbar}
142+
onToggle={handleTogglePromtbar}
143+
dataQa="right-panel-toggle"
144+
rightSide
145+
isOverlay={isOverlay}
146+
/>
147+
)
166148
}
167149
/>
168150
);
Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,36 @@
1+
import { FC } from 'react';
2+
3+
import classNames from 'classnames';
4+
5+
import { SettingsSelectors } from '@/src/store/settings/settings.selectors';
6+
7+
import { withRenderWhen } from '@/src/components/Common/RenderWhen';
8+
19
import { ProfileButton } from './ProfileButton';
210
import { UserDesktop } from './UserDesktop';
311

4-
export const User = () => {
12+
import { Feature } from '@epam/ai-dial-shared';
13+
14+
interface Props {
15+
className?: string;
16+
}
17+
18+
const UserView: FC<Props> = ({ className }) => {
519
return (
6-
<>
20+
<div
21+
className={classNames('w-[48px] overflow-hidden md:w-auto', className)}
22+
>
723
<div className="flex h-full items-center justify-center md:hidden">
824
<ProfileButton />
925
</div>
1026

1127
<div className="hidden size-full md:block">
1228
<UserDesktop />
1329
</div>
14-
</>
30+
</div>
1531
);
1632
};
33+
34+
export const User = withRenderWhen(
35+
(state) => !SettingsSelectors.isFeatureEnabled(state, Feature.HideUserMenu),
36+
)(UserView);

apps/chat/src/components/Marketplace/MarketplaceHeader.tsx

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -13,22 +13,12 @@ import {
1313

1414
import { ToggleSidebarButton } from '@/src/components/Buttons/ToggleSidebarButton';
1515
import { BaseHeader } from '@/src/components/Header/BaseHeader';
16-
import { User } from '@/src/components/Header/User/User';
17-
import { SettingDialog } from '@/src/components/Settings/SettingDialog';
18-
19-
import { Feature } from '@epam/ai-dial-shared';
2016

2117
export const MarketplaceHeader = () => {
2218
const showFilterbar = useAppSelector(
2319
UISelectors.selectShowMarketplaceFilterbar,
2420
);
25-
const isUserSettingsOpen = useAppSelector(
26-
UISelectors.selectIsUserSettingsOpen,
27-
);
2821
const isOverlay = useAppSelector(SettingsSelectors.selectIsOverlay);
29-
const isUserMenuHidden = useAppSelector((state) =>
30-
SettingsSelectors.isFeatureEnabled(state, Feature.HideUserMenu),
31-
);
3222

3323
const dispatch = useAppDispatch();
3424

@@ -39,10 +29,6 @@ export const MarketplaceHeader = () => {
3929
dispatch(UIActions.setShowMarketplaceFilterbar(!showFilterbar));
4030
}, [dispatch, showFilterbar]);
4131

42-
const onClose = useCallback(() => {
43-
dispatch(UIActions.setIsUserSettingsOpen(false));
44-
}, [dispatch]);
45-
4632
const headerIconSize = isOverlay
4733
? OVERLAY_HEADER_ICON_SIZE
4834
: DEFAULT_HEADER_ICON_SIZE;
@@ -59,17 +45,6 @@ export const MarketplaceHeader = () => {
5945
isOverlay={isOverlay}
6046
/>
6147
}
62-
RightItems={
63-
!isUserMenuHidden && (
64-
<>
65-
<div className="w-[48px] overflow-hidden md:w-auto">
66-
<User />
67-
</div>
68-
69-
<SettingDialog open={isUserSettingsOpen} onClose={onClose} />
70-
</>
71-
)
72-
}
7348
/>
7449
);
7550
};

apps/chat/src/components/Settings/SettingDialog.tsx

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import { OUTSIDE_PRESS_AND_MOUSE_EVENT } from '@/src/constants/modal';
2424

2525
import { withLabel } from '@/src/components/Common/Forms/Label';
2626
import { Modal } from '@/src/components/Common/Modal';
27+
import { withRenderWhen } from '@/src/components/Common/RenderWhen';
2728
import { ToggleSwitchLabeled } from '@/src/components/Common/ToggleSwitch/ToggleSwitchLabeled';
2829

2930
import { CustomLogoSelect } from './CustomLogoSelect';
@@ -36,15 +37,12 @@ import { ButtonVariant, DialButton } from '@epam/ai-dial-ui-kit';
3637

3738
const ToggleSwitchLabel = withLabel(ToggleSwitchLabeled);
3839

39-
interface Props {
40-
open: boolean;
41-
onClose: () => void;
42-
}
43-
4440
const getCustomLogoLocalStoreName = (customLogoId: string | undefined) =>
4541
customLogoId && splitEntityId(customLogoId).name;
4642

47-
export const SettingDialog: FC<Props> = ({ open, onClose }) => {
43+
const SettingDialogView: FC = () => {
44+
const dispatch = useAppDispatch();
45+
4846
const theme = useAppSelector(UISelectors.selectThemeState);
4947
const isChatFullWidth = useAppSelector(UISelectors.selectIsChatFullWidth);
5048
const files = useAppSelector(FilesSelectors.selectFiles);
@@ -65,6 +63,10 @@ export const SettingDialog: FC<Props> = ({ open, onClose }) => {
6563

6664
const screenState = useScreenState();
6765

66+
const handleCloseDialog = useCallback(() => {
67+
dispatch(UIActions.setIsUserSettingsOpen(false));
68+
}, [dispatch]);
69+
6870
useEffect(() => {
6971
setDefaultModelReference(savedDefaultModelReference);
7072
}, [savedDefaultModelReference]);
@@ -91,8 +93,6 @@ export const SettingDialog: FC<Props> = ({ open, onClose }) => {
9193

9294
const saveBtnRef = useRef<HTMLButtonElement>(null);
9395

94-
const dispatch = useAppDispatch();
95-
9696
const { t } = useTranslation(Translation.Settings);
9797

9898
const handleClose = useCallback(() => {
@@ -102,13 +102,13 @@ export const SettingDialog: FC<Props> = ({ open, onClose }) => {
102102
setDeleteLogo(false);
103103
setDefaultModelReference(savedDefaultModelReference);
104104
setEnterType(savedEnterType);
105-
onClose();
105+
handleCloseDialog();
106106
}, [
107107
theme,
108108
isChatFullWidth,
109109
savedDefaultModelReference,
110110
savedEnterType,
111-
onClose,
111+
handleCloseDialog,
112112
]);
113113

114114
useEffect(() => {
@@ -158,7 +158,7 @@ export const SettingDialog: FC<Props> = ({ open, onClose }) => {
158158
dispatch(ModelsActions.setDefaultModelReference(defaultModelReference));
159159

160160
setLocalLogoFile(undefined);
161-
onClose();
161+
handleCloseDialog();
162162
}, [
163163
dispatch,
164164
localTheme,
@@ -167,7 +167,7 @@ export const SettingDialog: FC<Props> = ({ open, onClose }) => {
167167
localLogoFile,
168168
deleteLogo,
169169
defaultModelReference,
170-
onClose,
170+
handleCloseDialog,
171171
]);
172172

173173
if (!open) {
@@ -179,7 +179,7 @@ export const SettingDialog: FC<Props> = ({ open, onClose }) => {
179179
portalId="theme-main"
180180
containerClassName="inline-block w-[400px] overflow-y-auto px-3 py-4 align-bottom transition-all md:max-h-[509px] md:p-6"
181181
dataQa="settings-modal"
182-
state={open ? ModalState.OPENED : ModalState.CLOSED}
182+
state={ModalState.OPENED}
183183
onClose={handleClose}
184184
initialFocus={saveBtnRef}
185185
dismissProps={OUTSIDE_PRESS_AND_MOUSE_EVENT}
@@ -244,3 +244,13 @@ export const SettingDialog: FC<Props> = ({ open, onClose }) => {
244244
</Modal>
245245
);
246246
};
247+
248+
export const SettingDialog = withRenderWhen((state) => {
249+
const isOpen = UISelectors.selectIsUserSettingsOpen(state);
250+
const isUserMenuHidden = SettingsSelectors.isFeatureEnabled(
251+
state,
252+
Feature.HideUserMenu,
253+
);
254+
255+
return isOpen && !isUserMenuHidden;
256+
})(SettingDialogView);

0 commit comments

Comments
 (0)