Files
Homarr/src/widgets/widgets.ts

88 lines
2.1 KiB
TypeScript
Raw Normal View History

2023-01-05 22:43:27 +09:00
import { TablerIcon } from '@tabler/icons';
2022-12-18 21:21:23 +01:00
import React from 'react';
import { AreaType } from '../types/area';
import { ShapeType } from '../types/shape';
2022-12-18 21:21:23 +01:00
// Type of widgets which are safed to config
export type IWidget<TKey extends string, TDefinition extends IWidgetDefinition> = {
id: TKey;
properties: {
[key in keyof TDefinition['options']]: MakeLessSpecific<
TDefinition['options'][key]['defaultValue']
>;
};
area: AreaType;
shape: ShapeType;
};
// Makes the type less specific
// For example when the type true is used as input the result is boolean
// By not using this type the definition would always be { property: true }
type MakeLessSpecific<TInput extends IWidgetOptionValue['defaultValue']> = TInput extends boolean
? boolean
: TInput extends number
? number
: TInput extends string[]
? string[]
: TInput extends string
? string
: never;
// Types of options that can be specified for the widget edit modal
export type IWidgetOptionValue =
| IMultiSelectOptionValue
| ISwitchOptionValue
| ITextInputOptionValue
2023-01-05 22:43:27 +09:00
| ISliderInputOptionValue
2022-12-18 21:21:23 +01:00
| INumberInputOptionValue;
// will show a multi-select with specified data
export type IMultiSelectOptionValue = {
type: 'multi-select';
defaultValue: string[];
data: string[];
};
// will show a switch
export type ISwitchOptionValue = {
type: 'switch';
defaultValue: boolean;
};
// will show a text-input
export type ITextInputOptionValue = {
type: 'text';
defaultValue: string;
};
// will show a number-input
export type INumberInputOptionValue = {
type: 'number';
2023-01-05 22:43:27 +09:00
defaultValue: number;
};
// will show a slider-input
export type ISliderInputOptionValue = {
type: 'slider';
defaultValue: number;
min: number;
max: number;
step: number;
2022-12-18 21:21:23 +01:00
};
// is used to type the widget definitions which will be used to display all widgets
export type IWidgetDefinition<TKey extends string = string> = {
id: TKey;
icon: TablerIcon | string;
options: {
[key: string]: IWidgetOptionValue;
};
gridstack: {
minWidth: number;
minHeight: number;
maxWidth: number;
maxHeight: number;
};
2022-12-18 21:21:23 +01:00
component: React.ComponentType<any>;
};