import { defineMigrations } from '@bigbluebutton/store' import { T } from '@bigbluebutton/validate' import { StyleProp } from '../styles/StyleProp' import { DefaultColorStyle, DefaultLabelColorStyle } from '../styles/TLColorStyle' import { DefaultDashStyle } from '../styles/TLDashStyle' import { DefaultFillStyle } from '../styles/TLFillStyle' import { DefaultFontStyle } from '../styles/TLFontStyle' import { DefaultHorizontalAlignStyle, TLDefaultHorizontalAlignStyle, } from '../styles/TLHorizontalAlignStyle' import { DefaultSizeStyle } from '../styles/TLSizeStyle' import { DefaultVerticalAlignStyle } from '../styles/TLVerticalAlignStyle' import { ShapePropsType, TLBaseShape } from './TLBaseShape' /** @public */ export const GeoShapeGeoStyle = StyleProp.defineEnum('tldraw:geo', { defaultValue: 'rectangle', values: [ 'cloud', 'rectangle', 'ellipse', 'triangle', 'diamond', 'pentagon', 'hexagon', 'octagon', 'star', 'rhombus', 'rhombus-2', 'oval', 'trapezoid', 'arrow-right', 'arrow-left', 'arrow-up', 'arrow-down', 'x-box', 'check-box', ], }) /** @public */ export type TLGeoShapeGeoStyle = T.TypeOf /** @public */ export const geoShapeProps = { geo: GeoShapeGeoStyle, labelColor: DefaultLabelColorStyle, color: DefaultColorStyle, fill: DefaultFillStyle, dash: DefaultDashStyle, size: DefaultSizeStyle, font: DefaultFontStyle, align: DefaultHorizontalAlignStyle, verticalAlign: DefaultVerticalAlignStyle, url: T.string, w: T.nonZeroNumber, h: T.nonZeroNumber, growY: T.positiveNumber, text: T.string, } /** @public */ export type TLGeoShapeProps = ShapePropsType /** @public */ export type TLGeoShape = TLBaseShape<'geo', TLGeoShapeProps> const Versions = { AddUrlProp: 1, AddLabelColor: 2, RemoveJustify: 3, AddCheckBox: 4, AddVerticalAlign: 5, MigrateLegacyAlign: 6, AddCloud: 7, } as const export { Versions as GeoShapeVersions } /** @internal */ export const geoShapeMigrations = defineMigrations({ currentVersion: Versions.AddCloud, migrators: { [Versions.AddUrlProp]: { up: (shape) => { return { ...shape, props: { ...shape.props, url: '' } } }, down: (shape) => { const { url: _, ...props } = shape.props return { ...shape, props } }, }, [Versions.AddLabelColor]: { up: (record) => { return { ...record, props: { ...record.props, labelColor: 'black', }, } }, down: (record) => { const { labelColor: _, ...props } = record.props return { ...record, props, } }, }, [Versions.RemoveJustify]: { up: (shape) => { let newAlign = shape.props.align if (newAlign === 'justify') { newAlign = 'start' } return { ...shape, props: { ...shape.props, align: newAlign, }, } }, down: (shape) => { return { ...shape } }, }, [Versions.AddCheckBox]: { up: (shape) => { return { ...shape } }, down: (shape) => { return { ...shape, props: { ...shape.props, geo: shape.props.geo === 'check-box' ? 'rectangle' : shape.props.geo, }, } }, }, [Versions.AddVerticalAlign]: { up: (shape) => { return { ...shape, props: { ...shape.props, verticalAlign: 'middle', }, } }, down: (shape) => { const { verticalAlign: _, ...props } = shape.props return { ...shape, props, } }, }, [Versions.MigrateLegacyAlign]: { up: (shape) => { let newAlign: TLDefaultHorizontalAlignStyle switch (shape.props.align) { case 'start': newAlign = 'start-legacy' break case 'end': newAlign = 'end-legacy' break default: newAlign = 'middle-legacy' break } return { ...shape, props: { ...shape.props, align: newAlign, }, } }, down: (shape) => { let oldAlign: TLDefaultHorizontalAlignStyle switch (shape.props.align) { case 'start-legacy': oldAlign = 'start' break case 'end-legacy': oldAlign = 'end' break case 'middle-legacy': oldAlign = 'middle' break default: oldAlign = shape.props.align } return { ...shape, props: { ...shape.props, align: oldAlign, }, } }, }, [Versions.AddCloud]: { up: (shape) => { return shape }, down: (shape) => { if (shape.props.geo === 'cloud') { return { ...shape, props: { ...shape.props, geo: 'rectangle', }, } } }, }, }, })