import React from "react"; import type { IFlowContext } from "project-editor/flow/flow-interfaces"; import type { Component, ComponentInput, ComponentOutput, Widget } from "project-editor/flow/component"; import type { Assets, DataBuffer } from "project-editor/build/assets"; import { evalConstantExpression } from "project-editor/flow/expression"; import { ProjectEditor } from "project-editor/project-editor-interface"; import { getProperty } from "project-editor/core/object"; //////////////////////////////////////////////////////////////////////////////// export function evalProperty( flowContext: IFlowContext, widget: Widget, propertyName: string ) { let expr = getProperty(widget, propertyName); if (!expr) { return undefined; } if (flowContext.flowState) { if (flowContext.projectStore.runtime) { return flowContext.projectStore.runtime.evalProperty( flowContext, widget, propertyName ); } else { return undefined; } } else { try { return evalConstantExpression( flowContext.projectStore.project, expr ).value; } catch (err) { return undefined; } } } export function evalPropertyWithType( flowContext: IFlowContext, widget: Widget, propertyName: string ) { let expr = getProperty(widget, propertyName); if (!expr) { return undefined; } if (flowContext.flowState) { if (flowContext.projectStore.runtime) { return flowContext.projectStore.runtime.evalPropertyWithType( flowContext, widget, propertyName ); } else { return undefined; } } else { try { return evalConstantExpression( flowContext.projectStore.project, expr ); } catch (err) { return undefined; } } } export function getBooleanValue( flowContext: IFlowContext, widget: Widget, propertyName: string, defaultValue: boolean ) { let expr = (widget as any)[propertyName]; if (!expr) { return defaultValue; } let value; try { value = evalProperty(flowContext, widget, propertyName); } catch (err) { // console.error(err); } return !!value; } export function getNumberValue( flowContext: IFlowContext, widget: Widget, propertyName: string, defaultValue: number ) { let expr = (widget as any)[propertyName]; if (!expr) { return defaultValue; } let value; try { value = evalProperty(flowContext, widget, propertyName); } catch (err) { // console.error(err); } if (typeof value === "number") { return value; } return defaultValue; } export function getStringValue( flowContext: IFlowContext, widget: Widget, propertyName: string, defaultValue: string ) { let expr = (widget as any)[propertyName]; if (!expr) { return defaultValue; } let value; try { value = evalProperty(flowContext, widget, propertyName); } catch (err) { // console.error(err); } if (typeof value === "string") { return value; } return defaultValue; } export function getAnyValue( flowContext: IFlowContext, widget: Widget, propertyName: string, defaultValue: any ) { let expr = (widget as any)[propertyName]; if (!expr) { return defaultValue; } let value; try { value = evalProperty(flowContext, widget, propertyName); } catch (err) { // console.error(err); } return value != undefined ? value : defaultValue; } export function getTextValue( flowContext: IFlowContext, widget: Widget, propertyName: string, name: string | undefined, text: string | undefined ): { text: string; node: React.ReactNode } | string { let data = (widget as any)[propertyName]; if (flowContext.projectStore.projectTypeTraits.hasFlowSupport) { if (data) { if (flowContext.flowState) { try { const value = evalProperty( flowContext, widget, propertyName ); if (typeof value == "string" || typeof value == "number") { return value.toString(); } return ""; } catch (err) { //console.error(err); return ""; } } if (flowContext.projectStore.runtime) { return ""; } if (name) { return name; } try { const result = evalConstantExpression( ProjectEditor.getProject(widget), data ); if (typeof result.value === "string") { return result.value; } } catch (err) {} const text = `{${data}}`; return { text, node: {text} }; } if (flowContext.flowState) { return ""; } if (name) { return name; } return ""; } if (text) { return text; } if (name) { return name; } if (data) { const result = flowContext.dataContext.get(data); if (result != undefined) { return result; } return data; } return ""; } //////////////////////////////////////////////////////////////////////////////// export function buildWidgetText( assets: Assets, dataBuffer: DataBuffer, text: string | undefined, defaultValue?: string ) { if (text == undefined) { text = defaultValue; } if (text != undefined) { try { text = JSON.parse('"' + text + '"'); } catch (e) {} } if (text != undefined) { const writeText = text; dataBuffer.writeObjectOffset(() => dataBuffer.writeString(writeText)); } else { dataBuffer.writeUint32(0); } } //////////////////////////////////////////////////////////////////////////////// export function getInputDisplayName( component: Component | undefined, componentInput: ComponentInput | string, appendType: boolean = false ): string { if (typeof componentInput == "string") { if (componentInput == "@seqin") { return "seqin"; } if (component) { const input = component.inputs.find( input => input.name == componentInput ); if (input) { return getInputDisplayName(component, input, appendType); } } return componentInput; } else if (componentInput.displayName) { if (typeof componentInput.displayName === "string") { return ( componentInput.displayName + (appendType ? ` (${componentInput.type})` : "") ); } if (component) { return ( componentInput.displayName(component, componentInput) + (appendType ? ` (${componentInput.type})` : "") ); } } if (componentInput.name == "@seqin") { return "seqin"; } return ( componentInput.name + (appendType ? ` (${componentInput.type})` : "") ); } //////////////////////////////////////////////////////////////////////////////// export function getOutputDisplayName( component: Component | undefined, componentOutput: ComponentOutput | string, appendType: boolean = false ): string { if (typeof componentOutput == "string") { if (componentOutput == "@seqout") { return "seqout"; } if (component) { const output = component.outputs.find( output => output.name == componentOutput ); if (output) { return getOutputDisplayName(component, output, appendType); } } return componentOutput; } else if (componentOutput.displayName) { if (typeof componentOutput.displayName === "string") { return ( componentOutput.displayName + (appendType ? ` (${componentOutput.type})` : "") ); } if (component) { return ( componentOutput.displayName(component, componentOutput) + (appendType ? ` (${componentOutput.type})` : "") ); } } if (componentOutput.name == "@seqout") { return "seqout"; } return ( componentOutput.name + (appendType ? ` (${componentOutput.type})` : "") ); }