diff --git a/grafana-plugin/src/containers/ApiTokenSettings/ApiTokenForm.tsx b/grafana-plugin/src/containers/ApiTokenSettings/ApiTokenForm.tsx index c0f8246d..e6b645be 100644 --- a/grafana-plugin/src/containers/ApiTokenSettings/ApiTokenForm.tsx +++ b/grafana-plugin/src/containers/ApiTokenSettings/ApiTokenForm.tsx @@ -120,7 +120,7 @@ export const ApiTokenForm = observer((props: TokenCreationModalProps) => { - {getCurlExample(token, store.onCallApiUrl)} + {getCurlExample(token, store.pluginStore.apiUrlFromStatus)} ); diff --git a/grafana-plugin/src/models/plugin/plugin.ts b/grafana-plugin/src/models/plugin/plugin.ts index b88c8b99..c8ffe32d 100644 --- a/grafana-plugin/src/models/plugin/plugin.ts +++ b/grafana-plugin/src/models/plugin/plugin.ts @@ -5,7 +5,7 @@ import { OnCallPluginMetaJSONData } from 'types'; import { ActionKey } from 'models/loader/action-keys'; import { GrafanaApiClient } from 'network/grafana-api/http-client'; import { makeRequest } from 'network/network'; -import { PluginConnection, PostStatusResponse } from 'network/oncall-api/api.types'; +import { PluginConnection, StatusResponse } from 'network/oncall-api/api.types'; import { RootBaseStore } from 'state/rootBaseStore/RootBaseStore'; import { waitInMs } from 'utils/async'; import { AutoLoadingState } from 'utils/decorators'; @@ -31,6 +31,7 @@ On Cloud: export class PluginStore { rootStore: RootBaseStore; connectionStatus?: PluginConnection; + apiUrlFromStatus?: string; isPluginConnected = false; appliedOnCallApiUrl = ''; @@ -53,9 +54,10 @@ export class PluginStore { @AutoLoadingState(ActionKey.PLUGIN_VERIFY_CONNECTION) async verifyPluginConnection() { - const { pluginConnection } = await makeRequest(`/plugin/status`, {}); + const { pluginConnection, api_url } = await makeRequest(`/plugin/status`, {}); runInAction(() => { this.connectionStatus = pluginConnection; + this.apiUrlFromStatus = api_url; this.isPluginConnected = Object.keys(pluginConnection).every( (key) => pluginConnection[key as keyof PluginConnection]?.ok ); diff --git a/grafana-plugin/src/network/oncall-api/api.types.d.ts b/grafana-plugin/src/network/oncall-api/api.types.d.ts index 701866a1..d1b93642 100644 --- a/grafana-plugin/src/network/oncall-api/api.types.d.ts +++ b/grafana-plugin/src/network/oncall-api/api.types.d.ts @@ -16,15 +16,10 @@ type PluginConnection = { grafana_url_from_engine: PluginConnectionCheck; }; -export type PostStatusResponse = { +export type StatusResponse = { pluginConnection: PluginConnection; - allow_signup: boolean; api_url: string; currently_undergoing_maintenance_message: string | null; - is_installed: boolean; - is_user_anonymous: boolean; license: string; - recaptcha_site_key: string; - token_ok: boolean; version: string; }; diff --git a/grafana-plugin/src/pages/settings/tabs/MainSettings/MainSettings.module.css b/grafana-plugin/src/pages/settings/tabs/MainSettings/MainSettings.module.css deleted file mode 100644 index 9c055775..00000000 --- a/grafana-plugin/src/pages/settings/tabs/MainSettings/MainSettings.module.css +++ /dev/null @@ -1,7 +0,0 @@ -.title { - margin-bottom: 20px; -} - -.settings { - width: fit-content; -} diff --git a/grafana-plugin/src/pages/settings/tabs/MainSettings/MainSettings.tsx b/grafana-plugin/src/pages/settings/tabs/MainSettings/MainSettings.tsx index e2de1da5..fea4751d 100644 --- a/grafana-plugin/src/pages/settings/tabs/MainSettings/MainSettings.tsx +++ b/grafana-plugin/src/pages/settings/tabs/MainSettings/MainSettings.tsx @@ -1,7 +1,7 @@ import React from 'react'; -import { Field, Input, Switch } from '@grafana/ui'; -import cn from 'classnames/bind'; +import { css } from '@emotion/css'; +import { Field, Input, Switch, useStyles2 } from '@grafana/ui'; import { observer } from 'mobx-react'; import { LegacyNavHeading } from 'navbar/LegacyNavHeading'; @@ -10,86 +10,71 @@ import { ApiTokenSettings } from 'containers/ApiTokenSettings/ApiTokenSettings'; import { WithPermissionControlTooltip } from 'containers/WithPermissionControl/WithPermissionControlTooltip'; import { TeamsSettings } from 'pages/settings/tabs/TeamsSettings/TeamsSettings'; import { isTopNavbar } from 'plugin/GrafanaPluginRootPage.helpers'; -import { WithStoreProps } from 'state/types'; -import { withMobXProviderContext } from 'state/withStore'; +import { useStore } from 'state/useStore'; import { UserActions } from 'utils/authorization/authorization'; -import styles from './MainSettings.module.css'; +export const MainSettings = observer(() => { + const styles = useStyles2(getStyles); + const { + organizationStore: { currentOrganization, saveCurrentOrganization }, + pluginStore: { apiUrlFromStatus }, + } = useStore(); -const cx = cn.bind(styles); - -interface SettingsPageProps extends WithStoreProps {} - -interface SettingsPageState { - apiUrl?: string; -} - -@observer -class Settings extends React.Component { - state: SettingsPageState = { - apiUrl: '', - }; - - async componentDidMount() { - const { store } = this.props; - const url = await store.getApiUrlForSettings(); - this.setState({ apiUrl: url }); - } - - render() { - const { organizationStore } = this.props.store; - const { currentOrganization } = organizationStore; - const { apiUrl } = this.state; - - return ( -
- - - Organization settings - - - -
- - Resolution Note - - - - { - organizationStore.saveCurrentOrganization({ - is_resolution_note_required: event.currentTarget.checked, - }); - }} - /> - - -
- {!isTopNavbar() && ( -
- - Teams and Access Settings - - -
- )} - - API URL + return ( +
+ + + Organization settings -
- - - -
- -
- ); - } -} + -export const MainSettings = withMobXProviderContext(Settings); +
+ + Resolution Note + + + + { + saveCurrentOrganization({ + is_resolution_note_required: event.currentTarget.checked, + }); + }} + /> + + +
+ {!isTopNavbar() && ( +
+ + Teams and Access Settings + + +
+ )} + + API URL + +
+ + + +
+ +
+ ); +}); + +const getStyles = () => ({ + settings: css` + width: fit-content; + `, + title: css` + margin-bottom: 20px; + `, +}); diff --git a/grafana-plugin/src/state/rootBaseStore/RootBaseStore.ts b/grafana-plugin/src/state/rootBaseStore/RootBaseStore.ts index 826de9af..2839ad30 100644 --- a/grafana-plugin/src/state/rootBaseStore/RootBaseStore.ts +++ b/grafana-plugin/src/state/rootBaseStore/RootBaseStore.ts @@ -69,9 +69,6 @@ export class RootBaseStore { @observable pageTitle = ''; - @observable - onCallApiUrl: string; - @observable insightsDatasource = 'grafanacloud-usage'; @@ -186,11 +183,6 @@ export class RootBaseStore { this.pageTitle = title; } - @action.bound - async getApiUrlForSettings() { - return this.onCallApiUrl; - } - @action.bound async loadRecaptcha() { const { recaptcha_site_key } = await makeRequest<{ recaptcha_site_key: string }>('/plugin/recaptcha'); diff --git a/grafana-plugin/src/types.ts b/grafana-plugin/src/types.ts index b2d7e0d2..44547883 100644 --- a/grafana-plugin/src/types.ts +++ b/grafana-plugin/src/types.ts @@ -1,4 +1,4 @@ -import { AppRootProps as BaseAppRootProps, AppPluginMeta, PluginConfigPageProps, BootData } from '@grafana/data'; +import { AppRootProps as BaseAppRootProps, AppPluginMeta, PluginConfigPageProps } from '@grafana/data'; import { getPluginId } from 'utils/consts'; @@ -30,8 +30,6 @@ export type OnCallPluginExtensionPoints = declare global { export interface Window { - // https://github.com/grafana/grafana/blob/78bef7a26a799209b5307d6bde8e25fcb4fbde7d/public/views/index-template.html#L251-L258 - grafanaBootData?: BootData; RECAPTCHA_SITE_KEY: string; grecaptcha: any; dataLayer: any;