grafana/public/app/features/scenes/components/SceneCanvasText.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

45 lines
1.2 KiB
TypeScript

import React, { CSSProperties } from 'react';
import { Field, Input } from '@grafana/ui';
import { SceneObjectBase } from '../core/SceneObjectBase';
import { SceneComponentProps, SceneLayoutChildState } from '../core/types';
export interface SceneCanvasTextState extends SceneLayoutChildState {
text: string;
fontSize?: number;
align?: 'left' | 'center' | 'right';
}
export class SceneCanvasText extends SceneObjectBase<SceneCanvasTextState> {
static Editor = Editor;
static Component = ({ model }: SceneComponentProps<SceneCanvasText>) => {
const { text, fontSize = 20, align = 'left' } = model.useState();
const style: CSSProperties = {
fontSize: fontSize,
display: 'flex',
flexGrow: 1,
alignItems: 'center',
padding: 16,
justifyContent: align,
};
return <div style={style}>{text}</div>;
};
}
function Editor({ model }: SceneComponentProps<SceneCanvasText>) {
const { fontSize } = model.useState();
return (
<Field label="Font size">
<Input
type="number"
defaultValue={fontSize}
onBlur={(evt) => model.setState({ fontSize: parseInt(evt.currentTarget.value, 10) })}
/>
</Field>
);
}