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'
|
} from './completions/apply'
|
||||||
import { snippet } from './completions/data/environments'
|
import { snippet } from './completions/data/environments'
|
||||||
import { syntaxTree } from '@codemirror/language'
|
import { syntaxTree } from '@codemirror/language'
|
||||||
|
import { sendMBSampled } from '@/infrastructure/event-tracking'
|
||||||
|
|
||||||
function blankCompletions(): Completions {
|
function blankCompletions(): Completions {
|
||||||
return {
|
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 =
|
export const refArgumentCompletionSource: CompletionSource =
|
||||||
makeMultipleArgumentCompletionSource(
|
makeMultipleArgumentCompletionSource(
|
||||||
['RefArgument'],
|
['RefArgument'],
|
||||||
|
@ -359,6 +444,7 @@ export const argumentCompletionSources: CompletionSource[] = [
|
||||||
documentClassArgumentCompletionSource,
|
documentClassArgumentCompletionSource,
|
||||||
bibliographyArgumentCompletionSource,
|
bibliographyArgumentCompletionSource,
|
||||||
bibliographyStyleArgumentCompletionSource,
|
bibliographyStyleArgumentCompletionSource,
|
||||||
|
citeKeyAnalyticsSource,
|
||||||
]
|
]
|
||||||
|
|
||||||
const commandCompletionSource = (context: CompletionContext) => {
|
const commandCompletionSource = (context: CompletionContext) => {
|
||||||
|
|
Loading…
Reference in a new issue