11import type { Disposable , Uri } from 'vscode' ;
22import { workspace } from 'vscode' ;
3+ import type { AIFeedbackEvent } from '../constants.telemetry' ;
34import type { AIResultContext } from '../plus/ai/aiProviderService' ;
45import { setContext } from '../system/-webview/context' ;
6+ import { UriMap } from '../system/-webview/uriMap' ;
57import type { Deferrable } from '../system/function/debounce' ;
68import { debounce } from '../system/function/debounce' ;
9+ import { filterMap } from '../system/iterable' ;
710
811export class AIFeedbackProvider implements Disposable {
912 constructor ( ) {
@@ -14,20 +17,22 @@ export class AIFeedbackProvider implements Disposable {
1417 }
1518
1619 public addChangelogDocument ( uri : Uri , context : AIResultContext ) : void {
17- this . setChangelogFeedback ( uri . toString ( ) , context ) ;
20+ this . setChangelogDocument ( uri . toString ( ) , context ) ;
1821 this . addChangelogUri ( uri ) ;
1922 }
2023
2124 private removeChangelogDocument ( uri : Uri ) : void {
22- this . deleteChangelogFeedback ( uri . toString ( ) ) ;
25+ this . deleteChangelogDocument ( uri . toString ( ) ) ;
2326 this . removeChangelogUri ( uri ) ;
2427 }
2528
2629 private readonly _disposables : Disposable [ ] = [ ] ;
2730 dispose ( ) : void {
2831 this . _disposables . forEach ( d => void d . dispose ( ) ) ;
29- this . _changelogFeedbacks . clear ( ) ;
32+ this . _uriResponses . clear ( ) ;
33+ this . _changelogDocuments . clear ( ) ;
3034 this . _changelogUris . clear ( ) ;
35+ this . _updateFeedbackContextDebounced = undefined ;
3136 this . _updateChangelogContextDebounced = undefined ;
3237 }
3338
@@ -54,14 +59,39 @@ export class AIFeedbackProvider implements Disposable {
5459 }
5560
5661 // Storage for AI feedback context associated with changelog documents
57- private readonly _changelogFeedbacks = new Map < string , AIResultContext > ( ) ;
58- getChangelogFeedback ( documentUri : string ) : AIResultContext | undefined {
59- return this . _changelogFeedbacks . get ( documentUri ) ;
62+ private readonly _changelogDocuments = new Map < string , AIResultContext > ( ) ;
63+ getChangelogDocument ( documentUri : string ) : AIResultContext | undefined {
64+ return this . _changelogDocuments . get ( documentUri ) ;
6065 }
61- private setChangelogFeedback ( documentUri : string , context : AIResultContext ) : void {
62- this . _changelogFeedbacks . set ( documentUri , context ) ;
66+ private setChangelogDocument ( documentUri : string , context : AIResultContext ) : void {
67+ this . _changelogDocuments . set ( documentUri , context ) ;
6368 }
64- private deleteChangelogFeedback ( documentUri : string ) : void {
65- this . _changelogFeedbacks . delete ( documentUri ) ;
69+ private deleteChangelogDocument ( documentUri : string ) : void {
70+ this . _changelogDocuments . delete ( documentUri ) ;
71+ }
72+
73+ // Storage for AI feedback responses by URI
74+ private readonly _uriResponses = new UriMap < AIFeedbackEvent [ 'sentiment' ] > ( ) ;
75+ private _updateFeedbackContextDebounced : Deferrable < ( ) => void > | undefined ;
76+ private updateFeedbackContext ( ) : void {
77+ this . _updateFeedbackContextDebounced ??= debounce ( ( ) => {
78+ void setContext ( 'gitlens:tabs:ai:helpful' , [
79+ ...filterMap ( this . _uriResponses , ( [ uri , sentiment ] ) => ( sentiment === 'helpful' ? uri : undefined ) ) ,
80+ ] ) ;
81+ void setContext ( 'gitlens:tabs:ai:unhelpful' , [
82+ ...filterMap ( this . _uriResponses , ( [ uri , sentiment ] ) => ( sentiment === 'unhelpful' ? uri : undefined ) ) ,
83+ ] ) ;
84+ } , 100 ) ;
85+ this . _updateFeedbackContextDebounced ( ) ;
86+ }
87+ setFeedbackResponse ( uri : Uri , sentiment : AIFeedbackEvent [ 'sentiment' ] ) : void {
88+ const previous = this . _uriResponses . get ( uri ) ;
89+ if ( sentiment === previous ) return ;
90+
91+ this . _uriResponses . set ( uri , sentiment ) ;
92+ this . updateFeedbackContext ( ) ;
93+ }
94+ getFeedbackResponse ( uri : Uri ) : AIFeedbackEvent [ 'sentiment' ] | undefined {
95+ return this . _uriResponses . get ( uri ) ;
6696 }
6797}
0 commit comments