Skip to content

Commit 7ba6c67

Browse files
feat(ui): named install models tabs
1 parent 3de1860 commit 7ba6c67

File tree

8 files changed

+40
-27
lines changed

8 files changed

+40
-27
lines changed

invokeai/frontend/web/src/features/gallery/components/ImageViewer/NoContentForViewer.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
44
import { IAINoContentFallback } from 'common/components/IAIImageFallback';
55
import { InvokeLogoIcon } from 'common/components/InvokeLogoIcon';
66
import { LOADING_SYMBOL, useHasImages } from 'features/gallery/hooks/useHasImages';
7-
import { $installModelsTab } from 'features/modelManagerV2/store/installModelsStore';
7+
import { setInstallModelsTabByName } from 'features/modelManagerV2/store/installModelsStore';
88
import { useFeatureStatus } from 'features/system/hooks/useFeatureStatus';
99
import { selectIsLocal } from 'features/system/store/configSlice';
1010
import { selectActiveTab } from 'features/ui/store/uiSelectors';
@@ -133,12 +133,12 @@ const StarterBundlesCallout = () => {
133133

134134
const handleClickDownloadStarterModels = useCallback(() => {
135135
dispatch(setActiveTab('models'));
136-
$installModelsTab.set(3);
136+
setInstallModelsTabByName('starterModels');
137137
}, [dispatch]);
138138

139139
const handleClickImportModels = useCallback(() => {
140140
dispatch(setActiveTab('models'));
141-
$installModelsTab.set(0);
141+
setInstallModelsTabByName('urlOrLocal');
142142
}, [dispatch]);
143143

144144
return (

invokeai/frontend/web/src/features/modelManagerV2/hooks/useStarterModelsToast.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Button, Text, useToast } from '@invoke-ai/ui-library';
22
import { useAppDispatch } from 'app/store/storeHooks';
3-
import { $installModelsTab } from 'features/modelManagerV2/store/installModelsStore';
3+
import { setInstallModelsTabByName } from 'features/modelManagerV2/store/installModelsStore';
44
import { useFeatureStatus } from 'features/system/hooks/useFeatureStatus';
55
import { setActiveTab } from 'features/ui/store/uiSlice';
66
import { useCallback, useEffect, useState } from 'react';
@@ -45,7 +45,7 @@ const ToastDescription = () => {
4545

4646
const onClick = useCallback(() => {
4747
dispatch(setActiveTab('models'));
48-
$installModelsTab.set(3);
48+
setInstallModelsTabByName('launchpad');
4949
toast.close(TOAST_ID);
5050
}, [dispatch, toast]);
5151

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,16 @@
11
import { atom } from 'nanostores';
22

3-
/**
4-
* Atom to manage the active tab index for the Install Models panel.
5-
* Moved to separate file to avoid circular dependencies.
6-
*/
7-
export const $installModelsTab = atom(0);
3+
type InstallModelsTabName = 'launchpad' | 'urlOrLocal' | 'huggingface' | 'scanFolder' | 'starterModels';
4+
5+
const TAB_TO_INDEX_MAP: Record<InstallModelsTabName, number> = {
6+
launchpad: 0,
7+
urlOrLocal: 1,
8+
huggingface: 2,
9+
scanFolder: 3,
10+
starterModels: 4,
11+
};
12+
13+
export const setInstallModelsTabByName = (tab: InstallModelsTabName) => {
14+
$installModelsTabIndex.set(TAB_TO_INDEX_MAP[tab]);
15+
};
16+
export const $installModelsTabIndex = atom(0);

invokeai/frontend/web/src/features/modelManagerV2/subpanels/AddModelPanel/LaunchpadForm/LaunchpadForm.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Box, Button, Flex, Grid, Heading, Text } from '@invoke-ai/ui-library';
22
import ScrollableContent from 'common/components/OverlayScrollbars/ScrollableContent';
33
import { useStarterBundleInstall } from 'features/modelManagerV2/hooks/useStarterBundleInstall';
4-
import { $installModelsTab } from 'features/modelManagerV2/store/installModelsStore';
4+
import { setInstallModelsTabByName } from 'features/modelManagerV2/store/installModelsStore';
55
import { memo, useCallback } from 'react';
66
import { useTranslation } from 'react-i18next';
77
import { PiFolderOpenBold, PiLinkBold, PiStarBold } from 'react-icons/pi';
@@ -31,19 +31,19 @@ export const LaunchpadForm = memo(() => {
3131
);
3232

3333
const navigateToUrlTab = useCallback(() => {
34-
$installModelsTab.set(1); // URL/Local Path tab (now index 1)
34+
setInstallModelsTabByName('urlOrLocal');
3535
}, []);
3636

3737
const navigateToHuggingFaceTab = useCallback(() => {
38-
$installModelsTab.set(2); // HuggingFace tab (now index 2)
38+
setInstallModelsTabByName('huggingface');
3939
}, []);
4040

4141
const navigateToScanFolderTab = useCallback(() => {
42-
$installModelsTab.set(3); // Scan Folder tab (now index 3)
42+
setInstallModelsTabByName('scanFolder');
4343
}, []);
4444

4545
const navigateToStarterModelsTab = useCallback(() => {
46-
$installModelsTab.set(4); // Starter Models tab (now index 4)
46+
setInstallModelsTabByName('starterModels');
4747
}, []);
4848

4949
const handleSD15BundleClick = useCallback(() => {

invokeai/frontend/web/src/features/modelManagerV2/subpanels/InstallModels.tsx

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Box, Button, Flex, Heading, Tab, TabList, TabPanel, TabPanels, Tabs, Text } from '@invoke-ai/ui-library';
22
import { useStore } from '@nanostores/react';
3-
import { $installModelsTab } from 'features/modelManagerV2/store/installModelsStore';
3+
import { $installModelsTabIndex } from 'features/modelManagerV2/store/installModelsStore';
44
import { StarterModelsForm } from 'features/modelManagerV2/subpanels/AddModelPanel/StarterModels/StarterModelsForm';
55
import { memo, useCallback } from 'react';
66
import { useTranslation } from 'react-i18next';
@@ -14,10 +14,7 @@ import { ScanModelsForm } from './AddModelPanel/ScanFolder/ScanFolderForm';
1414

1515
export const InstallModels = memo(() => {
1616
const { t } = useTranslation();
17-
const index = useStore($installModelsTab);
18-
const onChange = useCallback((index: number) => {
19-
$installModelsTab.set(index);
20-
}, []);
17+
const tabIndex = useStore($installModelsTabIndex);
2118

2219
const onClickLearnMore = useCallback(() => {
2320
window.open('https://support.invoke.ai/support/solutions/articles/151000170961-supported-models');
@@ -31,7 +28,14 @@ export const InstallModels = memo(() => {
3128
<Text variant="subtext">{t('modelManager.learnMoreAboutSupportedModels')}</Text>
3229
</Button>
3330
</Flex>
34-
<Tabs variant="collapse" height="50%" display="flex" flexDir="column" index={index} onChange={onChange}>
31+
<Tabs
32+
variant="collapse"
33+
height="50%"
34+
display="flex"
35+
flexDir="column"
36+
index={tabIndex}
37+
onChange={$installModelsTabIndex.set}
38+
>
3539
<TabList>
3640
<Tab>{t('modelManager.launchpadTab')}</Tab>
3741
<Tab>{t('modelManager.urlOrLocalPath')}</Tab>

invokeai/frontend/web/src/features/parameters/components/ModelPicker.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import type { Group, PickerContextState } from 'common/components/Picker/Picker'
1818
import { buildGroup, getRegex, Picker, usePickerContext } from 'common/components/Picker/Picker';
1919
import { useDisclosure } from 'common/hooks/useBoolean';
2020
import { typedMemo } from 'common/util/typedMemo';
21-
import { $installModelsTab } from 'features/modelManagerV2/store/installModelsStore';
21+
import { setInstallModelsTabByName } from 'features/modelManagerV2/store/installModelsStore';
2222
import { BASE_COLOR_MAP } from 'features/modelManagerV2/subpanels/ModelManagerPanel/ModelBaseBadge';
2323
import ModelImage from 'features/modelManagerV2/subpanels/ModelManagerPanel/ModelImage';
2424
import { NavigateToModelManagerButton } from 'features/parameters/components/MainModel/NavigateToModelManagerButton';
@@ -38,7 +38,7 @@ const ModelManagerLink = memo((props: ButtonProps) => {
3838
const dispatch = useAppDispatch();
3939
const onClick = useCallback(() => {
4040
dispatch(setActiveTab('models'));
41-
$installModelsTab.set(3);
41+
setInstallModelsTabByName('launchpad');
4242
}, [dispatch]);
4343

4444
return (

invokeai/frontend/web/src/features/parameters/components/PostProcessing/PostProcessingPopover.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
} from '@invoke-ai/ui-library';
1212
import { adHocPostProcessingRequested } from 'app/store/middleware/listenerMiddleware/listeners/addAdHocPostProcessingRequestedListener';
1313
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
14-
import { $installModelsTab } from 'features/modelManagerV2/store/installModelsStore';
14+
import { setInstallModelsTabByName } from 'features/modelManagerV2/store/installModelsStore';
1515
import ParamPostProcessingModel from 'features/parameters/components/PostProcessing/ParamPostProcessingModel';
1616
import { selectPostProcessingModel } from 'features/parameters/store/upscaleSlice';
1717
import { useIsQueueMutationInProgress } from 'features/queue/hooks/useIsQueueMutationInProgress';
@@ -78,7 +78,7 @@ const MissingModelWarning = () => {
7878

7979
const handleGoToModelManager = useCallback(() => {
8080
dispatch(setActiveTab('models'));
81-
$installModelsTab.set(3);
81+
setInstallModelsTabByName('launchpad');
8282
}, [dispatch]);
8383

8484
return (

invokeai/frontend/web/src/features/settingsAccordions/components/UpscaleSettingsAccordion/UpscaleWarning.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Button, Flex, ListItem, Text, UnorderedList } from '@invoke-ai/ui-library';
22
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
33
import { selectModel } from 'features/controlLayers/store/paramsSlice';
4-
import { $installModelsTab } from 'features/modelManagerV2/store/installModelsStore';
4+
import { setInstallModelsTabByName } from 'features/modelManagerV2/store/installModelsStore';
55
import { useIsTooLargeToUpscale } from 'features/parameters/hooks/useIsTooLargeToUpscale';
66
import {
77
selectTileControlNetModel,
@@ -69,7 +69,7 @@ export const UpscaleWarning = () => {
6969

7070
const handleGoToModelManager = useCallback(() => {
7171
dispatch(setActiveTab('models'));
72-
$installModelsTab.set(3);
72+
setInstallModelsTabByName('launchpad');
7373
}, [dispatch]);
7474

7575
if (isBaseModelCompatible && modelWarnings.length > 0 && isModelsTabDisabled) {

0 commit comments

Comments
 (0)