Skip to content

Commit fefd044

Browse files
committed
feat: ai placeholders
1 parent 12a3bcf commit fefd044

File tree

11 files changed

+68
-11
lines changed

11 files changed

+68
-11
lines changed

package-lock.json

Lines changed: 5 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/components/ComponentsProvider/componentsRegistry.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,15 @@ import {StaffCard} from '../User/StaffCard';
66
import type {ComponentsRegistryTemplate} from './registry';
77
import {Registry} from './registry';
88

9+
const AnyPlaceholder = () => null;
10+
911
const componentsRegistryInner = new Registry()
1012
.register('StaffCard', StaffCard)
1113
.register('AsideNavigation', AsideNavigation)
1214
.register('ErrorBoundary', ErrorBoundaryInner)
13-
.register('ShardsTable', ShardsTable);
15+
.register('ShardsTable', ShardsTable)
16+
.register('AIAssistantButton', AnyPlaceholder)
17+
.register('ChatPanel', AnyPlaceholder);
1418

1519
export type ComponentsRegistry = ComponentsRegistryTemplate<typeof componentsRegistryInner>;
1620

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export {ComponentsProvider} from './ComponentsProvider';
2+
export {componentsRegistry} from './componentsRegistry';
3+
export type {ComponentsRegistry} from './componentsRegistry';

src/containers/App/App.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import type {History} from 'history';
55
import {Helmet} from 'react-helmet-async';
66
import {connect} from 'react-redux';
77

