quala-widget
Version:
Smart feedback widget for SaaS trial optimization
113 lines • 2.96 kB
TypeScript
export interface AntiSpamConfig {
enabled: boolean;
globalCooldownMs: number;
enablePriorityOverride: boolean;
triggerPriorities: {
console_error: number;
api_failure: number;
form_failure: number;
exit_intent: number;
time: number;
manual: number;
};
maxWidgetsPerSession: number;
priorityOverrideThreshold: number;
}
export interface AntiSpamState {
lastWidgetShownAt: number;
lastWidgetPriority: number;
lastWidgetTriggerType: string;
widgetsShownThisSession: number;
sessionStartTime: number;
isAnyWidgetOpen: boolean;
}
export interface WidgetDecision {
allowed: boolean;
reason: string;
details?: {
triggerType: string;
priority: number;
timeSinceLastWidget?: number;
sessionCount?: number;
cooldownRemaining?: number;
};
}
export declare class AntiSpamManager {
private config;
private state;
private debug;
private static readonly DEFAULT_CONFIG;
constructor(debug?: boolean);
private log;
private initializeState;
/**
* Load configuration from API response
*/
loadConfig(config: AntiSpamConfig | null): void;
/**
* Validate configuration and merge with defaults for missing fields
*/
private validateAndMergeConfig;
/**
* Load persisted state from localStorage
*/
private loadPersistedState;
/**
* Persist current state to localStorage
*/
private persistState;
/**
* Reset state (for new sessions or errors)
*/
resetState(): void;
/**
* Get priority for a trigger type
*/
private getTriggerPriority;
/**
* Main decision method: Should we show a widget for this trigger?
*/
shouldShowWidget(triggerType: string): WidgetDecision;
/**
* Record that a widget was shown
*/
onWidgetShown(triggerType: string): void;
/**
* Record that a widget was hidden/dismissed
*/
onWidgetHidden(triggerType: string): void;
/**
* Record that a widget failed to show (to revert state)
*/
onWidgetShowFailed(triggerType: string): void;
/**
* Get current anti-spam status for debugging
*/
getStatus(): {
config: AntiSpamConfig | null;
state: AntiSpamState;
nextAllowedAt?: Date;
remainingInSession: number;
};
/**
* Update configuration (for runtime changes)
*/
updateConfig(newConfig: Partial<AntiSpamConfig>): void;
/**
* Manual override to force allow next widget (for debugging)
*/
forceAllow(): void;
/**
* Check if anti-spam is currently active
*/
isEnabled(): boolean;
/**
* Get configuration (for external inspection)
*/
getConfig(): AntiSpamConfig | null;
/**
* Cleanup (called on SDK destroy)
*/
destroy(): void;
}
//# sourceMappingURL=AntiSpamManager.d.ts.map