posthog-js 1.231.1 → 1.231.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/all-external-dependencies.js +1 -1
- package/dist/all-external-dependencies.js.map +1 -1
- package/dist/array.full.es5.js +1 -1
- package/dist/array.full.es5.js.map +1 -1
- package/dist/array.full.js +1 -1
- package/dist/array.full.js.map +1 -1
- package/dist/array.full.no-external.js +1 -1
- package/dist/array.full.no-external.js.map +1 -1
- package/dist/array.js +1 -1
- package/dist/array.no-external.js +1 -1
- package/dist/customizations.full.js +1 -1
- package/dist/main.js +1 -1
- package/dist/module.full.js +1 -1
- package/dist/module.full.js.map +1 -1
- package/dist/module.full.no-external.js +1 -1
- package/dist/module.full.no-external.js.map +1 -1
- package/dist/module.js +1 -1
- package/dist/module.no-external.js +1 -1
- package/dist/src/extensions/surveys.d.ts +3 -0
- package/dist/surveys-preview.js +1 -1
- package/dist/surveys-preview.js.map +1 -1
- package/dist/surveys.js +1 -1
- package/dist/surveys.js.map +1 -1
- package/lib/package.json +1 -1
- package/lib/src/extensions/surveys.d.ts +3 -0
- package/lib/src/extensions/surveys.jsx +35 -19
- package/lib/src/extensions/surveys.jsx.map +1 -1
- package/package.json +1 -1
package/lib/package.json
CHANGED
|
@@ -4,8 +4,10 @@ export declare function getNextSurveyStep(survey: Survey, currentQuestionIndex:
|
|
|
4
4
|
export declare class SurveyManager {
|
|
5
5
|
private posthog;
|
|
6
6
|
private surveyInFocus;
|
|
7
|
+
private surveyTimeouts;
|
|
7
8
|
constructor(posthog: PostHog);
|
|
8
9
|
private canShowNextEventBasedSurvey;
|
|
10
|
+
private clearSurveyTimeout;
|
|
9
11
|
private handlePopoverSurvey;
|
|
10
12
|
private handleWidget;
|
|
11
13
|
private handleWidgetSelector;
|
|
@@ -30,6 +32,7 @@ export declare class SurveyManager {
|
|
|
30
32
|
addSurveyToFocus: (id: string) => void;
|
|
31
33
|
removeSurveyFromFocus: (id: string) => void;
|
|
32
34
|
surveyInFocus: string | null;
|
|
35
|
+
surveyTimeouts: Map<string, NodeJS.Timeout>;
|
|
33
36
|
canShowNextEventBasedSurvey: () => boolean;
|
|
34
37
|
handleWidget: (survey: Survey) => void;
|
|
35
38
|
handlePopoverSurvey: (survey: Survey) => void;
|
|
@@ -143,6 +143,7 @@ export function getNextSurveyStep(survey, currentQuestionIndex, response) {
|
|
|
143
143
|
var SurveyManager = /** @class */ (function () {
|
|
144
144
|
function SurveyManager(posthog) {
|
|
145
145
|
var _this = this;
|
|
146
|
+
this.surveyTimeouts = new Map();
|
|
146
147
|
this.canShowNextEventBasedSurvey = function () {
|
|
147
148
|
var _a;
|
|
148
149
|
// with event based surveys, we need to show the next survey without reloading the page.
|
|
@@ -158,7 +159,7 @@ var SurveyManager = /** @class */ (function () {
|
|
|
158
159
|
return true;
|
|
159
160
|
};
|
|
160
161
|
this.handlePopoverSurvey = function (survey) {
|
|
161
|
-
var _a;
|
|
162
|
+
var _a, _b;
|
|
162
163
|
var surveyWaitPeriodInDays = (_a = survey.conditions) === null || _a === void 0 ? void 0 : _a.seenSurveyWaitPeriodInDays;
|
|
163
164
|
var lastSeenSurveyDate = localStorage.getItem("lastSeenSurveyDate");
|
|
164
165
|
if (!hasWaitPeriodPassed(lastSeenSurveyDate, surveyWaitPeriodInDays)) {
|
|
@@ -166,9 +167,21 @@ var SurveyManager = /** @class */ (function () {
|
|
|
166
167
|
}
|
|
167
168
|
var surveySeen = getSurveySeen(survey);
|
|
168
169
|
if (!surveySeen) {
|
|
170
|
+
_this.clearSurveyTimeout(survey.id);
|
|
169
171
|
_this.addSurveyToFocus(survey.id);
|
|
170
|
-
var
|
|
171
|
-
|
|
172
|
+
var delaySeconds = ((_b = survey.appearance) === null || _b === void 0 ? void 0 : _b.surveyPopupDelaySeconds) || 0;
|
|
173
|
+
var shadow_1 = createShadow(style(survey === null || survey === void 0 ? void 0 : survey.appearance), survey.id, undefined, _this.posthog);
|
|
174
|
+
if (delaySeconds <= 0) {
|
|
175
|
+
return Preact.render(<SurveyPopup key={'popover-survey'} posthog={_this.posthog} survey={survey} removeSurveyFromFocus={_this.removeSurveyFromFocus} isPopup={true}/>, shadow_1);
|
|
176
|
+
}
|
|
177
|
+
var timeoutId = setTimeout(function () {
|
|
178
|
+
if (!doesSurveyUrlMatch(survey)) {
|
|
179
|
+
return _this.removeSurveyFromFocus(survey.id);
|
|
180
|
+
}
|
|
181
|
+
// rendering with surveyPopupDelaySeconds = 0 because we're already handling the timeout here
|
|
182
|
+
Preact.render(<SurveyPopup key={'popover-survey'} posthog={_this.posthog} survey={__assign(__assign({}, survey), { appearance: __assign(__assign({}, survey.appearance), { surveyPopupDelaySeconds: 0 }) })} removeSurveyFromFocus={_this.removeSurveyFromFocus} isPopup={true}/>, shadow_1);
|
|
183
|
+
}, delaySeconds * 1000);
|
|
184
|
+
_this.surveyTimeouts.set(survey.id, timeoutId);
|
|
172
185
|
}
|
|
173
186
|
};
|
|
174
187
|
this.handleWidget = function (survey) {
|
|
@@ -289,12 +302,20 @@ var SurveyManager = /** @class */ (function () {
|
|
|
289
302
|
if (_this.surveyInFocus !== id) {
|
|
290
303
|
logger.error("Survey ".concat(id, " is not in focus. Cannot remove survey ").concat(id, "."));
|
|
291
304
|
}
|
|
305
|
+
_this.clearSurveyTimeout(id);
|
|
292
306
|
_this.surveyInFocus = null;
|
|
293
307
|
};
|
|
294
308
|
this.posthog = posthog;
|
|
295
309
|
// This is used to track the survey that is currently in focus. We only show one survey at a time.
|
|
296
310
|
this.surveyInFocus = null;
|
|
297
311
|
}
|
|
312
|
+
SurveyManager.prototype.clearSurveyTimeout = function (surveyId) {
|
|
313
|
+
var timeout = this.surveyTimeouts.get(surveyId);
|
|
314
|
+
if (timeout) {
|
|
315
|
+
clearTimeout(timeout);
|
|
316
|
+
this.surveyTimeouts.delete(surveyId);
|
|
317
|
+
}
|
|
318
|
+
};
|
|
298
319
|
/**
|
|
299
320
|
* Sorts surveys by their appearance delay in ascending order. If a survey does not have an appearance delay,
|
|
300
321
|
* it is considered to have a delay of 0.
|
|
@@ -310,6 +331,7 @@ var SurveyManager = /** @class */ (function () {
|
|
|
310
331
|
addSurveyToFocus: this.addSurveyToFocus,
|
|
311
332
|
removeSurveyFromFocus: this.removeSurveyFromFocus,
|
|
312
333
|
surveyInFocus: this.surveyInFocus,
|
|
334
|
+
surveyTimeouts: this.surveyTimeouts,
|
|
313
335
|
canShowNextEventBasedSurvey: this.canShowNextEventBasedSurvey,
|
|
314
336
|
handleWidget: this.handleWidget,
|
|
315
337
|
handlePopoverSurvey: this.handlePopoverSurvey,
|
|
@@ -457,7 +479,6 @@ export function usePopupVisibility(survey, posthog, millisecondDelay, isPreviewM
|
|
|
457
479
|
var showSurvey = function () {
|
|
458
480
|
var _a;
|
|
459
481
|
// check if the url is still matching, necessary for delayed surveys, as the URL may have changed
|
|
460
|
-
// since the survey was scheduled to appear
|
|
461
482
|
if (!doesSurveyUrlMatch(survey)) {
|
|
462
483
|
return;
|
|
463
484
|
}
|
|
@@ -480,30 +501,25 @@ export function usePopupVisibility(survey, posthog, millisecondDelay, isPreviewM
|
|
|
480
501
|
}
|
|
481
502
|
}, 100);
|
|
482
503
|
};
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
504
|
+
addEventListener(window, 'PHSurveyClosed', handleSurveyClosed);
|
|
505
|
+
addEventListener(window, 'PHSurveySent', handleSurveySent);
|
|
506
|
+
if (millisecondDelay > 0) {
|
|
507
|
+
// This path is only used for direct usage of SurveyPopup,
|
|
508
|
+
// not for surveys managed by SurveyManager
|
|
509
|
+
var timeoutId_1 = setTimeout(showSurvey, millisecondDelay);
|
|
487
510
|
return function () {
|
|
488
|
-
clearTimeout(
|
|
511
|
+
clearTimeout(timeoutId_1);
|
|
489
512
|
window.removeEventListener('PHSurveyClosed', handleSurveyClosed);
|
|
490
513
|
window.removeEventListener('PHSurveySent', handleSurveySent);
|
|
491
514
|
};
|
|
492
|
-
}
|
|
493
|
-
|
|
515
|
+
}
|
|
516
|
+
else {
|
|
517
|
+
// This is the path used for surveys managed by SurveyManager
|
|
494
518
|
showSurvey();
|
|
495
519
|
return function () {
|
|
496
520
|
window.removeEventListener('PHSurveyClosed', handleSurveyClosed);
|
|
497
521
|
window.removeEventListener('PHSurveySent', handleSurveySent);
|
|
498
522
|
};
|
|
499
|
-
};
|
|
500
|
-
addEventListener(window, 'PHSurveyClosed', handleSurveyClosed);
|
|
501
|
-
addEventListener(window, 'PHSurveySent', handleSurveySent);
|
|
502
|
-
if (millisecondDelay > 0) {
|
|
503
|
-
return handleShowSurveyWithDelay();
|
|
504
|
-
}
|
|
505
|
-
else {
|
|
506
|
-
return handleShowSurveyImmediately();
|
|
507
523
|
}
|
|
508
524
|
}, []);
|
|
509
525
|
useHideSurveyOnURLChange({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"surveys.jsx","sourceRoot":"","sources":["../../../src/extensions/surveys.tsx"],"names":[],"mappings":"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","sourcesContent":["import { PostHog } from '../posthog-core'\nimport { doesSurveyUrlMatch } from '../posthog-surveys'\nimport {\n Survey,\n SurveyAppearance,\n SurveyQuestion,\n SurveyQuestionBranchingType,\n SurveyQuestionType,\n SurveyRenderReason,\n SurveyType,\n} from '../posthog-surveys-types'\n\nimport * as Preact from 'preact'\nimport { useContext, useEffect, useMemo, useRef, useState } from 'preact/hooks'\nimport { addEventListener } from '../utils'\nimport { document as _document, window as _window } from '../utils/globals'\nimport { createLogger } from '../utils/logger'\nimport { isNull, isNumber } from '../utils/type-utils'\nimport { createWidgetShadow, createWidgetStyle } from './surveys-widget'\nimport { ConfirmationMessage } from './surveys/components/ConfirmationMessage'\nimport { Cancel } from './surveys/components/QuestionHeader'\nimport {\n LinkQuestion,\n MultipleChoiceQuestion,\n OpenTextQuestion,\n RatingQuestion,\n} from './surveys/components/QuestionTypes'\nimport {\n createShadow,\n defaultSurveyAppearance,\n dismissedSurveyEvent,\n getContrastingTextColor,\n getDisplayOrderQuestions,\n getSurveyResponseKey,\n getSurveySeen,\n hasWaitPeriodPassed,\n sendSurveyEvent,\n style,\n SURVEY_DEFAULT_Z_INDEX,\n SurveyContext,\n} from './surveys/surveys-utils'\nimport { prepareStylesheet } from './utils/stylesheet-loader'\nconst logger = createLogger('[Surveys]')\n\n// We cast the types here which is dangerous but protected by the top level generateSurveys call\nconst window = _window as Window & typeof globalThis\nconst document = _document as Document\n\nfunction getPosthogWidgetClass(surveyId: string) {\n return `.PostHogWidget${surveyId}`\n}\n\nfunction getRatingBucketForResponseValue(responseValue: number, scale: number) {\n if (scale === 3) {\n if (responseValue < 1 || responseValue > 3) {\n throw new Error('The response must be in range 1-3')\n }\n\n return responseValue === 1 ? 'negative' : responseValue === 2 ? 'neutral' : 'positive'\n } else if (scale === 5) {\n if (responseValue < 1 || responseValue > 5) {\n throw new Error('The response must be in range 1-5')\n }\n\n return responseValue <= 2 ? 'negative' : responseValue === 3 ? 'neutral' : 'positive'\n } else if (scale === 7) {\n if (responseValue < 1 || responseValue > 7) {\n throw new Error('The response must be in range 1-7')\n }\n\n return responseValue <= 3 ? 'negative' : responseValue === 4 ? 'neutral' : 'positive'\n } else if (scale === 10) {\n if (responseValue < 0 || responseValue > 10) {\n throw new Error('The response must be in range 0-10')\n }\n\n return responseValue <= 6 ? 'detractors' : responseValue <= 8 ? 'passives' : 'promoters'\n }\n\n throw new Error('The scale must be one of: 3, 5, 7, 10')\n}\n\nexport function getNextSurveyStep(\n survey: Survey,\n currentQuestionIndex: number,\n response: string | string[] | number | null\n) {\n const question = survey.questions[currentQuestionIndex]\n const nextQuestionIndex = currentQuestionIndex + 1\n\n if (!question.branching?.type) {\n if (currentQuestionIndex === survey.questions.length - 1) {\n return SurveyQuestionBranchingType.End\n }\n\n return nextQuestionIndex\n }\n\n if (question.branching.type === SurveyQuestionBranchingType.End) {\n return SurveyQuestionBranchingType.End\n } else if (question.branching.type === SurveyQuestionBranchingType.SpecificQuestion) {\n if (Number.isInteger(question.branching.index)) {\n return question.branching.index\n }\n } else if (question.branching.type === SurveyQuestionBranchingType.ResponseBased) {\n // Single choice\n if (question.type === SurveyQuestionType.SingleChoice) {\n // :KLUDGE: for now, look up the choiceIndex based on the response\n // TODO: once QuestionTypes.MultipleChoiceQuestion is refactored, pass the selected choiceIndex into this method\n const selectedChoiceIndex = question.choices.indexOf(`${response}`)\n\n if (question.branching?.responseValues?.hasOwnProperty(selectedChoiceIndex)) {\n const nextStep = question.branching.responseValues[selectedChoiceIndex]\n\n // Specific question\n if (Number.isInteger(nextStep)) {\n return nextStep\n }\n\n if (nextStep === SurveyQuestionBranchingType.End) {\n return SurveyQuestionBranchingType.End\n }\n\n return nextQuestionIndex\n }\n } else if (question.type === SurveyQuestionType.Rating) {\n if (typeof response !== 'number' || !Number.isInteger(response)) {\n throw new Error('The response type must be an integer')\n }\n\n const ratingBucket = getRatingBucketForResponseValue(response, question.scale)\n\n if (question.branching?.responseValues?.hasOwnProperty(ratingBucket)) {\n const nextStep = question.branching.responseValues[ratingBucket]\n\n // Specific question\n if (Number.isInteger(nextStep)) {\n return nextStep\n }\n\n if (nextStep === SurveyQuestionBranchingType.End) {\n return SurveyQuestionBranchingType.End\n }\n\n return nextQuestionIndex\n }\n }\n\n return nextQuestionIndex\n }\n\n logger.warn('Falling back to next question index due to unexpected branching type')\n return nextQuestionIndex\n}\n\nexport class SurveyManager {\n private posthog: PostHog\n private surveyInFocus: string | null\n\n constructor(posthog: PostHog) {\n this.posthog = posthog\n // This is used to track the survey that is currently in focus. We only show one survey at a time.\n this.surveyInFocus = null\n }\n\n private canShowNextEventBasedSurvey = (): boolean => {\n // with event based surveys, we need to show the next survey without reloading the page.\n // A simple check for div elements with the class name pattern of PostHogSurvey_xyz doesn't work here\n // because preact leaves behind the div element for any surveys responded/dismissed with a <style> node.\n // To alleviate this, we check the last div in the dom and see if it has any elements other than a Style node.\n // if the last PostHogSurvey_xyz div has only one style node, we can show the next survey in the queue\n // without reloading the page.\n const surveyPopups = document.querySelectorAll(`div[class^=PostHogSurvey]`)\n if (surveyPopups.length > 0) {\n return surveyPopups[surveyPopups.length - 1].shadowRoot?.childElementCount === 1\n }\n return true\n }\n\n private handlePopoverSurvey = (survey: Survey): void => {\n const surveyWaitPeriodInDays = survey.conditions?.seenSurveyWaitPeriodInDays\n const lastSeenSurveyDate = localStorage.getItem(`lastSeenSurveyDate`)\n\n if (!hasWaitPeriodPassed(lastSeenSurveyDate, surveyWaitPeriodInDays)) {\n return\n }\n\n const surveySeen = getSurveySeen(survey)\n if (!surveySeen) {\n this.addSurveyToFocus(survey.id)\n const shadow = createShadow(style(survey?.appearance), survey.id, undefined, this.posthog)\n Preact.render(\n <SurveyPopup\n key={'popover-survey'}\n posthog={this.posthog}\n survey={survey}\n removeSurveyFromFocus={this.removeSurveyFromFocus}\n isPopup={true}\n />,\n shadow\n )\n }\n }\n\n private handleWidget = (survey: Survey): void => {\n const shadow = createWidgetShadow(survey, this.posthog)\n\n const stylesheetContent = style(survey.appearance)\n const stylesheet = prepareStylesheet(document, stylesheetContent, this.posthog)\n\n if (stylesheet) {\n shadow.appendChild(stylesheet)\n }\n\n Preact.render(\n <FeedbackWidget\n key={'feedback-survey'}\n posthog={this.posthog}\n survey={survey}\n removeSurveyFromFocus={this.removeSurveyFromFocus}\n />,\n shadow\n )\n }\n\n private handleWidgetSelector = (survey: Survey): void => {\n const selectorOnPage =\n survey.appearance?.widgetSelector && document.querySelector(survey.appearance.widgetSelector)\n if (selectorOnPage) {\n if (document.querySelectorAll(`.PostHogWidget${survey.id}`).length === 0) {\n this.handleWidget(survey)\n } else if (document.querySelectorAll(`.PostHogWidget${survey.id}`).length === 1) {\n // we have to check if user selector already has a survey listener attached to it because we always have to check if it's on the page or not\n if (!selectorOnPage.getAttribute('PHWidgetSurveyClickListener')) {\n const surveyPopup = document\n .querySelector(getPosthogWidgetClass(survey.id))\n ?.shadowRoot?.querySelector(`.survey-form`) as HTMLFormElement\n\n addEventListener(selectorOnPage, 'click', () => {\n if (surveyPopup) {\n surveyPopup.style.display = surveyPopup.style.display === 'none' ? 'block' : 'none'\n addEventListener(surveyPopup, 'PHSurveyClosed', () => {\n this.removeSurveyFromFocus(survey.id)\n surveyPopup.style.display = 'none'\n })\n }\n })\n\n selectorOnPage.setAttribute('PHWidgetSurveyClickListener', 'true')\n }\n }\n }\n }\n\n /**\n * Sorts surveys by their appearance delay in ascending order. If a survey does not have an appearance delay,\n * it is considered to have a delay of 0.\n * @param surveys\n * @returns The surveys sorted by their appearance delay\n */\n private sortSurveysByAppearanceDelay(surveys: Survey[]): Survey[] {\n return surveys.sort(\n (a, b) => (a.appearance?.surveyPopupDelaySeconds || 0) - (b.appearance?.surveyPopupDelaySeconds || 0)\n )\n }\n\n /**\n * Checks the feature flags associated with this Survey to see if the survey can be rendered.\n * @param survey\n * @param instance\n */\n public canRenderSurvey = (survey: Survey): SurveyRenderReason => {\n const renderReason: SurveyRenderReason = {\n visible: false,\n }\n\n if (survey.end_date) {\n renderReason.disabledReason = `survey was completed on ${survey.end_date}`\n return renderReason\n }\n\n if (survey.type != SurveyType.Popover) {\n renderReason.disabledReason = `Only Popover survey types can be rendered`\n return renderReason\n }\n\n const linkedFlagCheck = survey.linked_flag_key\n ? this.posthog.featureFlags.isFeatureEnabled(survey.linked_flag_key)\n : true\n\n if (!linkedFlagCheck) {\n renderReason.disabledReason = `linked feature flag ${survey.linked_flag_key} is false`\n return renderReason\n }\n\n const targetingFlagCheck = survey.targeting_flag_key\n ? this.posthog.featureFlags.isFeatureEnabled(survey.targeting_flag_key)\n : true\n\n if (!targetingFlagCheck) {\n renderReason.disabledReason = `targeting feature flag ${survey.targeting_flag_key} is false`\n return renderReason\n }\n\n const internalTargetingFlagCheck = survey.internal_targeting_flag_key\n ? this.posthog.featureFlags.isFeatureEnabled(survey.internal_targeting_flag_key)\n : true\n\n if (!internalTargetingFlagCheck) {\n renderReason.disabledReason = `internal targeting feature flag ${survey.internal_targeting_flag_key} is false`\n return renderReason\n }\n\n renderReason.visible = true\n return renderReason\n }\n\n public renderSurvey = (survey: Survey, selector: Element): void => {\n Preact.render(\n <SurveyPopup\n key={'popover-survey'}\n posthog={this.posthog}\n survey={survey}\n removeSurveyFromFocus={this.removeSurveyFromFocus}\n isPopup={false}\n />,\n selector\n )\n }\n\n public callSurveysAndEvaluateDisplayLogic = (forceReload: boolean = false): void => {\n this.posthog?.getActiveMatchingSurveys((surveys) => {\n const nonAPISurveys = surveys.filter((survey) => survey.type !== 'api')\n\n // Create a queue of surveys sorted by their appearance delay. We will evaluate the display logic\n // for each survey in the queue in order, and only display one survey at a time.\n const nonAPISurveyQueue = this.sortSurveysByAppearanceDelay(nonAPISurveys)\n\n nonAPISurveyQueue.forEach((survey) => {\n // We only evaluate the display logic for one survey at a time\n if (!isNull(this.surveyInFocus)) {\n return\n }\n if (survey.type === SurveyType.Widget) {\n if (\n survey.appearance?.widgetType === 'tab' &&\n document.querySelectorAll(`.PostHogWidget${survey.id}`).length === 0\n ) {\n this.handleWidget(survey)\n }\n if (survey.appearance?.widgetType === 'selector' && survey.appearance?.widgetSelector) {\n this.handleWidgetSelector(survey)\n }\n }\n\n if (survey.type === SurveyType.Popover && this.canShowNextEventBasedSurvey()) {\n this.handlePopoverSurvey(survey)\n }\n })\n }, forceReload)\n }\n\n private addSurveyToFocus = (id: string): void => {\n if (!isNull(this.surveyInFocus)) {\n logger.error(`Survey ${[...this.surveyInFocus]} already in focus. Cannot add survey ${id}.`)\n }\n this.surveyInFocus = id\n }\n\n private removeSurveyFromFocus = (id: string): void => {\n if (this.surveyInFocus !== id) {\n logger.error(`Survey ${id} is not in focus. Cannot remove survey ${id}.`)\n }\n this.surveyInFocus = null\n }\n\n // Expose internal state and methods for testing\n public getTestAPI() {\n return {\n addSurveyToFocus: this.addSurveyToFocus,\n removeSurveyFromFocus: this.removeSurveyFromFocus,\n surveyInFocus: this.surveyInFocus,\n canShowNextEventBasedSurvey: this.canShowNextEventBasedSurvey,\n handleWidget: this.handleWidget,\n handlePopoverSurvey: this.handlePopoverSurvey,\n handleWidgetSelector: this.handleWidgetSelector,\n sortSurveysByAppearanceDelay: this.sortSurveysByAppearanceDelay,\n }\n }\n}\n\nexport const renderSurveysPreview = ({\n survey,\n parentElement,\n previewPageIndex,\n forceDisableHtml,\n onPreviewSubmit,\n posthog,\n}: {\n survey: Survey\n parentElement: HTMLElement\n previewPageIndex: number\n forceDisableHtml?: boolean\n onPreviewSubmit?: (res: string | string[] | number | null) => void\n posthog?: PostHog\n}) => {\n const stylesheetContent = style(survey.appearance)\n const stylesheet = prepareStylesheet(document, stylesheetContent, posthog)\n\n // Remove previously attached <style>\n Array.from(parentElement.children).forEach((child) => {\n if (child instanceof HTMLStyleElement) {\n parentElement.removeChild(child)\n }\n })\n\n if (stylesheet) {\n parentElement.appendChild(stylesheet)\n }\n\n const textColor = getContrastingTextColor(\n survey.appearance?.backgroundColor || defaultSurveyAppearance.backgroundColor || 'white'\n )\n\n Preact.render(\n <SurveyPopup\n key=\"surveys-render-preview\"\n survey={survey}\n forceDisableHtml={forceDisableHtml}\n style={{\n position: 'relative',\n right: 0,\n borderBottom: `1px solid ${survey.appearance?.borderColor}`,\n borderRadius: 10,\n color: textColor,\n }}\n onPreviewSubmit={onPreviewSubmit}\n previewPageIndex={previewPageIndex}\n removeSurveyFromFocus={() => {}}\n isPopup={true}\n />,\n parentElement\n )\n}\n\nexport const renderFeedbackWidgetPreview = ({\n survey,\n root,\n forceDisableHtml,\n posthog,\n}: {\n survey: Survey\n root: HTMLElement\n forceDisableHtml?: boolean\n posthog?: PostHog\n}) => {\n const stylesheetContent = createWidgetStyle(survey.appearance?.widgetColor)\n const stylesheet = prepareStylesheet(document, stylesheetContent, posthog)\n if (stylesheet) {\n root.appendChild(stylesheet)\n }\n\n Preact.render(\n <FeedbackWidget\n key={'feedback-render-preview'}\n forceDisableHtml={forceDisableHtml}\n survey={survey}\n readOnly={true}\n removeSurveyFromFocus={() => {}}\n />,\n root\n )\n}\n\n// This is the main exported function\nexport function generateSurveys(posthog: PostHog) {\n // NOTE: Important to ensure we never try and run surveys without a window environment\n if (!document || !window) {\n return\n }\n\n const surveyManager = new SurveyManager(posthog)\n surveyManager.callSurveysAndEvaluateDisplayLogic(true)\n\n // recalculate surveys every second to check if URL or selectors have changed\n setInterval(() => {\n surveyManager.callSurveysAndEvaluateDisplayLogic(false)\n }, 1000)\n return surveyManager\n}\n\ntype UseHideSurveyOnURLChangeProps = {\n survey: Pick<Survey, 'id' | 'conditions'>\n removeSurveyFromFocus: (id: string) => void\n setSurveyVisible: (visible: boolean) => void\n isPreviewMode?: boolean\n}\n\n/**\n * This hook handles URL-based survey visibility after the initial mount.\n * The initial URL check is handled by the `getActiveMatchingSurveys` method in the `PostHogSurveys` class,\n * which ensures the URL matches before displaying a survey for the first time.\n * That is the method that is called every second to see if there's a matching survey.\n *\n * This separation of concerns means:\n * 1. Initial URL matching is done by `getActiveMatchingSurveys` before displaying the survey\n * 2. Subsequent URL changes are handled here to hide the survey as the user navigates\n */\nexport function useHideSurveyOnURLChange({\n survey,\n removeSurveyFromFocus,\n setSurveyVisible,\n isPreviewMode = false,\n}: UseHideSurveyOnURLChangeProps) {\n useEffect(() => {\n if (isPreviewMode || !survey.conditions?.url) {\n return\n }\n\n const checkUrlMatch = () => {\n const urlCheck = doesSurveyUrlMatch(survey)\n if (!urlCheck) {\n setSurveyVisible(false)\n return removeSurveyFromFocus(survey.id)\n }\n }\n\n // Listen for browser back/forward browser history changes\n addEventListener(window, 'popstate', checkUrlMatch)\n // Listen for hash changes, for SPA frameworks that use hash-based routing\n // The hashchange event is fired when the fragment identifier of the URL has changed (the part of the URL beginning with and following the # symbol).\n addEventListener(window, 'hashchange', checkUrlMatch)\n\n // Listen for SPA navigation\n const originalPushState = window.history.pushState\n const originalReplaceState = window.history.replaceState\n\n window.history.pushState = function (...args) {\n originalPushState.apply(this, args)\n checkUrlMatch()\n }\n\n window.history.replaceState = function (...args) {\n originalReplaceState.apply(this, args)\n checkUrlMatch()\n }\n\n return () => {\n window.removeEventListener('popstate', checkUrlMatch)\n window.removeEventListener('hashchange', checkUrlMatch)\n window.history.pushState = originalPushState\n window.history.replaceState = originalReplaceState\n }\n }, [isPreviewMode, survey, removeSurveyFromFocus, setSurveyVisible])\n}\n\nexport function usePopupVisibility(\n survey: Survey,\n posthog: PostHog | undefined,\n millisecondDelay: number,\n isPreviewMode: boolean,\n removeSurveyFromFocus: (id: string) => void\n) {\n const [isPopupVisible, setIsPopupVisible] = useState(isPreviewMode || millisecondDelay === 0)\n const [isSurveySent, setIsSurveySent] = useState(false)\n\n useEffect(() => {\n if (!posthog) {\n logger.error('usePopupVisibility hook called without a PostHog instance.')\n return\n }\n if (isPreviewMode) {\n return\n }\n\n const handleSurveyClosed = () => {\n removeSurveyFromFocus(survey.id)\n setIsPopupVisible(false)\n }\n\n const handleSurveySent = () => {\n if (!survey.appearance?.displayThankYouMessage) {\n removeSurveyFromFocus(survey.id)\n setIsPopupVisible(false)\n } else {\n setIsSurveySent(true)\n removeSurveyFromFocus(survey.id)\n if (survey.appearance?.autoDisappear) {\n setTimeout(() => {\n setIsPopupVisible(false)\n }, 5000)\n }\n }\n }\n\n const showSurvey = () => {\n // check if the url is still matching, necessary for delayed surveys, as the URL may have changed\n // since the survey was scheduled to appear\n if (!doesSurveyUrlMatch(survey)) {\n return\n }\n\n setIsPopupVisible(true)\n window.dispatchEvent(new Event('PHSurveyShown'))\n posthog.capture('survey shown', {\n $survey_name: survey.name,\n $survey_id: survey.id,\n $survey_iteration: survey.current_iteration,\n $survey_iteration_start_date: survey.current_iteration_start_date,\n sessionRecordingUrl: posthog.get_session_replay_url?.(),\n })\n localStorage.setItem('lastSeenSurveyDate', new Date().toISOString())\n setTimeout(() => {\n const inputField = document\n .querySelector(getPosthogWidgetClass(survey.id))\n ?.shadowRoot?.querySelector('textarea, input[type=\"text\"]') as HTMLElement\n if (inputField) {\n inputField.focus()\n }\n }, 100)\n }\n\n const handleShowSurveyWithDelay = () => {\n const timeoutId = setTimeout(() => {\n showSurvey()\n }, millisecondDelay)\n\n return () => {\n clearTimeout(timeoutId)\n window.removeEventListener('PHSurveyClosed', handleSurveyClosed)\n window.removeEventListener('PHSurveySent', handleSurveySent)\n }\n }\n\n const handleShowSurveyImmediately = () => {\n showSurvey()\n return () => {\n window.removeEventListener('PHSurveyClosed', handleSurveyClosed)\n window.removeEventListener('PHSurveySent', handleSurveySent)\n }\n }\n\n addEventListener(window, 'PHSurveyClosed', handleSurveyClosed)\n addEventListener(window, 'PHSurveySent', handleSurveySent)\n\n if (millisecondDelay > 0) {\n return handleShowSurveyWithDelay()\n } else {\n return handleShowSurveyImmediately()\n }\n }, [])\n\n useHideSurveyOnURLChange({\n survey,\n removeSurveyFromFocus,\n setSurveyVisible: setIsPopupVisible,\n isPreviewMode,\n })\n\n return { isPopupVisible, isSurveySent, setIsPopupVisible }\n}\n\ninterface SurveyPopupProps {\n survey: Survey\n forceDisableHtml?: boolean\n posthog?: PostHog\n style?: React.CSSProperties\n previewPageIndex?: number | undefined\n removeSurveyFromFocus: (id: string) => void\n isPopup?: boolean\n onPreviewSubmit?: (res: string | string[] | number | null) => void\n onPopupSurveyDismissed?: () => void\n onPopupSurveySent?: () => void\n}\n\nexport function SurveyPopup({\n survey,\n forceDisableHtml,\n posthog,\n style,\n previewPageIndex,\n removeSurveyFromFocus,\n isPopup,\n onPreviewSubmit = () => {},\n onPopupSurveyDismissed = () => {},\n onPopupSurveySent = () => {},\n}: SurveyPopupProps) {\n const isPreviewMode = Number.isInteger(previewPageIndex)\n // NB: The client-side code passes the millisecondDelay in seconds, but setTimeout expects milliseconds, so we multiply by 1000\n const surveyPopupDelayMilliseconds = survey.appearance?.surveyPopupDelaySeconds\n ? survey.appearance.surveyPopupDelaySeconds * 1000\n : 0\n const { isPopupVisible, isSurveySent, setIsPopupVisible } = usePopupVisibility(\n survey,\n posthog,\n surveyPopupDelayMilliseconds,\n isPreviewMode,\n removeSurveyFromFocus\n )\n const shouldShowConfirmation = isSurveySent || previewPageIndex === survey.questions.length\n const confirmationBoxLeftStyle = style?.left && isNumber(style?.left) ? { left: style.left - 40 } : {}\n\n if (isPreviewMode) {\n style = style || {}\n style.left = 'unset'\n style.right = 'unset'\n style.transform = 'unset'\n }\n\n return isPopupVisible ? (\n <SurveyContext.Provider\n value={{\n isPreviewMode,\n previewPageIndex: previewPageIndex,\n onPopupSurveyDismissed: () => {\n dismissedSurveyEvent(survey, posthog, isPreviewMode)\n onPopupSurveyDismissed()\n },\n isPopup: isPopup || false,\n onPreviewSubmit,\n onPopupSurveySent: () => {\n onPopupSurveySent()\n },\n }}\n >\n {!shouldShowConfirmation ? (\n <Questions\n survey={survey}\n forceDisableHtml={!!forceDisableHtml}\n posthog={posthog}\n styleOverrides={style}\n />\n ) : (\n <ConfirmationMessage\n header={survey.appearance?.thankYouMessageHeader || 'Thank you!'}\n description={survey.appearance?.thankYouMessageDescription || ''}\n forceDisableHtml={!!forceDisableHtml}\n contentType={survey.appearance?.thankYouMessageDescriptionContentType}\n appearance={survey.appearance || defaultSurveyAppearance}\n styleOverrides={{ ...style, ...confirmationBoxLeftStyle }}\n onClose={() => setIsPopupVisible(false)}\n />\n )}\n </SurveyContext.Provider>\n ) : null\n}\n\nexport function Questions({\n survey,\n forceDisableHtml,\n posthog,\n styleOverrides,\n}: {\n survey: Survey\n forceDisableHtml: boolean\n posthog?: PostHog\n styleOverrides?: React.CSSProperties\n}) {\n const textColor = getContrastingTextColor(\n survey.appearance?.backgroundColor || defaultSurveyAppearance.backgroundColor\n )\n const [questionsResponses, setQuestionsResponses] = useState({})\n const { previewPageIndex, onPopupSurveyDismissed, isPopup, onPreviewSubmit, onPopupSurveySent } =\n useContext(SurveyContext)\n const [currentQuestionIndex, setCurrentQuestionIndex] = useState(previewPageIndex || 0)\n const surveyQuestions = useMemo(() => getDisplayOrderQuestions(survey), [survey])\n\n // Sync preview state\n useEffect(() => {\n setCurrentQuestionIndex(previewPageIndex ?? 0)\n }, [previewPageIndex])\n\n const onNextButtonClick = ({\n res,\n displayQuestionIndex,\n questionId,\n }: {\n res: string | string[] | number | null\n displayQuestionIndex: number\n questionId?: string\n }) => {\n if (!posthog) {\n logger.error('onNextButtonClick called without a PostHog instance.')\n return\n }\n\n if (!questionId) {\n logger.error('onNextButtonClick called without a questionId.')\n return\n }\n\n const responseKey = getSurveyResponseKey(questionId)\n\n setQuestionsResponses({ ...questionsResponses, [responseKey]: res })\n\n const nextStep = getNextSurveyStep(survey, displayQuestionIndex, res)\n if (nextStep === SurveyQuestionBranchingType.End) {\n sendSurveyEvent({ ...questionsResponses, [responseKey]: res }, survey, posthog)\n onPopupSurveySent()\n } else {\n setCurrentQuestionIndex(nextStep)\n }\n }\n\n return (\n <form\n className=\"survey-form\"\n style={\n isPopup\n ? {\n color: textColor,\n borderColor: survey.appearance?.borderColor,\n ...styleOverrides,\n }\n : {}\n }\n >\n {surveyQuestions.map((question, displayQuestionIndex) => {\n const isVisible = currentQuestionIndex === displayQuestionIndex\n return (\n isVisible && (\n <div\n className=\"survey-box\"\n style={\n isPopup\n ? {\n backgroundColor:\n survey.appearance?.backgroundColor ||\n defaultSurveyAppearance.backgroundColor,\n }\n : {}\n }\n >\n {isPopup && (\n <Cancel\n onClick={() => {\n onPopupSurveyDismissed()\n }}\n />\n )}\n {getQuestionComponent({\n question,\n forceDisableHtml,\n displayQuestionIndex,\n appearance: survey.appearance || defaultSurveyAppearance,\n onSubmit: (res) =>\n onNextButtonClick({\n res,\n displayQuestionIndex,\n questionId: question.id,\n }),\n onPreviewSubmit,\n })}\n </div>\n )\n )\n })}\n </form>\n )\n}\n\nexport function FeedbackWidget({\n survey,\n forceDisableHtml,\n posthog,\n readOnly,\n removeSurveyFromFocus,\n}: {\n survey: Survey\n forceDisableHtml?: boolean\n posthog?: PostHog\n readOnly?: boolean\n removeSurveyFromFocus: (id: string) => void\n}): JSX.Element | null {\n const [isFeedbackButtonVisible, setIsFeedbackButtonVisible] = useState(true)\n const [showSurvey, setShowSurvey] = useState(false)\n const [styleOverrides, setStyle] = useState({})\n const widgetRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (!posthog) {\n logger.error('FeedbackWidget called without a PostHog instance.')\n return\n }\n if (readOnly) {\n return\n }\n\n if (survey.appearance?.widgetType === 'tab') {\n if (widgetRef.current) {\n const widgetPos = widgetRef.current.getBoundingClientRect()\n const style = {\n top: '50%',\n left: parseInt(`${widgetPos.right - 360}`),\n bottom: 'auto',\n borderRadius: 10,\n borderBottom: `1.5px solid ${survey.appearance?.borderColor || '#c9c6c6'}`,\n }\n setStyle(style)\n }\n }\n if (survey.appearance?.widgetType === 'selector') {\n const widget = document.querySelector(survey.appearance.widgetSelector || '') ?? undefined\n\n addEventListener(widget, 'click', (event) => {\n // Calculate position based on the selector button\n const buttonRect = (event.currentTarget as HTMLElement).getBoundingClientRect()\n const viewportHeight = window.innerHeight\n\n // Get survey width from maxWidth or default to 300px\n const surveyWidth = parseInt(survey.appearance?.maxWidth || '300')\n\n // Calculate horizontal center position of the button\n const buttonCenterX = buttonRect.left + buttonRect.width / 2\n\n // Calculate horizontal center position\n let left = buttonCenterX - surveyWidth / 2\n\n // Ensure the survey doesn't go off-screen horizontally\n const rightEdge = left + surveyWidth\n if (rightEdge > window.innerWidth) {\n left = window.innerWidth - surveyWidth - 20 // 20px padding from right edge\n }\n if (left < 20) {\n left = 20 // 20px padding from left edge\n }\n\n // Determine if we should show above or below\n let showAbove = false\n\n // Check if there's enough space below (need at least 300px)\n // If not enough space below, show above\n if (buttonRect.bottom + 300 > viewportHeight) {\n showAbove = true\n }\n\n // Simple spacing between button and survey\n const spacing = 12\n\n // Calculate positions\n let topPosition\n\n if (showAbove) {\n // Problem: When showing above, we're trying to position based on an estimated height,\n // but we don't know the actual height of the survey yet.\n // Solution: Instead of using top positioning for above, use bottom positioning\n // This will anchor the survey to the bottom edge at the button's top position\n topPosition = null // We'll use bottom positioning instead\n } else {\n // When showing below, position the top of the survey below the button plus spacing\n topPosition = buttonRect.bottom + window.scrollY + spacing\n }\n\n // Set style overrides for positioning\n setStyle({\n position: 'fixed',\n top: showAbove ? 'auto' : topPosition + 'px',\n left: left + 'px',\n right: 'auto',\n bottom: showAbove ? window.innerHeight - buttonRect.top + spacing + 'px' : 'auto',\n transform: 'none',\n border: `1.5px solid ${survey.appearance?.borderColor || '#c9c6c6'}`,\n borderRadius: '10px',\n width: `${surveyWidth}px`,\n zIndex: SURVEY_DEFAULT_Z_INDEX,\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n maxHeight: showAbove\n ? `calc(100vh - 40px - ${spacing * 2}px)`\n : `calc(100vh - ${topPosition}px - 20px)`,\n })\n\n setShowSurvey(!showSurvey)\n })\n\n widget?.setAttribute('PHWidgetSurveyClickListener', 'true')\n }\n }, [])\n\n useHideSurveyOnURLChange({\n survey,\n removeSurveyFromFocus,\n setSurveyVisible: setIsFeedbackButtonVisible,\n })\n\n if (!isFeedbackButtonVisible) {\n return null\n }\n\n const resetShowSurvey = () => {\n setShowSurvey(false)\n }\n\n return (\n <Preact.Fragment>\n {survey.appearance?.widgetType === 'tab' && (\n <div\n className=\"ph-survey-widget-tab\"\n ref={widgetRef}\n onClick={() => !readOnly && setShowSurvey(!showSurvey)}\n style={{ color: getContrastingTextColor(survey.appearance.widgetColor) }}\n >\n <div className=\"ph-survey-widget-tab-icon\"></div>\n {survey.appearance?.widgetLabel || ''}\n </div>\n )}\n {showSurvey && (\n <SurveyPopup\n key={'feedback-widget-survey'}\n posthog={posthog}\n survey={survey}\n forceDisableHtml={forceDisableHtml}\n style={styleOverrides}\n removeSurveyFromFocus={removeSurveyFromFocus}\n isPopup={true}\n onPopupSurveyDismissed={resetShowSurvey}\n onPopupSurveySent={resetShowSurvey}\n />\n )}\n </Preact.Fragment>\n )\n}\n\ninterface GetQuestionComponentProps {\n question: SurveyQuestion\n forceDisableHtml: boolean\n displayQuestionIndex: number\n appearance: SurveyAppearance\n onSubmit: (res: string | string[] | number | null) => void\n onPreviewSubmit: (res: string | string[] | number | null) => void\n}\n\nconst getQuestionComponent = ({\n question,\n forceDisableHtml,\n displayQuestionIndex,\n appearance,\n onSubmit,\n onPreviewSubmit,\n}: GetQuestionComponentProps): JSX.Element => {\n const questionComponents = {\n [SurveyQuestionType.Open]: OpenTextQuestion,\n [SurveyQuestionType.Link]: LinkQuestion,\n [SurveyQuestionType.Rating]: RatingQuestion,\n [SurveyQuestionType.SingleChoice]: MultipleChoiceQuestion,\n [SurveyQuestionType.MultipleChoice]: MultipleChoiceQuestion,\n }\n\n const commonProps = {\n question,\n forceDisableHtml,\n appearance,\n onPreviewSubmit: (res: string | string[] | number | null) => {\n onPreviewSubmit(res)\n },\n onSubmit: (res: string | string[] | number | null) => {\n onSubmit(res)\n },\n }\n\n const additionalProps: Record<SurveyQuestionType, any> = {\n [SurveyQuestionType.Open]: {},\n [SurveyQuestionType.Link]: {},\n [SurveyQuestionType.Rating]: { displayQuestionIndex },\n [SurveyQuestionType.SingleChoice]: { displayQuestionIndex },\n [SurveyQuestionType.MultipleChoice]: { displayQuestionIndex },\n }\n\n const Component = questionComponents[question.type]\n const componentProps = { ...commonProps, ...additionalProps[question.type] }\n\n return <Component {...componentProps} />\n}\n"]}
|
|
1
|
+
{"version":3,"file":"surveys.jsx","sourceRoot":"","sources":["../../../src/extensions/surveys.tsx"],"names":[],"mappings":"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","sourcesContent":["import { PostHog } from '../posthog-core'\nimport { doesSurveyUrlMatch } from '../posthog-surveys'\nimport {\n Survey,\n SurveyAppearance,\n SurveyQuestion,\n SurveyQuestionBranchingType,\n SurveyQuestionType,\n SurveyRenderReason,\n SurveyType,\n} from '../posthog-surveys-types'\n\nimport * as Preact from 'preact'\nimport { useContext, useEffect, useMemo, useRef, useState } from 'preact/hooks'\nimport { addEventListener } from '../utils'\nimport { document as _document, window as _window } from '../utils/globals'\nimport { createLogger } from '../utils/logger'\nimport { isNull, isNumber } from '../utils/type-utils'\nimport { createWidgetShadow, createWidgetStyle } from './surveys-widget'\nimport { ConfirmationMessage } from './surveys/components/ConfirmationMessage'\nimport { Cancel } from './surveys/components/QuestionHeader'\nimport {\n LinkQuestion,\n MultipleChoiceQuestion,\n OpenTextQuestion,\n RatingQuestion,\n} from './surveys/components/QuestionTypes'\nimport {\n createShadow,\n defaultSurveyAppearance,\n dismissedSurveyEvent,\n getContrastingTextColor,\n getDisplayOrderQuestions,\n getSurveyResponseKey,\n getSurveySeen,\n hasWaitPeriodPassed,\n sendSurveyEvent,\n style,\n SURVEY_DEFAULT_Z_INDEX,\n SurveyContext,\n} from './surveys/surveys-utils'\nimport { prepareStylesheet } from './utils/stylesheet-loader'\nconst logger = createLogger('[Surveys]')\n\n// We cast the types here which is dangerous but protected by the top level generateSurveys call\nconst window = _window as Window & typeof globalThis\nconst document = _document as Document\n\nfunction getPosthogWidgetClass(surveyId: string) {\n return `.PostHogWidget${surveyId}`\n}\n\nfunction getRatingBucketForResponseValue(responseValue: number, scale: number) {\n if (scale === 3) {\n if (responseValue < 1 || responseValue > 3) {\n throw new Error('The response must be in range 1-3')\n }\n\n return responseValue === 1 ? 'negative' : responseValue === 2 ? 'neutral' : 'positive'\n } else if (scale === 5) {\n if (responseValue < 1 || responseValue > 5) {\n throw new Error('The response must be in range 1-5')\n }\n\n return responseValue <= 2 ? 'negative' : responseValue === 3 ? 'neutral' : 'positive'\n } else if (scale === 7) {\n if (responseValue < 1 || responseValue > 7) {\n throw new Error('The response must be in range 1-7')\n }\n\n return responseValue <= 3 ? 'negative' : responseValue === 4 ? 'neutral' : 'positive'\n } else if (scale === 10) {\n if (responseValue < 0 || responseValue > 10) {\n throw new Error('The response must be in range 0-10')\n }\n\n return responseValue <= 6 ? 'detractors' : responseValue <= 8 ? 'passives' : 'promoters'\n }\n\n throw new Error('The scale must be one of: 3, 5, 7, 10')\n}\n\nexport function getNextSurveyStep(\n survey: Survey,\n currentQuestionIndex: number,\n response: string | string[] | number | null\n) {\n const question = survey.questions[currentQuestionIndex]\n const nextQuestionIndex = currentQuestionIndex + 1\n\n if (!question.branching?.type) {\n if (currentQuestionIndex === survey.questions.length - 1) {\n return SurveyQuestionBranchingType.End\n }\n\n return nextQuestionIndex\n }\n\n if (question.branching.type === SurveyQuestionBranchingType.End) {\n return SurveyQuestionBranchingType.End\n } else if (question.branching.type === SurveyQuestionBranchingType.SpecificQuestion) {\n if (Number.isInteger(question.branching.index)) {\n return question.branching.index\n }\n } else if (question.branching.type === SurveyQuestionBranchingType.ResponseBased) {\n // Single choice\n if (question.type === SurveyQuestionType.SingleChoice) {\n // :KLUDGE: for now, look up the choiceIndex based on the response\n // TODO: once QuestionTypes.MultipleChoiceQuestion is refactored, pass the selected choiceIndex into this method\n const selectedChoiceIndex = question.choices.indexOf(`${response}`)\n\n if (question.branching?.responseValues?.hasOwnProperty(selectedChoiceIndex)) {\n const nextStep = question.branching.responseValues[selectedChoiceIndex]\n\n // Specific question\n if (Number.isInteger(nextStep)) {\n return nextStep\n }\n\n if (nextStep === SurveyQuestionBranchingType.End) {\n return SurveyQuestionBranchingType.End\n }\n\n return nextQuestionIndex\n }\n } else if (question.type === SurveyQuestionType.Rating) {\n if (typeof response !== 'number' || !Number.isInteger(response)) {\n throw new Error('The response type must be an integer')\n }\n\n const ratingBucket = getRatingBucketForResponseValue(response, question.scale)\n\n if (question.branching?.responseValues?.hasOwnProperty(ratingBucket)) {\n const nextStep = question.branching.responseValues[ratingBucket]\n\n // Specific question\n if (Number.isInteger(nextStep)) {\n return nextStep\n }\n\n if (nextStep === SurveyQuestionBranchingType.End) {\n return SurveyQuestionBranchingType.End\n }\n\n return nextQuestionIndex\n }\n }\n\n return nextQuestionIndex\n }\n\n logger.warn('Falling back to next question index due to unexpected branching type')\n return nextQuestionIndex\n}\n\nexport class SurveyManager {\n private posthog: PostHog\n private surveyInFocus: string | null\n private surveyTimeouts: Map<string, NodeJS.Timeout> = new Map()\n\n constructor(posthog: PostHog) {\n this.posthog = posthog\n // This is used to track the survey that is currently in focus. We only show one survey at a time.\n this.surveyInFocus = null\n }\n\n private canShowNextEventBasedSurvey = (): boolean => {\n // with event based surveys, we need to show the next survey without reloading the page.\n // A simple check for div elements with the class name pattern of PostHogSurvey_xyz doesn't work here\n // because preact leaves behind the div element for any surveys responded/dismissed with a <style> node.\n // To alleviate this, we check the last div in the dom and see if it has any elements other than a Style node.\n // if the last PostHogSurvey_xyz div has only one style node, we can show the next survey in the queue\n // without reloading the page.\n const surveyPopups = document.querySelectorAll(`div[class^=PostHogSurvey]`)\n if (surveyPopups.length > 0) {\n return surveyPopups[surveyPopups.length - 1].shadowRoot?.childElementCount === 1\n }\n return true\n }\n\n private clearSurveyTimeout(surveyId: string) {\n const timeout = this.surveyTimeouts.get(surveyId)\n if (timeout) {\n clearTimeout(timeout)\n this.surveyTimeouts.delete(surveyId)\n }\n }\n\n private handlePopoverSurvey = (survey: Survey): void => {\n const surveyWaitPeriodInDays = survey.conditions?.seenSurveyWaitPeriodInDays\n const lastSeenSurveyDate = localStorage.getItem(`lastSeenSurveyDate`)\n\n if (!hasWaitPeriodPassed(lastSeenSurveyDate, surveyWaitPeriodInDays)) {\n return\n }\n\n const surveySeen = getSurveySeen(survey)\n if (!surveySeen) {\n this.clearSurveyTimeout(survey.id)\n this.addSurveyToFocus(survey.id)\n const delaySeconds = survey.appearance?.surveyPopupDelaySeconds || 0\n const shadow = createShadow(style(survey?.appearance), survey.id, undefined, this.posthog)\n if (delaySeconds <= 0) {\n return Preact.render(\n <SurveyPopup\n key={'popover-survey'}\n posthog={this.posthog}\n survey={survey}\n removeSurveyFromFocus={this.removeSurveyFromFocus}\n isPopup={true}\n />,\n shadow\n )\n }\n const timeoutId = setTimeout(() => {\n if (!doesSurveyUrlMatch(survey)) {\n return this.removeSurveyFromFocus(survey.id)\n }\n // rendering with surveyPopupDelaySeconds = 0 because we're already handling the timeout here\n Preact.render(\n <SurveyPopup\n key={'popover-survey'}\n posthog={this.posthog}\n survey={{ ...survey, appearance: { ...survey.appearance, surveyPopupDelaySeconds: 0 } }}\n removeSurveyFromFocus={this.removeSurveyFromFocus}\n isPopup={true}\n />,\n shadow\n )\n }, delaySeconds * 1000)\n this.surveyTimeouts.set(survey.id, timeoutId)\n }\n }\n\n private handleWidget = (survey: Survey): void => {\n const shadow = createWidgetShadow(survey, this.posthog)\n\n const stylesheetContent = style(survey.appearance)\n const stylesheet = prepareStylesheet(document, stylesheetContent, this.posthog)\n\n if (stylesheet) {\n shadow.appendChild(stylesheet)\n }\n\n Preact.render(\n <FeedbackWidget\n key={'feedback-survey'}\n posthog={this.posthog}\n survey={survey}\n removeSurveyFromFocus={this.removeSurveyFromFocus}\n />,\n shadow\n )\n }\n\n private handleWidgetSelector = (survey: Survey): void => {\n const selectorOnPage =\n survey.appearance?.widgetSelector && document.querySelector(survey.appearance.widgetSelector)\n if (selectorOnPage) {\n if (document.querySelectorAll(`.PostHogWidget${survey.id}`).length === 0) {\n this.handleWidget(survey)\n } else if (document.querySelectorAll(`.PostHogWidget${survey.id}`).length === 1) {\n // we have to check if user selector already has a survey listener attached to it because we always have to check if it's on the page or not\n if (!selectorOnPage.getAttribute('PHWidgetSurveyClickListener')) {\n const surveyPopup = document\n .querySelector(getPosthogWidgetClass(survey.id))\n ?.shadowRoot?.querySelector(`.survey-form`) as HTMLFormElement\n\n addEventListener(selectorOnPage, 'click', () => {\n if (surveyPopup) {\n surveyPopup.style.display = surveyPopup.style.display === 'none' ? 'block' : 'none'\n addEventListener(surveyPopup, 'PHSurveyClosed', () => {\n this.removeSurveyFromFocus(survey.id)\n surveyPopup.style.display = 'none'\n })\n }\n })\n\n selectorOnPage.setAttribute('PHWidgetSurveyClickListener', 'true')\n }\n }\n }\n }\n\n /**\n * Sorts surveys by their appearance delay in ascending order. If a survey does not have an appearance delay,\n * it is considered to have a delay of 0.\n * @param surveys\n * @returns The surveys sorted by their appearance delay\n */\n private sortSurveysByAppearanceDelay(surveys: Survey[]): Survey[] {\n return surveys.sort(\n (a, b) => (a.appearance?.surveyPopupDelaySeconds || 0) - (b.appearance?.surveyPopupDelaySeconds || 0)\n )\n }\n\n /**\n * Checks the feature flags associated with this Survey to see if the survey can be rendered.\n * @param survey\n * @param instance\n */\n public canRenderSurvey = (survey: Survey): SurveyRenderReason => {\n const renderReason: SurveyRenderReason = {\n visible: false,\n }\n\n if (survey.end_date) {\n renderReason.disabledReason = `survey was completed on ${survey.end_date}`\n return renderReason\n }\n\n if (survey.type != SurveyType.Popover) {\n renderReason.disabledReason = `Only Popover survey types can be rendered`\n return renderReason\n }\n\n const linkedFlagCheck = survey.linked_flag_key\n ? this.posthog.featureFlags.isFeatureEnabled(survey.linked_flag_key)\n : true\n\n if (!linkedFlagCheck) {\n renderReason.disabledReason = `linked feature flag ${survey.linked_flag_key} is false`\n return renderReason\n }\n\n const targetingFlagCheck = survey.targeting_flag_key\n ? this.posthog.featureFlags.isFeatureEnabled(survey.targeting_flag_key)\n : true\n\n if (!targetingFlagCheck) {\n renderReason.disabledReason = `targeting feature flag ${survey.targeting_flag_key} is false`\n return renderReason\n }\n\n const internalTargetingFlagCheck = survey.internal_targeting_flag_key\n ? this.posthog.featureFlags.isFeatureEnabled(survey.internal_targeting_flag_key)\n : true\n\n if (!internalTargetingFlagCheck) {\n renderReason.disabledReason = `internal targeting feature flag ${survey.internal_targeting_flag_key} is false`\n return renderReason\n }\n\n renderReason.visible = true\n return renderReason\n }\n\n public renderSurvey = (survey: Survey, selector: Element): void => {\n Preact.render(\n <SurveyPopup\n key={'popover-survey'}\n posthog={this.posthog}\n survey={survey}\n removeSurveyFromFocus={this.removeSurveyFromFocus}\n isPopup={false}\n />,\n selector\n )\n }\n\n public callSurveysAndEvaluateDisplayLogic = (forceReload: boolean = false): void => {\n this.posthog?.getActiveMatchingSurveys((surveys) => {\n const nonAPISurveys = surveys.filter((survey) => survey.type !== 'api')\n\n // Create a queue of surveys sorted by their appearance delay. We will evaluate the display logic\n // for each survey in the queue in order, and only display one survey at a time.\n const nonAPISurveyQueue = this.sortSurveysByAppearanceDelay(nonAPISurveys)\n\n nonAPISurveyQueue.forEach((survey) => {\n // We only evaluate the display logic for one survey at a time\n if (!isNull(this.surveyInFocus)) {\n return\n }\n if (survey.type === SurveyType.Widget) {\n if (\n survey.appearance?.widgetType === 'tab' &&\n document.querySelectorAll(`.PostHogWidget${survey.id}`).length === 0\n ) {\n this.handleWidget(survey)\n }\n if (survey.appearance?.widgetType === 'selector' && survey.appearance?.widgetSelector) {\n this.handleWidgetSelector(survey)\n }\n }\n\n if (survey.type === SurveyType.Popover && this.canShowNextEventBasedSurvey()) {\n this.handlePopoverSurvey(survey)\n }\n })\n }, forceReload)\n }\n\n private addSurveyToFocus = (id: string): void => {\n if (!isNull(this.surveyInFocus)) {\n logger.error(`Survey ${[...this.surveyInFocus]} already in focus. Cannot add survey ${id}.`)\n }\n this.surveyInFocus = id\n }\n\n private removeSurveyFromFocus = (id: string): void => {\n if (this.surveyInFocus !== id) {\n logger.error(`Survey ${id} is not in focus. Cannot remove survey ${id}.`)\n }\n this.clearSurveyTimeout(id)\n this.surveyInFocus = null\n }\n\n // Expose internal state and methods for testing\n public getTestAPI() {\n return {\n addSurveyToFocus: this.addSurveyToFocus,\n removeSurveyFromFocus: this.removeSurveyFromFocus,\n surveyInFocus: this.surveyInFocus,\n surveyTimeouts: this.surveyTimeouts,\n canShowNextEventBasedSurvey: this.canShowNextEventBasedSurvey,\n handleWidget: this.handleWidget,\n handlePopoverSurvey: this.handlePopoverSurvey,\n handleWidgetSelector: this.handleWidgetSelector,\n sortSurveysByAppearanceDelay: this.sortSurveysByAppearanceDelay,\n }\n }\n}\n\nexport const renderSurveysPreview = ({\n survey,\n parentElement,\n previewPageIndex,\n forceDisableHtml,\n onPreviewSubmit,\n posthog,\n}: {\n survey: Survey\n parentElement: HTMLElement\n previewPageIndex: number\n forceDisableHtml?: boolean\n onPreviewSubmit?: (res: string | string[] | number | null) => void\n posthog?: PostHog\n}) => {\n const stylesheetContent = style(survey.appearance)\n const stylesheet = prepareStylesheet(document, stylesheetContent, posthog)\n\n // Remove previously attached <style>\n Array.from(parentElement.children).forEach((child) => {\n if (child instanceof HTMLStyleElement) {\n parentElement.removeChild(child)\n }\n })\n\n if (stylesheet) {\n parentElement.appendChild(stylesheet)\n }\n\n const textColor = getContrastingTextColor(\n survey.appearance?.backgroundColor || defaultSurveyAppearance.backgroundColor || 'white'\n )\n\n Preact.render(\n <SurveyPopup\n key=\"surveys-render-preview\"\n survey={survey}\n forceDisableHtml={forceDisableHtml}\n style={{\n position: 'relative',\n right: 0,\n borderBottom: `1px solid ${survey.appearance?.borderColor}`,\n borderRadius: 10,\n color: textColor,\n }}\n onPreviewSubmit={onPreviewSubmit}\n previewPageIndex={previewPageIndex}\n removeSurveyFromFocus={() => {}}\n isPopup={true}\n />,\n parentElement\n )\n}\n\nexport const renderFeedbackWidgetPreview = ({\n survey,\n root,\n forceDisableHtml,\n posthog,\n}: {\n survey: Survey\n root: HTMLElement\n forceDisableHtml?: boolean\n posthog?: PostHog\n}) => {\n const stylesheetContent = createWidgetStyle(survey.appearance?.widgetColor)\n const stylesheet = prepareStylesheet(document, stylesheetContent, posthog)\n if (stylesheet) {\n root.appendChild(stylesheet)\n }\n\n Preact.render(\n <FeedbackWidget\n key={'feedback-render-preview'}\n forceDisableHtml={forceDisableHtml}\n survey={survey}\n readOnly={true}\n removeSurveyFromFocus={() => {}}\n />,\n root\n )\n}\n\n// This is the main exported function\nexport function generateSurveys(posthog: PostHog) {\n // NOTE: Important to ensure we never try and run surveys without a window environment\n if (!document || !window) {\n return\n }\n\n const surveyManager = new SurveyManager(posthog)\n surveyManager.callSurveysAndEvaluateDisplayLogic(true)\n\n // recalculate surveys every second to check if URL or selectors have changed\n setInterval(() => {\n surveyManager.callSurveysAndEvaluateDisplayLogic(false)\n }, 1000)\n return surveyManager\n}\n\ntype UseHideSurveyOnURLChangeProps = {\n survey: Pick<Survey, 'id' | 'conditions'>\n removeSurveyFromFocus: (id: string) => void\n setSurveyVisible: (visible: boolean) => void\n isPreviewMode?: boolean\n}\n\n/**\n * This hook handles URL-based survey visibility after the initial mount.\n * The initial URL check is handled by the `getActiveMatchingSurveys` method in the `PostHogSurveys` class,\n * which ensures the URL matches before displaying a survey for the first time.\n * That is the method that is called every second to see if there's a matching survey.\n *\n * This separation of concerns means:\n * 1. Initial URL matching is done by `getActiveMatchingSurveys` before displaying the survey\n * 2. Subsequent URL changes are handled here to hide the survey as the user navigates\n */\nexport function useHideSurveyOnURLChange({\n survey,\n removeSurveyFromFocus,\n setSurveyVisible,\n isPreviewMode = false,\n}: UseHideSurveyOnURLChangeProps) {\n useEffect(() => {\n if (isPreviewMode || !survey.conditions?.url) {\n return\n }\n\n const checkUrlMatch = () => {\n const urlCheck = doesSurveyUrlMatch(survey)\n if (!urlCheck) {\n setSurveyVisible(false)\n return removeSurveyFromFocus(survey.id)\n }\n }\n\n // Listen for browser back/forward browser history changes\n addEventListener(window, 'popstate', checkUrlMatch)\n // Listen for hash changes, for SPA frameworks that use hash-based routing\n // The hashchange event is fired when the fragment identifier of the URL has changed (the part of the URL beginning with and following the # symbol).\n addEventListener(window, 'hashchange', checkUrlMatch)\n\n // Listen for SPA navigation\n const originalPushState = window.history.pushState\n const originalReplaceState = window.history.replaceState\n\n window.history.pushState = function (...args) {\n originalPushState.apply(this, args)\n checkUrlMatch()\n }\n\n window.history.replaceState = function (...args) {\n originalReplaceState.apply(this, args)\n checkUrlMatch()\n }\n\n return () => {\n window.removeEventListener('popstate', checkUrlMatch)\n window.removeEventListener('hashchange', checkUrlMatch)\n window.history.pushState = originalPushState\n window.history.replaceState = originalReplaceState\n }\n }, [isPreviewMode, survey, removeSurveyFromFocus, setSurveyVisible])\n}\n\nexport function usePopupVisibility(\n survey: Survey,\n posthog: PostHog | undefined,\n millisecondDelay: number,\n isPreviewMode: boolean,\n removeSurveyFromFocus: (id: string) => void\n) {\n const [isPopupVisible, setIsPopupVisible] = useState(isPreviewMode || millisecondDelay === 0)\n const [isSurveySent, setIsSurveySent] = useState(false)\n\n useEffect(() => {\n if (!posthog) {\n logger.error('usePopupVisibility hook called without a PostHog instance.')\n return\n }\n if (isPreviewMode) {\n return\n }\n\n const handleSurveyClosed = () => {\n removeSurveyFromFocus(survey.id)\n setIsPopupVisible(false)\n }\n\n const handleSurveySent = () => {\n if (!survey.appearance?.displayThankYouMessage) {\n removeSurveyFromFocus(survey.id)\n setIsPopupVisible(false)\n } else {\n setIsSurveySent(true)\n removeSurveyFromFocus(survey.id)\n if (survey.appearance?.autoDisappear) {\n setTimeout(() => {\n setIsPopupVisible(false)\n }, 5000)\n }\n }\n }\n\n const showSurvey = () => {\n // check if the url is still matching, necessary for delayed surveys, as the URL may have changed\n if (!doesSurveyUrlMatch(survey)) {\n return\n }\n\n setIsPopupVisible(true)\n window.dispatchEvent(new Event('PHSurveyShown'))\n posthog.capture('survey shown', {\n $survey_name: survey.name,\n $survey_id: survey.id,\n $survey_iteration: survey.current_iteration,\n $survey_iteration_start_date: survey.current_iteration_start_date,\n sessionRecordingUrl: posthog.get_session_replay_url?.(),\n })\n localStorage.setItem('lastSeenSurveyDate', new Date().toISOString())\n setTimeout(() => {\n const inputField = document\n .querySelector(getPosthogWidgetClass(survey.id))\n ?.shadowRoot?.querySelector('textarea, input[type=\"text\"]') as HTMLElement\n if (inputField) {\n inputField.focus()\n }\n }, 100)\n }\n\n addEventListener(window, 'PHSurveyClosed', handleSurveyClosed)\n addEventListener(window, 'PHSurveySent', handleSurveySent)\n\n if (millisecondDelay > 0) {\n // This path is only used for direct usage of SurveyPopup,\n // not for surveys managed by SurveyManager\n const timeoutId = setTimeout(showSurvey, millisecondDelay)\n return () => {\n clearTimeout(timeoutId)\n window.removeEventListener('PHSurveyClosed', handleSurveyClosed)\n window.removeEventListener('PHSurveySent', handleSurveySent)\n }\n } else {\n // This is the path used for surveys managed by SurveyManager\n showSurvey()\n return () => {\n window.removeEventListener('PHSurveyClosed', handleSurveyClosed)\n window.removeEventListener('PHSurveySent', handleSurveySent)\n }\n }\n }, [])\n\n useHideSurveyOnURLChange({\n survey,\n removeSurveyFromFocus,\n setSurveyVisible: setIsPopupVisible,\n isPreviewMode,\n })\n\n return { isPopupVisible, isSurveySent, setIsPopupVisible }\n}\n\ninterface SurveyPopupProps {\n survey: Survey\n forceDisableHtml?: boolean\n posthog?: PostHog\n style?: React.CSSProperties\n previewPageIndex?: number | undefined\n removeSurveyFromFocus: (id: string) => void\n isPopup?: boolean\n onPreviewSubmit?: (res: string | string[] | number | null) => void\n onPopupSurveyDismissed?: () => void\n onPopupSurveySent?: () => void\n}\n\nexport function SurveyPopup({\n survey,\n forceDisableHtml,\n posthog,\n style,\n previewPageIndex,\n removeSurveyFromFocus,\n isPopup,\n onPreviewSubmit = () => {},\n onPopupSurveyDismissed = () => {},\n onPopupSurveySent = () => {},\n}: SurveyPopupProps) {\n const isPreviewMode = Number.isInteger(previewPageIndex)\n // NB: The client-side code passes the millisecondDelay in seconds, but setTimeout expects milliseconds, so we multiply by 1000\n const surveyPopupDelayMilliseconds = survey.appearance?.surveyPopupDelaySeconds\n ? survey.appearance.surveyPopupDelaySeconds * 1000\n : 0\n const { isPopupVisible, isSurveySent, setIsPopupVisible } = usePopupVisibility(\n survey,\n posthog,\n surveyPopupDelayMilliseconds,\n isPreviewMode,\n removeSurveyFromFocus\n )\n const shouldShowConfirmation = isSurveySent || previewPageIndex === survey.questions.length\n const confirmationBoxLeftStyle = style?.left && isNumber(style?.left) ? { left: style.left - 40 } : {}\n\n if (isPreviewMode) {\n style = style || {}\n style.left = 'unset'\n style.right = 'unset'\n style.transform = 'unset'\n }\n\n return isPopupVisible ? (\n <SurveyContext.Provider\n value={{\n isPreviewMode,\n previewPageIndex: previewPageIndex,\n onPopupSurveyDismissed: () => {\n dismissedSurveyEvent(survey, posthog, isPreviewMode)\n onPopupSurveyDismissed()\n },\n isPopup: isPopup || false,\n onPreviewSubmit,\n onPopupSurveySent: () => {\n onPopupSurveySent()\n },\n }}\n >\n {!shouldShowConfirmation ? (\n <Questions\n survey={survey}\n forceDisableHtml={!!forceDisableHtml}\n posthog={posthog}\n styleOverrides={style}\n />\n ) : (\n <ConfirmationMessage\n header={survey.appearance?.thankYouMessageHeader || 'Thank you!'}\n description={survey.appearance?.thankYouMessageDescription || ''}\n forceDisableHtml={!!forceDisableHtml}\n contentType={survey.appearance?.thankYouMessageDescriptionContentType}\n appearance={survey.appearance || defaultSurveyAppearance}\n styleOverrides={{ ...style, ...confirmationBoxLeftStyle }}\n onClose={() => setIsPopupVisible(false)}\n />\n )}\n </SurveyContext.Provider>\n ) : null\n}\n\nexport function Questions({\n survey,\n forceDisableHtml,\n posthog,\n styleOverrides,\n}: {\n survey: Survey\n forceDisableHtml: boolean\n posthog?: PostHog\n styleOverrides?: React.CSSProperties\n}) {\n const textColor = getContrastingTextColor(\n survey.appearance?.backgroundColor || defaultSurveyAppearance.backgroundColor\n )\n const [questionsResponses, setQuestionsResponses] = useState({})\n const { previewPageIndex, onPopupSurveyDismissed, isPopup, onPreviewSubmit, onPopupSurveySent } =\n useContext(SurveyContext)\n const [currentQuestionIndex, setCurrentQuestionIndex] = useState(previewPageIndex || 0)\n const surveyQuestions = useMemo(() => getDisplayOrderQuestions(survey), [survey])\n\n // Sync preview state\n useEffect(() => {\n setCurrentQuestionIndex(previewPageIndex ?? 0)\n }, [previewPageIndex])\n\n const onNextButtonClick = ({\n res,\n displayQuestionIndex,\n questionId,\n }: {\n res: string | string[] | number | null\n displayQuestionIndex: number\n questionId?: string\n }) => {\n if (!posthog) {\n logger.error('onNextButtonClick called without a PostHog instance.')\n return\n }\n\n if (!questionId) {\n logger.error('onNextButtonClick called without a questionId.')\n return\n }\n\n const responseKey = getSurveyResponseKey(questionId)\n\n setQuestionsResponses({ ...questionsResponses, [responseKey]: res })\n\n const nextStep = getNextSurveyStep(survey, displayQuestionIndex, res)\n if (nextStep === SurveyQuestionBranchingType.End) {\n sendSurveyEvent({ ...questionsResponses, [responseKey]: res }, survey, posthog)\n onPopupSurveySent()\n } else {\n setCurrentQuestionIndex(nextStep)\n }\n }\n\n return (\n <form\n className=\"survey-form\"\n style={\n isPopup\n ? {\n color: textColor,\n borderColor: survey.appearance?.borderColor,\n ...styleOverrides,\n }\n : {}\n }\n >\n {surveyQuestions.map((question, displayQuestionIndex) => {\n const isVisible = currentQuestionIndex === displayQuestionIndex\n return (\n isVisible && (\n <div\n className=\"survey-box\"\n style={\n isPopup\n ? {\n backgroundColor:\n survey.appearance?.backgroundColor ||\n defaultSurveyAppearance.backgroundColor,\n }\n : {}\n }\n >\n {isPopup && (\n <Cancel\n onClick={() => {\n onPopupSurveyDismissed()\n }}\n />\n )}\n {getQuestionComponent({\n question,\n forceDisableHtml,\n displayQuestionIndex,\n appearance: survey.appearance || defaultSurveyAppearance,\n onSubmit: (res) =>\n onNextButtonClick({\n res,\n displayQuestionIndex,\n questionId: question.id,\n }),\n onPreviewSubmit,\n })}\n </div>\n )\n )\n })}\n </form>\n )\n}\n\nexport function FeedbackWidget({\n survey,\n forceDisableHtml,\n posthog,\n readOnly,\n removeSurveyFromFocus,\n}: {\n survey: Survey\n forceDisableHtml?: boolean\n posthog?: PostHog\n readOnly?: boolean\n removeSurveyFromFocus: (id: string) => void\n}): JSX.Element | null {\n const [isFeedbackButtonVisible, setIsFeedbackButtonVisible] = useState(true)\n const [showSurvey, setShowSurvey] = useState(false)\n const [styleOverrides, setStyle] = useState({})\n const widgetRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (!posthog) {\n logger.error('FeedbackWidget called without a PostHog instance.')\n return\n }\n if (readOnly) {\n return\n }\n\n if (survey.appearance?.widgetType === 'tab') {\n if (widgetRef.current) {\n const widgetPos = widgetRef.current.getBoundingClientRect()\n const style = {\n top: '50%',\n left: parseInt(`${widgetPos.right - 360}`),\n bottom: 'auto',\n borderRadius: 10,\n borderBottom: `1.5px solid ${survey.appearance?.borderColor || '#c9c6c6'}`,\n }\n setStyle(style)\n }\n }\n if (survey.appearance?.widgetType === 'selector') {\n const widget = document.querySelector(survey.appearance.widgetSelector || '') ?? undefined\n\n addEventListener(widget, 'click', (event) => {\n // Calculate position based on the selector button\n const buttonRect = (event.currentTarget as HTMLElement).getBoundingClientRect()\n const viewportHeight = window.innerHeight\n\n // Get survey width from maxWidth or default to 300px\n const surveyWidth = parseInt(survey.appearance?.maxWidth || '300')\n\n // Calculate horizontal center position of the button\n const buttonCenterX = buttonRect.left + buttonRect.width / 2\n\n // Calculate horizontal center position\n let left = buttonCenterX - surveyWidth / 2\n\n // Ensure the survey doesn't go off-screen horizontally\n const rightEdge = left + surveyWidth\n if (rightEdge > window.innerWidth) {\n left = window.innerWidth - surveyWidth - 20 // 20px padding from right edge\n }\n if (left < 20) {\n left = 20 // 20px padding from left edge\n }\n\n // Determine if we should show above or below\n let showAbove = false\n\n // Check if there's enough space below (need at least 300px)\n // If not enough space below, show above\n if (buttonRect.bottom + 300 > viewportHeight) {\n showAbove = true\n }\n\n // Simple spacing between button and survey\n const spacing = 12\n\n // Calculate positions\n let topPosition\n\n if (showAbove) {\n // Problem: When showing above, we're trying to position based on an estimated height,\n // but we don't know the actual height of the survey yet.\n // Solution: Instead of using top positioning for above, use bottom positioning\n // This will anchor the survey to the bottom edge at the button's top position\n topPosition = null // We'll use bottom positioning instead\n } else {\n // When showing below, position the top of the survey below the button plus spacing\n topPosition = buttonRect.bottom + window.scrollY + spacing\n }\n\n // Set style overrides for positioning\n setStyle({\n position: 'fixed',\n top: showAbove ? 'auto' : topPosition + 'px',\n left: left + 'px',\n right: 'auto',\n bottom: showAbove ? window.innerHeight - buttonRect.top + spacing + 'px' : 'auto',\n transform: 'none',\n border: `1.5px solid ${survey.appearance?.borderColor || '#c9c6c6'}`,\n borderRadius: '10px',\n width: `${surveyWidth}px`,\n zIndex: SURVEY_DEFAULT_Z_INDEX,\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.15)',\n maxHeight: showAbove\n ? `calc(100vh - 40px - ${spacing * 2}px)`\n : `calc(100vh - ${topPosition}px - 20px)`,\n })\n\n setShowSurvey(!showSurvey)\n })\n\n widget?.setAttribute('PHWidgetSurveyClickListener', 'true')\n }\n }, [])\n\n useHideSurveyOnURLChange({\n survey,\n removeSurveyFromFocus,\n setSurveyVisible: setIsFeedbackButtonVisible,\n })\n\n if (!isFeedbackButtonVisible) {\n return null\n }\n\n const resetShowSurvey = () => {\n setShowSurvey(false)\n }\n\n return (\n <Preact.Fragment>\n {survey.appearance?.widgetType === 'tab' && (\n <div\n className=\"ph-survey-widget-tab\"\n ref={widgetRef}\n onClick={() => !readOnly && setShowSurvey(!showSurvey)}\n style={{ color: getContrastingTextColor(survey.appearance.widgetColor) }}\n >\n <div className=\"ph-survey-widget-tab-icon\"></div>\n {survey.appearance?.widgetLabel || ''}\n </div>\n )}\n {showSurvey && (\n <SurveyPopup\n key={'feedback-widget-survey'}\n posthog={posthog}\n survey={survey}\n forceDisableHtml={forceDisableHtml}\n style={styleOverrides}\n removeSurveyFromFocus={removeSurveyFromFocus}\n isPopup={true}\n onPopupSurveyDismissed={resetShowSurvey}\n onPopupSurveySent={resetShowSurvey}\n />\n )}\n </Preact.Fragment>\n )\n}\n\ninterface GetQuestionComponentProps {\n question: SurveyQuestion\n forceDisableHtml: boolean\n displayQuestionIndex: number\n appearance: SurveyAppearance\n onSubmit: (res: string | string[] | number | null) => void\n onPreviewSubmit: (res: string | string[] | number | null) => void\n}\n\nconst getQuestionComponent = ({\n question,\n forceDisableHtml,\n displayQuestionIndex,\n appearance,\n onSubmit,\n onPreviewSubmit,\n}: GetQuestionComponentProps): JSX.Element => {\n const questionComponents = {\n [SurveyQuestionType.Open]: OpenTextQuestion,\n [SurveyQuestionType.Link]: LinkQuestion,\n [SurveyQuestionType.Rating]: RatingQuestion,\n [SurveyQuestionType.SingleChoice]: MultipleChoiceQuestion,\n [SurveyQuestionType.MultipleChoice]: MultipleChoiceQuestion,\n }\n\n const commonProps = {\n question,\n forceDisableHtml,\n appearance,\n onPreviewSubmit: (res: string | string[] | number | null) => {\n onPreviewSubmit(res)\n },\n onSubmit: (res: string | string[] | number | null) => {\n onSubmit(res)\n },\n }\n\n const additionalProps: Record<SurveyQuestionType, any> = {\n [SurveyQuestionType.Open]: {},\n [SurveyQuestionType.Link]: {},\n [SurveyQuestionType.Rating]: { displayQuestionIndex },\n [SurveyQuestionType.SingleChoice]: { displayQuestionIndex },\n [SurveyQuestionType.MultipleChoice]: { displayQuestionIndex },\n }\n\n const Component = questionComponents[question.type]\n const componentProps = { ...commonProps, ...additionalProps[question.type] }\n\n return <Component {...componentProps} />\n}\n"]}
|
package/package.json
CHANGED