diff --git a/lib/utils/url-utils.js b/lib/utils/url-utils.js --- a/lib/utils/url-utils.js +++ b/lib/utils/url-utils.js @@ -16,7 +16,7 @@ +calendar?: boolean, +chat?: boolean, +thread?: string, - +settings?: 'account' | 'danger-zone', + +settings?: 'account' | 'keyservers' | 'danger-zone', +threadCreation?: boolean, +selectedUserList?: $ReadOnlyArray, +inviteSecret?: string, @@ -31,7 +31,7 @@ calendar: t.maybe(t.Boolean), chat: t.maybe(t.Boolean), thread: t.maybe(tID), - settings: t.maybe(t.enums.of(['account', 'danger-zone'])), + settings: t.maybe(t.enums.of(['account', 'keyservers', 'danger-zone'])), threadCreation: t.maybe(t.Boolean), selectedUserList: t.maybe(t.list(t.String)), inviteSecret: t.maybe(t.String), @@ -47,6 +47,7 @@ const calendarRegex = new RegExp('(/|^)calendar(/|$)', 'i'); const chatRegex = new RegExp('(/|^)chat(/|$)', 'i'); const accountSettingsRegex = new RegExp('(/|^)settings/account(/|$)', 'i'); +const keyserversRegex = new RegExp('(/|^)settings/keyservers(/|$)', 'i'); const dangerZoneRegex = new RegExp('(/|^)settings/danger-zone(/|$)', 'i'); const threadPendingRegex = new RegExp( `(/|^)thread/(${pendingThreadIDRegex})(/|$)`, @@ -70,6 +71,7 @@ const calendarTest = calendarRegex.test(url); const chatTest = chatRegex.test(url); const accountSettingsTest = accountSettingsRegex.test(url); + const keyserversSettingsTest = keyserversRegex.test(url); const dangerZoneTest = dangerZoneRegex.test(url); const threadPendingMatches = threadPendingRegex.exec(url); const threadCreateMatches = threadCreationRegex.exec(url); @@ -109,6 +111,8 @@ returnObj.chat = true; } else if (accountSettingsTest) { returnObj.settings = 'account'; + } else if (keyserversSettingsTest) { + returnObj.settings = 'keyservers'; } else if (dangerZoneTest) { returnObj.settings = 'danger-zone'; } else if (qrCodeLoginMatches) { diff --git a/web/app.react.js b/web/app.react.js --- a/web/app.react.js +++ b/web/app.react.js @@ -291,6 +291,8 @@ if (tab === 'settings') { if (settingsSection === 'account') { mainContent = ; + } else if (settingsSection === 'keyservers') { + mainContent = null; } else if (settingsSection === 'danger-zone') { mainContent = ; } diff --git a/web/navigation-panels/settings-switcher.react.js b/web/navigation-panels/settings-switcher.react.js --- a/web/navigation-panels/settings-switcher.react.js +++ b/web/navigation-panels/settings-switcher.react.js @@ -7,6 +7,7 @@ import css from './settings-switcher.css'; import { updateNavInfoActionType } from '../redux/action-types.js'; import { navSettingsSectionSelector } from '../selectors/nav-selectors.js'; +import { useStaffCanSee } from '../utils/staff-utils.js'; function SettingsSwitcher(): React.Node { const dispatch = useDispatch(); @@ -30,6 +31,30 @@ [onClickAccountSettings], ); + const staffCanSee = useStaffCanSee(); + + const onClickKeyservers = React.useCallback( + (event: SyntheticEvent) => { + event.preventDefault(); + dispatch({ + type: updateNavInfoActionType, + payload: { tab: 'settings', settingsSection: 'keyservers' }, + }); + }, + [dispatch], + ); + + const keyserversNavigationItem = React.useMemo(() => { + if (!staffCanSee) { + return null; + } + return ( + +

Keyservers

+
+ ); + }, [onClickKeyservers, staffCanSee]); + const onClickDangerZone = React.useCallback( (event: SyntheticEvent) => { event.preventDefault(); @@ -54,6 +79,9 @@ {accountSettingsNavigationItem} + + {keyserversNavigationItem} + {dangerZoneNavigationItem} diff --git a/web/types/nav-types.js b/web/types/nav-types.js --- a/web/types/nav-types.js +++ b/web/types/nav-types.js @@ -18,9 +18,13 @@ export type LoginMethod = 'form' | 'qr-code'; const loginMethodValidator = t.enums.of(['form', 'qr-code']); -export type NavigationSettingsSection = 'account' | 'danger-zone'; +export type NavigationSettingsSection = + | 'account' + | 'keyservers' + | 'danger-zone'; const navigationSettingsSectionValidator = t.enums.of([ 'account', + 'keyservers', 'danger-zone', ]);