1
1
import type { Disposable , Uri } from 'vscode' ;
2
2
import { workspace } from 'vscode' ;
3
+ import type { AIFeedbackEvent } from '../constants.telemetry' ;
3
4
import type { AIResultContext } from '../plus/ai/aiProviderService' ;
4
5
import { setContext } from '../system/-webview/context' ;
6
+ import { UriMap } from '../system/-webview/uriMap' ;
5
7
import type { Deferrable } from '../system/function/debounce' ;
6
8
import { debounce } from '../system/function/debounce' ;
9
+ import { filterMap } from '../system/iterable' ;
7
10
8
11
export class AIFeedbackProvider implements Disposable {
9
12
constructor ( ) {
@@ -26,8 +29,10 @@ export class AIFeedbackProvider implements Disposable {
26
29
private readonly _disposables : Disposable [ ] = [ ] ;
27
30
dispose ( ) : void {
28
31
this . _disposables . forEach ( d => void d . dispose ( ) ) ;
32
+ this . _uriResponses . clear ( ) ;
29
33
this . _changelogFeedbacks . clear ( ) ;
30
34
this . _changelogUris . clear ( ) ;
35
+ this . _updateFeedbackContextDebounced = undefined ;
31
36
this . _updateChangelogContextDebounced = undefined ;
32
37
}
33
38
@@ -64,4 +69,29 @@ export class AIFeedbackProvider implements Disposable {
64
69
private deleteChangelogFeedback ( documentUri : string ) : void {
65
70
this . _changelogFeedbacks . delete ( documentUri ) ;
66
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 ) ;
96
+ }
67
97
}
0 commit comments