mirror of
https://github.com/overleaf/overleaf.git
synced 2024-10-17 21:05:04 -04:00
Merge pull request #19531 from overleaf/mj-cite-key-analytics
[web] Add analytics for cite key searches GitOrigin-RevId: f9215a6db8defb4d7c8356e997b671223cfcfb70
This commit is contained in:
parent
39112dafb7
commit
4eb88a6d1a
1 changed files with 86 additions and 0 deletions
|
@ -29,6 +29,7 @@ import {
|
|||
} from './completions/apply'
|
||||
import { snippet } from './completions/data/environments'
|
||||
import { syntaxTree } from '@codemirror/language'
|
||||
import { sendMBSampled } from '@/infrastructure/event-tracking'
|
||||
|
||||
function blankCompletions(): Completions {
|
||||
return {
|
||||
|
@ -206,6 +207,90 @@ export const bibKeyArgumentCompletionSource: CompletionSource =
|
|||
}
|
||||
)
|
||||
|
||||
const debouncedCounter = (
|
||||
debounceTime: number
|
||||
): {
|
||||
debounceTime: number
|
||||
counter: number
|
||||
increment: () => void
|
||||
reset: () => void
|
||||
} => {
|
||||
let timeoutId = 0
|
||||
let _counter = 0
|
||||
return {
|
||||
debounceTime,
|
||||
get counter() {
|
||||
return _counter
|
||||
},
|
||||
increment() {
|
||||
if (timeoutId !== 0) {
|
||||
clearTimeout(timeoutId)
|
||||
}
|
||||
timeoutId = window.setTimeout(() => {
|
||||
_counter += 1
|
||||
timeoutId = 0
|
||||
}, debounceTime)
|
||||
},
|
||||
reset() {
|
||||
clearTimeout(timeoutId)
|
||||
_counter = 0
|
||||
timeoutId = 0
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
const CITE_ANALYTICS_REPORT_TIMEOUT = 4000
|
||||
|
||||
const analyticsSourceBuilder = (debounceTimes: number[]) => {
|
||||
let timeoutId = 0
|
||||
const counters = debounceTimes.map(debounceTime => {
|
||||
if (debounceTime >= CITE_ANALYTICS_REPORT_TIMEOUT) {
|
||||
throw new Error(
|
||||
`Debounce time ${debounceTime} is greater than the report timeout ${CITE_ANALYTICS_REPORT_TIMEOUT}`
|
||||
)
|
||||
}
|
||||
return debouncedCounter(debounceTime)
|
||||
})
|
||||
|
||||
const incrementCounters = () => {
|
||||
counters.forEach(counter => counter.increment())
|
||||
}
|
||||
|
||||
const resetCounters = () => {
|
||||
counters.forEach(counter => counter.reset())
|
||||
}
|
||||
|
||||
const delayedReport = () => {
|
||||
if (timeoutId !== 0) {
|
||||
clearTimeout(timeoutId)
|
||||
}
|
||||
timeoutId = window.setTimeout(() => {
|
||||
const result: Record<string, number> = {}
|
||||
counters.forEach(debouncedCounter => {
|
||||
result[`${debouncedCounter.debounceTime}ms`] = debouncedCounter.counter
|
||||
})
|
||||
sendMBSampled(
|
||||
'cite-key-search',
|
||||
{ searchesForDebouncedTime: result },
|
||||
0.01
|
||||
)
|
||||
timeoutId = 0
|
||||
resetCounters()
|
||||
}, CITE_ANALYTICS_REPORT_TIMEOUT)
|
||||
}
|
||||
|
||||
return () => {
|
||||
incrementCounters()
|
||||
delayedReport()
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
const citeKeyAnalyticsSource = makeMultipleArgumentCompletionSource(
|
||||
['BibKeyArgument'],
|
||||
analyticsSourceBuilder([0, 100, 250, 500])
|
||||
)
|
||||
|
||||
export const refArgumentCompletionSource: CompletionSource =
|
||||
makeMultipleArgumentCompletionSource(
|
||||
['RefArgument'],
|
||||
|
@ -359,6 +444,7 @@ export const argumentCompletionSources: CompletionSource[] = [
|
|||
documentClassArgumentCompletionSource,
|
||||
bibliographyArgumentCompletionSource,
|
||||
bibliographyStyleArgumentCompletionSource,
|
||||
citeKeyAnalyticsSource,
|
||||
]
|
||||
|
||||
const commandCompletionSource = (context: CompletionContext) => {
|
||||
|
|
Loading…
Reference in a new issue