diff --git a/src/__tests__/surveys.test.ts b/src/__tests__/surveys.test.ts index 868df4860..defe94d2b 100644 --- a/src/__tests__/surveys.test.ts +++ b/src/__tests__/surveys.test.ts @@ -212,6 +212,16 @@ describe('surveys', () => { expect(instance._send_request).toHaveBeenCalledTimes(1) }) + it('posthog.reset() removes surveys tracking properties from storage', () => { + localStorage.setItem('seenSurvey_XYZ', '1') + localStorage.setItem('seenSurvey_ABC', '1') + localStorage.setItem('lastSeenSurveyDate', 'some date here') + surveys.reset() + expect(localStorage.getItem('lastSeenSurveyDate')).toBeNull() + expect(localStorage.getItem('seenSurvey_XYZ')).toBeNull() + expect(localStorage.getItem('seenSurvey_ABC')).toBeNull() + }) + it('getSurveys registers the survey event receiver if a survey has events', () => { surveysResponse = { surveys: surveysWithEvents } surveys.getSurveys((data) => { diff --git a/src/extensions/surveys/surveys-utils.tsx b/src/extensions/surveys/surveys-utils.tsx index 1a764d1d7..230651ab1 100644 --- a/src/extensions/surveys/surveys-utils.tsx +++ b/src/extensions/surveys/surveys-utils.tsx @@ -5,7 +5,7 @@ import { VNode, cloneElement, createContext } from 'preact' // We cast the types here which is dangerous but protected by the top level generateSurveys call const window = _window as Window & typeof globalThis const document = _document as Document - +const SurveySeenPrefix = 'seenSurvey_' export const style = (appearance: SurveyAppearance | null) => { const positions = { left: 'left: 30px;', @@ -648,14 +648,26 @@ export const getSurveySeen = (survey: Survey): boolean => { } export const getSurveySeenKey = (survey: Survey): string => { - let surveySeenKey = `seenSurvey_${survey.id}` + let surveySeenKey = `${SurveySeenPrefix}${survey.id}` if (survey.current_iteration && survey.current_iteration > 0) { - surveySeenKey = `seenSurvey_${survey.id}_${survey.current_iteration}` + surveySeenKey = `${SurveySeenPrefix}${survey.id}_${survey.current_iteration}` } return surveySeenKey } +export const getSurveySeenStorageKeys = (): string[] => { + const surveyKeys = [] + for (let i = 0; i < localStorage.length; i++) { + const key = localStorage.key(i) + if (key?.startsWith(SurveySeenPrefix)) { + surveyKeys.push(key) + } + } + + return surveyKeys +} + const getSurveyInteractionProperty = (survey: Survey, action: string): string => { let surveyProperty = `$survey_${action}/${survey.id}` if (survey.current_iteration && survey.current_iteration > 0) { diff --git a/src/posthog-core.ts b/src/posthog-core.ts index f101bb47c..2946b0a62 100644 --- a/src/posthog-core.ts +++ b/src/posthog-core.ts @@ -1513,6 +1513,7 @@ export class PostHog { this.consent.reset() this.persistence?.clear() this.sessionPersistence?.clear() + this.surveys?.reset() this.persistence?.set_property(USER_STATE, 'anonymous') this.sessionManager?.resetSessionId() const uuid = this.config.get_device_id(uuidv7()) diff --git a/src/posthog-surveys.ts b/src/posthog-surveys.ts index 21b85dd0e..f7c90952b 100644 --- a/src/posthog-surveys.ts +++ b/src/posthog-surveys.ts @@ -13,6 +13,7 @@ import { assignableWindow, document, window } from './utils/globals' import { DecideResponse } from './types' import { logger } from './utils/logger' import { isNullish } from './utils/type-utils' +import { getSurveySeenStorageKeys } from './extensions/surveys/surveys-utils' const LOGGER_PREFIX = '[Surveys]' @@ -73,6 +74,12 @@ export class PostHogSurveys { this.loadIfEnabled() } + reset(): void { + localStorage.removeItem('lastSeenSurveyDate') + const surveyKeys = getSurveySeenStorageKeys() + surveyKeys.forEach((key) => localStorage.removeItem(key)) + } + loadIfEnabled() { const surveysGenerator = assignableWindow?.__PosthogExtensions__?.generateSurveys @@ -287,7 +294,6 @@ export class PostHogSurveys { } this.getSurveys((surveys) => { const survey = surveys.filter((x) => x.id === surveyId)[0] - this._surveyManager.canRenderSurvey(survey) }) } @@ -299,7 +305,6 @@ export class PostHogSurveys { } this.getSurveys((surveys) => { const survey = surveys.filter((x) => x.id === surveyId)[0] - this._surveyManager.renderSurvey(survey, document?.querySelector(selector)) }) }