Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Issue / 10036 Duplicate Survey Triggers view_kmw view_ga4_dashboard Surveys #10161

Open
wants to merge 8 commits into
base: develop
Choose a base branch
from

Conversation

10upsimon
Copy link
Collaborator

@10upsimon 10upsimon commented Feb 3, 2025

Summary

Addresses issue:

Relevant technical choices

PR Author Checklist

  • My code is tested and passes existing unit tests.
  • My code has an appropriate set of unit tests which all pass.
  • My code is backward-compatible with WordPress 5.2 and PHP 7.4.
  • My code follows the WordPress coding standards.
  • My code has proper inline documentation.
  • I have added a QA Brief on the issue linked above.
  • I have signed the Contributor License Agreement (see https://cla.developers.google.com/).

Do not alter or remove anything below. The following sections will be managed by moderators only.

Code Reviewer Checklist

  • Run the code.
  • Ensure the acceptance criteria are satisfied.
  • Reassess the implementation with the IB.
  • Ensure no unrelated changes are included.
  • Ensure CI checks pass.
  • Check Storybook where applicable.
  • Ensure there is a QA Brief.
  • Ensure there are no unexpected significant changes to file sizes.

Merge Reviewer Checklist

  • Ensure the PR has the correct target branch.
  • Double-check that the PR is okay to be merged.
  • Ensure the corresponding issue has a ZenHub release assigned.
  • Add a changelog message to the issue.

Copy link

github-actions bot commented Feb 3, 2025

Build files for 1b52106 are ready:

Copy link

github-actions bot commented Feb 3, 2025

Size Change: -299 B (-0.01%)

Total Size: 2 MB

Filename Size Change
./dist/assets/js/41-********************.js 1.59 kB +1 B (+0.06%)
./dist/assets/js/googlesitekit-activation-********************.js 24.1 kB -4 B (-0.02%)
./dist/assets/js/googlesitekit-ad-blocking-recovery-********************.js 54.2 kB +23 B (+0.04%)
./dist/assets/js/googlesitekit-adminbar-********************.js 35 kB -5 B (-0.01%)
./dist/assets/js/googlesitekit-api-********************.js 10.1 kB +4 B (+0.04%)
./dist/assets/js/googlesitekit-components-gm2-********************.js 6.41 kB +6 B (+0.09%)
./dist/assets/js/googlesitekit-components-gm3-********************.js 10.1 kB +2 B (+0.02%)
./dist/assets/js/googlesitekit-data-********************.js 2.38 kB +1 B (+0.04%)
./dist/assets/js/googlesitekit-datastore-site-********************.js 20.2 kB +2 B (+0.01%)
./dist/assets/js/googlesitekit-datastore-user-********************.js 28.2 kB +4 B (+0.01%)
./dist/assets/js/googlesitekit-entity-dashboard-********************.js 82.8 kB +17 B (+0.02%)
./dist/assets/js/googlesitekit-main-dashboard-********************.js 163 kB -53 B (-0.03%)
./dist/assets/js/googlesitekit-metric-selection-********************.js 52 kB -16 B (-0.03%)
./dist/assets/js/googlesitekit-modules-********************.js 22.4 kB -1 B (0%)
./dist/assets/js/googlesitekit-modules-ads-********************.js 35.9 kB +3 B (+0.01%)
./dist/assets/js/googlesitekit-modules-adsense-********************.js 119 kB +8 B (+0.01%)
./dist/assets/js/googlesitekit-modules-analytics-4-********************.js 192 kB +55 B (+0.03%)
./dist/assets/js/googlesitekit-modules-pagespeed-insights-********************.js 22.9 kB +9 B (+0.04%)
./dist/assets/js/googlesitekit-modules-reader-revenue-manager-********************.js 41.1 kB -11 B (-0.03%)
./dist/assets/js/googlesitekit-modules-search-console-********************.js 69.4 kB -94 B (-0.14%)
./dist/assets/js/googlesitekit-modules-sign-in-with-google-********************.js 31.9 kB -12 B (-0.04%)
./dist/assets/js/googlesitekit-modules-tagmanager-********************.js 32.2 kB -15 B (-0.05%)
./dist/assets/js/googlesitekit-notifications-********************.js 43.3 kB +3 B (+0.01%)
./dist/assets/js/googlesitekit-settings-********************.js 128 kB -102 B (-0.08%)
./dist/assets/js/googlesitekit-splash-********************.js 68.7 kB -11 B (-0.02%)
./dist/assets/js/googlesitekit-user-input-********************.js 43.9 kB +2 B (0%)
./dist/assets/js/googlesitekit-vendor-********************.js 325 kB +10 B (0%)
./dist/assets/js/googlesitekit-widgets-********************.js 104 kB -112 B (-0.11%)
./dist/assets/js/googlesitekit-wp-dashboard-********************.js 63.3 kB -12 B (-0.02%)
./dist/assets/js/runtime-********************.js 1.4 kB -1 B (-0.07%)
ℹ️ View Unchanged
Filename Size
./dist/assets/css/googlesitekit-admin-css-********************.min.css 62.4 kB
./dist/assets/css/googlesitekit-adminbar-css-********************.min.css 11.8 kB
./dist/assets/css/googlesitekit-authorize-application-css-********************.min.css 846 B
./dist/assets/css/googlesitekit-wp-dashboard-css-********************.min.css 8.48 kB
./dist/assets/js/33-********************.js 2.76 kB
./dist/assets/js/34-********************.js 2.25 kB
./dist/assets/js/35-********************.js 3.64 kB
./dist/assets/js/36-********************.js 936 B
./dist/assets/js/37-********************.js 892 B
./dist/assets/js/38-********************.js 1.61 kB
./dist/assets/js/39-********************.js 1.57 kB
./dist/assets/js/40-********************.js 1.61 kB
./dist/assets/js/42-********************.js 1.83 kB
./dist/assets/js/43-********************.js 3.12 kB
./dist/assets/js/analytics-advanced-tracking-********************.js 901 B
./dist/assets/js/googlesitekit-consent-mode-********************.js 25.6 kB
./dist/assets/js/googlesitekit-datastore-forms-********************.js 8.96 kB
./dist/assets/js/googlesitekit-datastore-location-********************.js 2.09 kB
./dist/assets/js/googlesitekit-datastore-ui-********************.js 10 kB
./dist/assets/js/googlesitekit-events-provider-contact-form-7-********************.js 646 B
./dist/assets/js/googlesitekit-events-provider-easy-digital-downloads-********************.js 624 B
./dist/assets/js/googlesitekit-events-provider-mailchimp-********************.js 630 B
./dist/assets/js/googlesitekit-events-provider-ninja-forms-********************.js 712 B
./dist/assets/js/googlesitekit-events-provider-optin-monster-********************.js 675 B
./dist/assets/js/googlesitekit-events-provider-popup-maker-********************.js 634 B
./dist/assets/js/googlesitekit-events-provider-woocommerce-********************.js 657 B
./dist/assets/js/googlesitekit-events-provider-wpforms-********************.js 633 B
./dist/assets/js/googlesitekit-i18n-********************.js 3.93 kB
./dist/assets/js/googlesitekit-polyfills-********************.js 378 B
./dist/assets/js/googlesitekit-reader-revenue-manager-block-editor-********************.js 477 B

compressed-size-action

…, implement async on tests and waitForRegistry() in order to suppress act() errors.
Copy link
Collaborator

@zutigrm zutigrm left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @10upsimon LGTM

Copy link
Collaborator

@aaemnnosttv aaemnnosttv left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @10upsimon ! Apologies for the late feedback in the cycle here but it seems we're maybe trying to solve the problem in the wrong place.

A survey shouldn't really be possible to be triggered multiple times (regardless of where or how) because we "timeout" survey triggers and so only triggers that aren't timed out should hit the backend.

// Both isTimedOut and isTimingOut variables are already resolved since they depend on
// the getSurveyTimeouts selector which we've resolved just before getting these variables.
if ( ! isTimedOut && ! isTimingOut ) {
const { response, error } =
yield fetchTriggerSurveyStore.actions.fetchTriggerSurvey(
triggerID
);
if ( error ) {
return { response, error };
}
// If TTL isn't empty, then sleep for 30s and set survey timeout.
if ( ttl > 0 ) {
yield new Promise( ( resolve ) => {
setTimeout( resolve, 30000 );
} );
yield commonActions.await(
dispatch( CORE_USER ).setSurveyTimeout( triggerID, ttl )
);
}
}

Looking at the action, it seems we're not protecting against a survey from being triggered again if that happens before the timeout is set, which is delayed by 30 seconds as you can see above. I'm not familiar with why that is but I'm sure we can avoid concurrent triggers during this time by revisiting this behavior in the datastore and fix the issue everywhere at once rather than fixing it at each point where the trigger is invoked.

@@ -69,7 +123,6 @@ export default function ChangeMetricsLink() {
>
{ __( 'Change metrics', 'google-site-kit' ) }
</Link>
<SetupCompletedSurveyTrigger />
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I realize this is counter to the IB but I'd prefer if we didn't change this, but also I don't quite see the benefit of pulling so much of this component (which is now unused) into this one. If the in view state is beneficial, we could source that via useInView (which should source its state from the InViewProvider of the KMW area) although I'm not sure we need to implement an observer just for this button. Pushing the tracking into the render here allows us to use the same conditions for the trigger as for showing. I don't think it's particularly important that the button itself is viewed.

currentUserID,
isKeyMetricsSetupCompletedBy,
] );

if ( ! renderChangeMetricLink ) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The IB says

Include renderChangeMetricLink in the condition, surveys shouldn't be triggered if the value is falsy

this wouldn't be necessary though if we can keep the former render-based triggering.

@zutigrm
Copy link
Collaborator

zutigrm commented Feb 4, 2025

Thanks @aaemnnosttv , just to chip in here, It is nice to fix the root problem, but since this issue is a launch blocker for an epic, IB proposed a fix for issue at hand, as working on a core logic will affect all possible surveys which means long and thorough QA to test everything, watch for regression, etc.

I would suggest we do that in a separate issue since that can be done at any time, unlike the launch blocker. WDYT?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants