59 lines
1.6 KiB
TypeScript
59 lines
1.6 KiB
TypeScript
import { getSettings_DEPRECATED } from '../../utils/settings/settings.js'
|
|
import {
|
|
type AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
logEvent,
|
|
} from '../analytics/index.js'
|
|
import { getSessionsSinceLastShown, recordTipShown } from './tipHistory.js'
|
|
import { getRelevantTips } from './tipRegistry.js'
|
|
import type { Tip, TipContext } from './types.js'
|
|
|
|
export function selectTipWithLongestTimeSinceShown(
|
|
availableTips: Tip[],
|
|
): Tip | undefined {
|
|
if (availableTips.length === 0) {
|
|
return undefined
|
|
}
|
|
|
|
if (availableTips.length === 1) {
|
|
return availableTips[0]
|
|
}
|
|
|
|
// Sort tips by sessions since last shown (descending) and take the first one
|
|
// This is the tip that hasn't been shown for the longest time
|
|
const tipsWithSessions = availableTips.map(tip => ({
|
|
tip,
|
|
sessions: getSessionsSinceLastShown(tip.id),
|
|
}))
|
|
|
|
tipsWithSessions.sort((a, b) => b.sessions - a.sessions)
|
|
return tipsWithSessions[0]?.tip
|
|
}
|
|
|
|
export async function getTipToShowOnSpinner(
|
|
context?: TipContext,
|
|
): Promise<Tip | undefined> {
|
|
// Check if tips are disabled (default to true if not set)
|
|
if (getSettings_DEPRECATED().spinnerTipsEnabled === false) {
|
|
return undefined
|
|
}
|
|
|
|
const tips = await getRelevantTips(context)
|
|
if (tips.length === 0) {
|
|
return undefined
|
|
}
|
|
|
|
return selectTipWithLongestTimeSinceShown(tips)
|
|
}
|
|
|
|
export function recordShownTip(tip: Tip): void {
|
|
// Record in history
|
|
recordTipShown(tip.id)
|
|
|
|
// Log event for analytics
|
|
logEvent('tengu_tip_shown', {
|
|
tipIdLength:
|
|
tip.id as AnalyticsMetadata_I_VERIFIED_THIS_IS_NOT_CODE_OR_FILEPATHS,
|
|
cooldownSessions: tip.cooldownSessions,
|
|
})
|
|
}
|