From 9d812e935d01427c1f856faf2252eed38f34fc39 Mon Sep 17 00:00:00 2001 From: Dimitrie Stefanescu Date: Sat, 15 Jul 2023 18:10:50 +0100 Subject: [PATCH] experiments(dui3): cleanup --- packages/dui3/components/header/NavBar.vue | 10 ++-------- .../lib/bindings/definitions/baseBindings.ts | 6 ++++++ .../lib/bindings/definitions/testBindings.ts | 9 +++++++++ packages/dui3/lib/bridge/generic.ts | 13 ++++++++++++- packages/dui3/lib/bridge/sketchup.ts | 18 ++++++++++-------- packages/dui3/pages/index.vue | 3 ++- packages/dui3/pages/test.vue | 10 +++------- packages/dui3/plugins/00.bindings.ts | 15 +++++++++++---- 8 files changed, 55 insertions(+), 29 deletions(-) diff --git a/packages/dui3/components/header/NavBar.vue b/packages/dui3/components/header/NavBar.vue index 097e23e17..6d28e7bad 100644 --- a/packages/dui3/components/header/NavBar.vue +++ b/packages/dui3/components/header/NavBar.vue @@ -7,14 +7,8 @@
- - + Show Dev Tools
@@ -24,5 +18,5 @@ diff --git a/packages/dui3/lib/bindings/definitions/baseBindings.ts b/packages/dui3/lib/bindings/definitions/baseBindings.ts index d59330531..34961ef18 100644 --- a/packages/dui3/lib/bindings/definitions/baseBindings.ts +++ b/packages/dui3/lib/bindings/definitions/baseBindings.ts @@ -14,6 +14,11 @@ export interface IBaseBinding { event: E, callback: IBaseBindingHostEvents[E] ) => void + /** + * Note: this method does not need to be implemented in the .NET host application base bindings, + * it is served by the DUI3 bridge. + */ + showDevTools: () => Promise } export interface IBaseBindingHostEvents { @@ -21,6 +26,7 @@ export interface IBaseBindingHostEvents { documentChanged: () => void } +// An almost 1-1 mapping of what we need from the Core accounts class. export type Account = { id: string isDefault: boolean diff --git a/packages/dui3/lib/bindings/definitions/testBindings.ts b/packages/dui3/lib/bindings/definitions/testBindings.ts index 500850fd2..c2aae246d 100644 --- a/packages/dui3/lib/bindings/definitions/testBindings.ts +++ b/packages/dui3/lib/bindings/definitions/testBindings.ts @@ -1,7 +1,16 @@ +/** + * The name under which this binding will be registered. + */ +export const ITestBindingKey = 'testBinding' + +/** + * A test binding interface to ensure compatbility. Ideally all host environments would implement and register it. + */ export interface ITestBinding { sayHi: (name: string, count: number, sayHelloNotHi: boolean) => Promise goAway: () => Promise getComplexType: () => Promise + shouldThrow: () => Promise triggerEvent: (eventName: string) => Promise on: ( event: E, diff --git a/packages/dui3/lib/bridge/generic.ts b/packages/dui3/lib/bridge/generic.ts index a09199c90..b4c22c550 100644 --- a/packages/dui3/lib/bridge/generic.ts +++ b/packages/dui3/lib/bridge/generic.ts @@ -35,13 +35,24 @@ export class GenericBridge extends BaseBridge { private async runMethod(methodName: string, args: unknown[]): Promise { const preserializedArgs = args.map((a) => JSON.stringify(a)) + // NOTE: RunMethod is a call to the .NET side. const result = await this.bridge.RunMethod( methodName, JSON.stringify(preserializedArgs) ) - return JSON.parse(result) as unknown + const parsed = result ? (JSON.parse(result) as Record) : null + + if (parsed && parsed['error']) { + throw new Error(parsed['error'] as string) + } + + return parsed + } + + public showDevTools() { + this.bridge.ShowDevTools() } } diff --git a/packages/dui3/lib/bridge/sketchup.ts b/packages/dui3/lib/bridge/sketchup.ts index 79f522d60..75fb28c8c 100644 --- a/packages/dui3/lib/bridge/sketchup.ts +++ b/packages/dui3/lib/bridge/sketchup.ts @@ -49,22 +49,17 @@ export class SketchupBridge extends BaseBridge { ;(globalThis as Record).bindings = this } - // NOTE: Overriden function for now, need to be checked later payload can be unified or not. - // From sketchup we receive beatiful JSON object that we do not need to parse. - // This should be checked with .NET + // NOTE: Overriden emit as we do not need to parse the data back - the Sketchup bridge already parses it for us. emit(eventName: string, payload: string): void { - this.emitter.emit(eventName, payload) + this.emitter.emit(eventName, payload as unknown as Record) } public async create(): Promise { // Initialization continues in the receiveCommandsAndInitializeBridge function, // where we expect sketchup to return to us the command names for related bindings/views. - // NOTE: as we want to have multiple sketchup bindings in the future, we will - // most likely change this method to specify which view/plugin/bindings we want. - // eslint-disable-next-line camelcase - // sketchup.exec({ name: 'getCommands', view_id: this.bindingsName }) sketchup.getCommands(this.bindingsName) + // try { await this.isInitalized return true @@ -148,4 +143,11 @@ export class SketchupBridge extends BaseBridge { delete this.requests[requestId] } } + + public showDevTools() { + // eslint-disable-next-line no-alert + window.alert( + 'Sketchup cannot do this. The dev tools menu is accessible via a right click.' + ) + } } diff --git a/packages/dui3/pages/index.vue b/packages/dui3/pages/index.vue index 45ffbf581..cdf848732 100644 --- a/packages/dui3/pages/index.vue +++ b/packages/dui3/pages/index.vue @@ -44,9 +44,10 @@ import { graphql } from '~/lib/common/generated/gql' import { ServerInfoTestQuery } from '~/lib/common/generated/gql/graphql' import { useDocumentInfoSetup } from '~/lib/document-info' +const { accounts, refreshAccounts, defaultAccount } = await useAccountsSetup() + const { $baseBinding } = useNuxtApp() const appName = await $baseBinding.getSourceApplicationName() -const { accounts, refreshAccounts, defaultAccount } = await useAccountsSetup() const documentInfo = await useDocumentInfoSetup() diff --git a/packages/dui3/pages/test.vue b/packages/dui3/pages/test.vue index 1e002b42a..495af4489 100644 --- a/packages/dui3/pages/test.vue +++ b/packages/dui3/pages/test.vue @@ -21,16 +21,12 @@ import { ComplexType, TestEventArgs } from '~/lib/bindings/definitions/testBindi const { $testBindings } = useNuxtApp() $testBindings.on('emptyTestEvent', () => { - setTimeout(() => { - console.log('empty test event catched!') - }, 500) + console.log('empty test event catched!') }) $testBindings.on('testEvent', (args: TestEventArgs) => { - setTimeout(() => { - console.log('test event catched!') - console.log(args) - }, 500) + console.log('test event catched!') + console.log(args) }) async function triggerEmptyEvent() { diff --git a/packages/dui3/plugins/00.bindings.ts b/packages/dui3/plugins/00.bindings.ts index 955a0ce90..1fd7827bb 100644 --- a/packages/dui3/plugins/00.bindings.ts +++ b/packages/dui3/plugins/00.bindings.ts @@ -3,7 +3,7 @@ import { IRawBridge } from '~/lib/bridge/definitions' import { IBaseBinding } from '~/lib/bindings/definitions/baseBindings' import { SketchupBridge } from '~/lib/bridge/sketchup' -import { ITestBinding } from '~/lib/bindings/definitions/testBindings' +import { ITestBinding, ITestBindingKey } from '~/lib/bindings/definitions/testBindings' // Makes TS happy declare let globalThis: Record & { @@ -18,16 +18,23 @@ declare let globalThis: Record & { * strip or customize functionality from the ui itself. */ export default defineNuxtPlugin(async () => { - const testBindings = await tryHoistBinding('testBindings') + // Registers some default test bindings. + const testBindings = await tryHoistBinding(ITestBindingKey) + // Tries to register some non-existant bindings. const nonExistantBindings = await tryHoistBinding('nonExistantBindings') - + // Registers a set of default bindings. const baseBinding = await tryHoistBinding('baseBinding') + const showDevTools = () => { + baseBinding.showDevTools() + } + return { provide: { testBindings, nonExistantBindings, - baseBinding + baseBinding, + showDevTools } } })