Skip to content

Commit 9536049

Browse files
committed
add instance type indicator to the badge and document title
1 parent 3ae03f3 commit 9536049

4 files changed

Lines changed: 42 additions & 32 deletions

File tree

packages/browser-tests/cypress/integration/console/topbar.spec.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ describe("TopBar", () => {
5555
cy.getByDataHook("topbar-instance-save-button").should("not.exist");
5656
cy.getByDataHook("topbar-instance-name").should(
5757
"have.text",
58-
"test-instance"
58+
"Production | test-instance"
5959
);
6060
cy.getByDataHook("topbar-instance-icon").realHover();
6161
cy.contains("test description of the test instance").should("be.visible");

packages/web-console/src/components/TopBar/toolbar.tsx

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -302,14 +302,13 @@ const CustomIconWithTooltip = ({
302302

303303
export const Toolbar = () => {
304304
const { quest } = useContext(QuestContext)
305-
const { settings } = useSettings()
305+
const { settings, preferences, refreshSettingsAndPreferences } = useSettings()
306306
const { logout } = useAuth()
307307
const result = useSelector(selectors.query.getResult)
308308
const [currentUser, setCurrentUser] = useState<string | null>(null)
309309
const [settingsPopperActive, setSettingsPopperActive] = useState(false)
310-
const [preferencesValues, setPreferencesValues] = useState<Preferences | null>(null)
311310
const [previewValues, setPreviewValues] = useState<Preferences | null>(null)
312-
const shownValues = settingsPopperActive ? previewValues : preferencesValues
311+
const shownValues = settingsPopperActive ? previewValues : preferences
313312
const badgeColors = useBadgeColors(shownValues?.instance_rgb ?? null)
314313
const theme = useTheme()
315314

@@ -336,20 +335,15 @@ export const Toolbar = () => {
336335
}
337336
}
338337

339-
const fetchPreferences = async () => {
340-
const preferences = await quest.getPreferences()
341-
setPreferencesValues(preferences)
342-
}
343-
344338
useEffect(() => {
345339
fetchServerDetails()
346-
fetchPreferences()
340+
refreshSettingsAndPreferences()
347341
}, [])
348342

349343
useEffect(() => {
350344
if (result && result.type === QuestDB.Type.DDL) {
351345
fetchServerDetails()
352-
fetchPreferences()
346+
refreshSettingsAndPreferences()
353347
}
354348
}, [result])
355349

@@ -359,13 +353,13 @@ export const Toolbar = () => {
359353
} catch (e) {
360354
// Handle error
361355
}
362-
await fetchPreferences()
356+
await refreshSettingsAndPreferences()
363357
}
364358

365359
const handleToggle = useCallback((active: boolean) => {
366360
setSettingsPopperActive(active)
367-
setPreviewValues(active ? preferencesValues : null)
368-
}, [preferencesValues])
361+
setPreviewValues(active ? preferences : null)
362+
}, [preferences])
369363

370364
return (
371365
<Root>
@@ -379,7 +373,7 @@ export const Toolbar = () => {
379373
/>
380374
)}
381375
</Box>
382-
{preferencesValues && (
376+
{preferences && (
383377
<Badge
384378
$badgeColors={badgeColors}
385379
data-hook="topbar-instance-badge"
@@ -396,14 +390,19 @@ export const Toolbar = () => {
396390
)}
397391
</Box>
398392
{shownValues?.instance_name
399-
? <Text data-hook="topbar-instance-name" className="instance-name">{shownValues?.instance_name}</Text>
393+
? <Text data-hook="topbar-instance-name" className="instance-name">
394+
{shownValues?.instance_type
395+
? `${shownValues?.instance_type.charAt(0).toUpperCase()}${shownValues?.instance_type.slice(1)} | `
396+
: ''}
397+
{shownValues?.instance_name}
398+
</Text>
400399
: <Text data-hook="topbar-instance-name" className="instance-name placeholder">Instance name is not set</Text>
401400
}
402401

403402
<InstanceSettingsPopper
404403
active={settingsPopperActive}
405404
onToggle={handleToggle}
406-
values={previewValues ?? preferencesValues}
405+
values={previewValues ?? preferences}
407406
onSave={handleSaveSettings}
408407
onValuesChange={setPreviewValues}
409408
trigger={<Edit data-hook="topbar-instance-edit-icon" size="18px" className={`edit-icon ${shownValues?.instance_name ? '' : 'placeholder'}`} />}

packages/web-console/src/providers/SettingsProvider/index.tsx

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { Box, Button, Text } from "@questdb/react-components"
1111
import { Refresh } from "@styled-icons/remix-line"
1212
import {setValue} from "../../utils/localStorage";
1313
import {StoreKey} from "../../utils/localStorage/types";
14+
import { Preferences } from '../../utils/questdb'
1415

1516
enum View {
1617
loading = 0,
@@ -26,9 +27,11 @@ const reducer = (s: State, n: Partial<State>) => ({ ...s, ...n })
2627

2728
const SettingContext = createContext<{
2829
settings: Settings
30+
preferences: Preferences
2931
consoleConfig: ConsoleConfig
3032
warnings: Warning[]
31-
}>({ settings: {}, consoleConfig: {}, warnings: [] })
33+
refreshSettingsAndPreferences: () => Promise<void>
34+
}>({ settings: {}, preferences: {}, consoleConfig: {}, warnings: [], refreshSettingsAndPreferences: () => Promise.resolve() })
3235

3336
const connectionError = (
3437
<>
@@ -47,13 +50,14 @@ export const SettingsProvider = ({
4750
}) => {
4851
const [state, dispatch] = useReducer(reducer, initialState)
4952
const [settings, setSettings] = useState<Settings>({})
53+
const [preferences, _setPreferences] = useState<Preferences>({})
5054
const [warnings, setWarnings] = useState<Warning[]>([])
5155
const [consoleConfig, setConsoleConfig] = useState<ConsoleConfig>({})
5256

5357
const views: { [key in View]: () => React.ReactNode } = {
5458
[View.loading]: () => null,
5559
[View.ready]: () => (
56-
<SettingContext.Provider value={{ settings, consoleConfig, warnings }}>
60+
<SettingContext.Provider value={{ settings, consoleConfig, warnings, preferences, refreshSettingsAndPreferences }}>
5761
{children}
5862
</SettingContext.Provider>
5963
),
@@ -101,6 +105,25 @@ export const SettingsProvider = ({
101105
}
102106
}
103107

108+
const setPreferences = (preferences: Preferences) => {
109+
if (preferences?.instance_name) {
110+
const suffix = preferences?.instance_type ? `${preferences.instance_type.charAt(0).toUpperCase()}${preferences.instance_type.slice(1)}` : 'QuestDB'
111+
const newTitle = `${preferences.instance_name} | ${suffix}`
112+
if (document.title !== newTitle) {
113+
document.title = newTitle
114+
}
115+
}
116+
_setPreferences(preferences)
117+
}
118+
119+
const refreshSettingsAndPreferences = async () => {
120+
const result = await fetchEndpoint("settings", connectionError)
121+
if (result) {
122+
setSettings(result.config)
123+
setPreferences({ version: result["preferences.version"], ...result.preferences })
124+
}
125+
}
126+
104127
useEffect(() => {
105128
const fetchAll = async () => {
106129
const settings = await fetchEndpoint("settings", connectionError)
@@ -111,6 +134,7 @@ export const SettingsProvider = ({
111134
)
112135
if (settings) {
113136
setSettings(settings.config)
137+
setPreferences({ version: settings["preferences.version"], ...settings.preferences })
114138
setValue(StoreKey.RELEASE_TYPE, settings["release.type"])
115139
}
116140
if (warnings) {

packages/web-console/src/utils/questdb/client.ts

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -419,19 +419,6 @@ export class Client {
419419
})
420420
}
421421

422-
async getPreferences(): Promise<Preferences> {
423-
try {
424-
const response: Response = await fetch(
425-
`settings`,
426-
{ headers: this.commonHeaders },
427-
)
428-
const settings = await response.json()
429-
return { version: settings["preferences.version"], ...settings.preferences }
430-
} catch (error) {
431-
throw error
432-
}
433-
}
434-
435422
async savePreferences(preferences: Preferences): Promise<void> {
436423
const { version, ...prefs } = preferences;
437424
const response: Response = await fetch(

0 commit comments

Comments
 (0)