From f76e316aa654473ff88ba5c537afae76c2209455 Mon Sep 17 00:00:00 2001 From: gtarpenning Date: Mon, 28 Oct 2024 16:10:08 -0700 Subject: [PATCH] chore(ui): add feedback_replace to ui, update listeners w/ feedback_ref --- .../wfReactInterface/traceServerClient.ts | 56 +++++++++++++++---- .../traceServerClientTypes.ts | 10 ++++ .../traceServerDirectClient.ts | 9 +++ 3 files changed, 63 insertions(+), 12 deletions(-) diff --git a/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/wfReactInterface/traceServerClient.ts b/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/wfReactInterface/traceServerClient.ts index af997016a4a5..227aa90f9f40 100644 --- a/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/wfReactInterface/traceServerClient.ts +++ b/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/wfReactInterface/traceServerClient.ts @@ -5,6 +5,8 @@ import { FeedbackCreateRes, FeedbackPurgeReq, FeedbackPurgeRes, + FeedbackReplaceReq, + FeedbackReplaceRes, TraceCallsDeleteReq, TraceCallUpdateReq, TraceRefsReadBatchReq, @@ -23,7 +25,13 @@ export class TraceServerClient extends DirectTraceServerClient { }> = []; private onDeleteListeners: Array<() => void>; private onRenameListeners: Array<() => void>; - private onFeedbackListeners: Record void>>; + // weave_ref -> feedback_ref -> callback + // For feedback without a feedback_ref, (the default case) + // the key is the empty string (this.FEEDBACK_REF_DEFAULT). + private onFeedbackListeners: Record< + string, + Record void>> + >; constructor(baseUrl: string) { super(baseUrl); @@ -34,6 +42,8 @@ export class TraceServerClient extends DirectTraceServerClient { this.onFeedbackListeners = {}; } + private FEEDBACK_REF_DEFAULT = ''; + /** * Registers a callback to be called when a delete operation occurs. * This method is purely for local notification within the client @@ -60,20 +70,25 @@ export class TraceServerClient extends DirectTraceServerClient { } public registerOnFeedbackListener( weaveRef: string, - callback: () => void + callback: () => void, + feedbackRef?: string ): () => void { - if (!(weaveRef in this.onFeedbackListeners)) { - this.onFeedbackListeners[weaveRef] = []; + const feedbackRefResolved = feedbackRef ?? this.FEEDBACK_REF_DEFAULT; + if (!(feedbackRefResolved in this.onFeedbackListeners)) { + this.onFeedbackListeners[feedbackRefResolved] = {}; + } + if (!(weaveRef in this.onFeedbackListeners[feedbackRefResolved])) { + this.onFeedbackListeners[feedbackRefResolved][weaveRef] = []; } - this.onFeedbackListeners[weaveRef].push(callback); + this.onFeedbackListeners[feedbackRefResolved][weaveRef].push(callback); return () => { - const newListeners = this.onFeedbackListeners[weaveRef].filter( - listener => listener !== callback - ); + const newListeners = this.onFeedbackListeners[feedbackRefResolved][ + weaveRef + ].filter(listener => listener !== callback); if (newListeners.length) { - this.onFeedbackListeners[weaveRef] = newListeners; + this.onFeedbackListeners[feedbackRefResolved][weaveRef] = newListeners; } else { - delete this.onFeedbackListeners[weaveRef]; + delete this.onFeedbackListeners[feedbackRefResolved][weaveRef]; } }; } @@ -94,7 +109,10 @@ export class TraceServerClient extends DirectTraceServerClient { public feedbackCreate(req: FeedbackCreateReq): Promise { const res = super.feedbackCreate(req).then(createRes => { - const listeners = this.onFeedbackListeners[req.weave_ref] ?? []; + const feedbackRefResolved = + req.payload?.feedback_ref ?? this.FEEDBACK_REF_DEFAULT; + const listeners = + this.onFeedbackListeners[feedbackRefResolved][req.weave_ref] ?? []; listeners.forEach(listener => listener()); return createRes; }); @@ -106,13 +124,27 @@ export class TraceServerClient extends DirectTraceServerClient { // information about the refs that were modified. // For now, just call all registered feedback listeners. for (const listeners of Object.values(this.onFeedbackListeners)) { - listeners.forEach(listener => listener()); + for (const listenersForWeaveRef of Object.values(listeners)) { + listenersForWeaveRef.forEach(listener => listener()); + } } return purgeRes; }); return res; } + public feedbackReplace(req: FeedbackReplaceReq): Promise { + const res = super.feedbackReplace(req).then(replaceRes => { + const feedbackRefResolved = + req.payload?.feedback_ref ?? this.FEEDBACK_REF_DEFAULT; + const listeners = + this.onFeedbackListeners[feedbackRefResolved][req.weave_ref] ?? []; + listeners.forEach(listener => listener()); + return replaceRes; + }); + return res; + } + public readBatch(req: TraceRefsReadBatchReq): Promise { return this.requestReadBatch(req); } diff --git a/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/wfReactInterface/traceServerClientTypes.ts b/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/wfReactInterface/traceServerClientTypes.ts index 88113a37a74a..2181f2db758f 100644 --- a/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/wfReactInterface/traceServerClientTypes.ts +++ b/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/wfReactInterface/traceServerClientTypes.ts @@ -190,6 +190,16 @@ export type FeedbackPurgeError = { detail: string; }; export type FeedbackPurgeRes = FeedbackPurgeSuccess | FeedbackPurgeError; + +export type FeedbackReplaceReq = FeedbackCreateReq & { + feedback_id: string; +}; +export type FeedbackReplaceSuccess = {}; +export type FeedbackReplaceError = { + detail: string; +}; +export type FeedbackReplaceRes = FeedbackCreateRes; + interface TraceObjectsFilter { base_object_classes?: string[]; object_ids?: string[]; diff --git a/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/wfReactInterface/traceServerDirectClient.ts b/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/wfReactInterface/traceServerDirectClient.ts index caaf63b7f561..e1ee4fb8a8f8 100644 --- a/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/wfReactInterface/traceServerDirectClient.ts +++ b/weave-js/src/components/PagePanelComponents/Home/Browse3/pages/wfReactInterface/traceServerDirectClient.ts @@ -23,6 +23,8 @@ import { FeedbackPurgeRes, FeedbackQueryReq, FeedbackQueryRes, + FeedbackReplaceReq, + FeedbackReplaceRes, TraceCallReadReq, TraceCallReadRes, TraceCallSchema, @@ -268,6 +270,13 @@ export class DirectTraceServerClient { ); } + public feedbackReplace(req: FeedbackReplaceReq): Promise { + return this.makeRequest( + '/feedback/replace', + req + ); + } + public fileContent( req: TraceFileContentReadReq ): Promise {