grafana/public/app/features/scenes/components/SceneToolbarButton.tsx
Torkel Ödegaard 8d92417a16
Scenes: Improve typing of scene state to avoid type guards and casting (#52422)
* Trying to get rid of type guard but failing

* Improve typing of scene object state

* Fixed wrongly renamed event

* Tweaks
2022-07-19 17:46:49 +02:00

41 lines
1.1 KiB
TypeScript

import React from 'react';
import { IconName, Input, ToolbarButton } from '@grafana/ui';
import { SceneObjectBase } from '../core/SceneObjectBase';
import { SceneComponentProps, SceneObjectStatePlain } from '../core/types';
export interface ToolbarButtonState extends SceneObjectStatePlain {
icon: IconName;
onClick: () => void;
}
export class SceneToolbarButton extends SceneObjectBase<ToolbarButtonState> {
static Component = ({ model }: SceneComponentProps<SceneToolbarButton>) => {
const state = model.useState();
return <ToolbarButton onClick={state.onClick} icon={state.icon} />;
};
}
export interface SceneToolbarInputState extends SceneObjectStatePlain {
value?: string;
onChange: (value: number) => void;
}
export class SceneToolbarInput extends SceneObjectBase<SceneToolbarInputState> {
static Component = ({ model }: SceneComponentProps<SceneToolbarInput>) => {
const state = model.useState();
return (
<Input
defaultValue={state.value}
width={8}
onBlur={(evt) => {
model.state.onChange(parseInt(evt.currentTarget.value, 10));
}}
/>
);
};
}