11import Component from " @glimmer/component" ;
22import { getOwner } from " @ember/owner" ;
3+ import { cancel } from " @ember/runloop" ;
34import { htmlSafe } from " @ember/template" ;
45import replaceEmoji from " discourse/helpers/replace-emoji" ;
6+ import discourseLater from " discourse/lib/later" ;
57import DTooltip from " float-kit/components/d-tooltip" ;
68
79const triggers = {
810 mobile: [" hover" ],
911 desktop: [" hover" ],
1012};
1113
14+ const MILLISECONDS_PER_SECOND = 1000 ;
15+
1216let TABLE_AI_LAYOUT = " table-ai" ;
1317import (" discourse/plugins/discourse-ai/discourse/services/gists" )
1418 .then ((module ) => {
@@ -19,6 +23,23 @@ import("discourse/plugins/discourse-ai/discourse/services/gists")
1923 });
2024
2125export default class TopicListTooltip extends Component {
26+ hoverTimeout = null ;
27+
28+ beforeTrigger = async () => {
29+ this .cancelPending ();
30+
31+ return new Promise ((resolve ) => {
32+ this .hoverTimeout = discourseLater (() => {
33+ this .hoverTimeout = null ;
34+ resolve ();
35+ }, settings .hover_delay_seconds * MILLISECONDS_PER_SECOND );
36+ });
37+ };
38+
39+ onClose = () => {
40+ this .cancelPending ();
41+ };
42+
2243 get gistsService () {
2344 try {
2445 return getOwner (this ).lookup (" service:gists" );
@@ -65,12 +86,21 @@ export default class TopicListTooltip extends Component {
6586 return null ;
6687 }
6788
89+ cancelPending () {
90+ if (this .hoverTimeout ) {
91+ cancel (this .hoverTimeout );
92+ this .hoverTimeout = null ;
93+ }
94+ }
95+
6896 <template >
6997 {{#if this . shouldShowTooltip }}
7098 <DTooltip
7199 @ triggers ={{triggers }}
72100 @ untriggers ={{triggers }}
73101 @ placement =" bottom-start"
102+ @ beforeTrigger ={{this .beforeTrigger }}
103+ @ onClose ={{this .onClose }}
74104 >
75105 <: trigger >
76106 {{ yield }}
0 commit comments