8+
import {componentsRegistry} from '../../components/ComponentsProvider/componentsRegistry';
89
import {ErrorBoundary} from '../../components/ErrorBoundary/ErrorBoundary';
910
import type {RootState} from '../../store';
1011
import {Navigation} from '../AsideNavigation/Navigation';
@@ -32,6 +33,9 @@ function App({
3233
children,
3334
userSettings = getUserSettings({singleClusterMode}),
3435
}: AppProps) {
36+
// Get ChatPanel from registry if it exists
37+
const ChatPanel = componentsRegistry.get('ChatPanel');
38+
3539
return (
3640
<Providers store={store} history={history}>
3741
<Helmet defaultTitle="YDB Monitoring" titleTemplate="%s — YDB Monitoring" />
@@ -43,6 +47,8 @@ function App({
4347
</ErrorBoundary>
4448
</Navigation>
4549
</ContentWrapper>
50+
{/* Render ChatPanel only if it's registered */}
51+
{ChatPanel && <ChatPanel />}
4652
<ReduxTooltip />
4753
</Providers>
4854
);

src/containers/Header/Header.tsx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {ArrowUpRightFromSquare, CirclePlus, PlugConnection} from '@gravity-ui/ic
44
import {Breadcrumbs, Button, Divider, Flex, Icon} from '@gravity-ui/uikit';
55
import {useLocation} from 'react-router-dom';
66

7+
import {componentsRegistry} from '../../components/ComponentsProvider/componentsRegistry';
78
import {getConnectToDBDialog} from '../../components/ConnectToDB/ConnectToDBDialog';
89
import {InternalLink} from '../../components/InternalLink';
910
import {useAddClusterFeatureAvailable} from '../../store/reducers/capabilities/hooks';
@@ -38,6 +39,9 @@ function Header() {
3839
const isAddClusterAvailable =
3940
useAddClusterFeatureAvailable() && uiFactory.onAddCluster !== undefined;
4041

42+
// Get AIAssistantButton from registry if it exists
43+
const AIAssistantButton = componentsRegistry.get('AIAssistantButton');
44+
4145
const breadcrumbItems = React.useMemo(() => {
4246
let options = {...pageBreadcrumbsOptions, singleClusterMode};
4347

@@ -76,6 +80,11 @@ function Header() {
7680
);
7781
}
7882

83+
// Add AI Assistant button if component is registered
84+
if (AIAssistantButton) {
85+
elements.push(<AIAssistantButton key="ai-assistant" />);
86+
}
87+
7988
if (!isClustersPage && isUserAllowedToMakeChanges) {
8089
elements.push(
8190
<Button view="flat" href={createDeveloperUIInternalPageHref()} target="_blank">

src/containers/Heatmap/Heatmap.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,9 @@ export const Heatmap = ({path, database}: HeatmapProps) => {
8888
const {min, max} = getCurrentMetricLimits(currentMetric, tablets);
8989

9090
const preparedTablets = tablets.map((tablet) => {
91-
const value = currentMetric && Number(tablet.metrics?.[currentMetric]);
91+
const value =
92+
currentMetric &&
93+
Number(tablet.metrics?.[currentMetric as keyof typeof tablet.metrics]);
9294
const colorIndex = getColorIndex(value, min, max);
9395
const color = COLORS_RANGE[colorIndex];
9496

src/containers/UserSettings/i18n/en.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@
1717
"settings.editor.codeAssistant.title": "Code Assistant",
1818
"settings.editor.codeAssistant.description": "Use Code Assistant for autocomplete.",
1919

20+
"settings.editor.aiAssistant.title": "AI Assistant",
21+
"settings.editor.aiAssistant.description": "Show AI Assistant.",
22+
2023
"settings.editor.queryStreaming.title": "Query Streaming",
2124
"settings.editor.queryStreaming.description": "Use streaming api for query results.",
2225

src/lib.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ export {
77
export {AsideNavigation} from './containers/AsideNavigation/AsideNavigation';
88

99
export {configureStore, rootReducer} from './store';
10+
export type {ConfigureStoreOptions} from './store';
1011
export {default as appRoutes} from './routes';
1112

1213
export {YdbEmbeddedAPI} from './services/api';

src/setupProxy.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ const {createProxyMiddleware} = require('http-proxy-middleware');
33

44
module.exports = function (app) {
55
const metaYdbBackend = process.env.META_YDB_BACKEND;
6+
7+
// Proxy for existing YDB meta backend
68
if (metaYdbBackend && metaYdbBackend !== 'undefined') {
79
app.use(
810
'/meta',

src/store/configureStore.ts

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {configureStore as configureReduxStore} from '@reduxjs/toolkit';
1+
import {combineReducers, configureStore as configureReduxStore} from '@reduxjs/toolkit';
22
import type {Action, Dispatch, Middleware, Reducer, UnknownAction} from '@reduxjs/toolkit';
33
import type {History} from 'history';
44
import {createBrowserHistory} from 'history';
@@ -7,7 +7,7 @@ import {listenForHistoryChange} from 'redux-location-state';
77
import {YdbEmbeddedAPI} from '../services/api';
88

99
import {getUrlData} from './getUrlData';
10-
import rootReducer from './reducers';
10+
import combinedRootReducer, {rootReducer} from './reducers';
1111
import {api as storeApi} from './reducers/api';
1212
import {syncUserSettingsFromLS} from './reducers/settings/settings';
1313
import {UPDATE_REF} from './reducers/tooltip';
@@ -54,18 +54,43 @@ export const codeAssistBackend = window.code_assist_backend;
5454

5555
const isSingleClusterMode = `${metaBackend}` === 'undefined';
5656

57+
export interface ConfigureStoreOptions {
58+
aRootReducer?: Reducer;
59+
singleClusterMode?: boolean;
60+
api?: YdbEmbeddedAPI;
61+
additionalReducers?: Record<string, Reducer>;
62+
}
63+
5764
export function configureStore({
58-
aRootReducer = rootReducer,
65+
aRootReducer,
5966
singleClusterMode = isSingleClusterMode,
6067
api = new YdbEmbeddedAPI({webVersion, withCredentials: !customBackend}),
61-
} = {}) {
68+
additionalReducers = {},
69+
}: ConfigureStoreOptions = {}) {
6270
({backend, basename, clusterName} = getUrlData({
6371
singleClusterMode,
6472
customBackend,
6573
}));
6674
const history = createBrowserHistory({basename});
6775

68-
const store = _configureStore(aRootReducer, history, {singleClusterMode}, [
76+
// Create the final reducer
77+
let finalReducer: Reducer;
78+
79+
if (aRootReducer) {
80+
// If custom root reducer is provided, use it
81+
finalReducer = aRootReducer;
82+
} else if (Object.keys(additionalReducers).length > 0) {
83+
// If additional reducers are provided, combine them with the default ones
84+
finalReducer = combineReducers({
85+
...rootReducer,
86+
...additionalReducers,
87+
});
88+
} else {
89+
// Otherwise use the default combined reducer
90+
finalReducer = combinedRootReducer;
91+
}
92+
93+
const store = _configureStore(finalReducer, history, {singleClusterMode}, [
6994
storeApi.middleware,
7095
]);
7196
listenForHistoryChange(store, history);

0 commit comments

Comments
 (0)