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 ( ) {
@@ -14,20 +17,22 @@ export class AIFeedbackProvider implements Disposable {
14
17
}
15
18
16
19
public addChangelogDocument ( uri : Uri , context : AIResultContext ) : void {
17
- this . setChangelogFeedback ( uri . toString ( ) , context ) ;
20
+ this . setChangelogDocument ( uri . toString ( ) , context ) ;
18
21
this . addChangelogUri ( uri ) ;
19
22
}
20
23
21
24
private removeChangelogDocument ( uri : Uri ) : void {
22
- this . deleteChangelogFeedback ( uri . toString ( ) ) ;
25
+ this . deleteChangelogDocument ( uri . toString ( ) ) ;
23
26
this . removeChangelogUri ( uri ) ;
24
27
}
25
28
26
29
private readonly _disposables : Disposable [ ] = [ ] ;
27
30
dispose ( ) : void {
28
31
this . _disposables . forEach ( d => void d . dispose ( ) ) ;
29
- this . _changelogFeedbacks . clear ( ) ;
32
+ this . _uriResponses . clear ( ) ;
33
+ this . _changelogDocuments . clear ( ) ;
30
34
this . _changelogUris . clear ( ) ;
35
+ this . _updateFeedbackContextDebounced = undefined ;
31
36
this . _updateChangelogContextDebounced = undefined ;
32
37
}
33
38
@@ -54,14 +59,39 @@ export class AIFeedbackProvider implements Disposable {
54
59
}
55
60
56
61
// 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 ) ;
60
65
}
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 ) ;
63
68
}
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 ) ;
66
96
}
67
97
}
0 commit comments