about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEric Bailey <git@esb.lol>2024-07-02 14:19:03 -0500
committerGitHub <noreply@github.com>2024-07-02 20:19:03 +0100
commit4bb4452f0858f2f5f8f6ead3012307cdf4b6a67f (patch)
tree35e79fb49712d82a1c20056b5f602753f6feb8f1
parent0012c6d40f63ad6ee1dd1fe13d5b56b4e9006425 (diff)
downloadvoidsky-4bb4452f0858f2f5f8f6ead3012307cdf4b6a67f.tar.zst
[D1X] Minimum interest experiment (#4653)
* Change up copy

* Add min # prompt

* Improve style

* Add gate

* Tweak padding

* Translate

* Revert string change

---------

Co-authored-by: dan <dan.abramov@gmail.com>
-rw-r--r--src/lib/statsig/gates.ts1
-rw-r--r--src/screens/Onboarding/StepInterests/index.tsx70
2 files changed, 69 insertions, 2 deletions
diff --git a/src/lib/statsig/gates.ts b/src/lib/statsig/gates.ts
index 46ef934ef..b667245dd 100644
--- a/src/lib/statsig/gates.ts
+++ b/src/lib/statsig/gates.ts
@@ -2,6 +2,7 @@ export type Gate =
   // Keep this alphabetic please.
   | 'debug_show_feedcontext'
   | 'native_pwi_disabled'
+  | 'onboarding_minimum_interests'
   | 'request_notifications_permission_after_onboarding_v2'
   | 'show_avi_follow_button'
   | 'show_follow_back_label_v2'
diff --git a/src/screens/Onboarding/StepInterests/index.tsx b/src/screens/Onboarding/StepInterests/index.tsx
index ded473ff5..ca29b5db9 100644
--- a/src/screens/Onboarding/StepInterests/index.tsx
+++ b/src/screens/Onboarding/StepInterests/index.tsx
@@ -6,8 +6,10 @@ import {useQuery} from '@tanstack/react-query'
 
 import {useAnalytics} from '#/lib/analytics/analytics'
 import {logEvent} from '#/lib/statsig/statsig'
+import {useGate} from '#/lib/statsig/statsig'
 import {capitalize} from '#/lib/strings/capitalize'
 import {logger} from '#/logger'
+import {isWeb} from '#/platform/detection'
 import {useAgent} from '#/state/session'
 import {useOnboardingDispatch} from '#/state/shell'
 import {
@@ -27,16 +29,23 @@ import * as Toggle from '#/components/forms/Toggle'
 import {IconCircle} from '#/components/IconCircle'
 import {ArrowRotateCounterClockwise_Stroke2_Corner0_Rounded as ArrowRotateCounterClockwise} from '#/components/icons/ArrowRotateCounterClockwise'
 import {ChevronRight_Stroke2_Corner0_Rounded as ChevronRight} from '#/components/icons/Chevron'
+import {CircleInfo_Stroke2_Corner0_Rounded as CircleInfo} from '#/components/icons/CircleInfo'
 import {EmojiSad_Stroke2_Corner0_Rounded as EmojiSad} from '#/components/icons/Emoji'
 import {Hashtag_Stroke2_Corner0_Rounded as Hashtag} from '#/components/icons/Hashtag'
 import {Loader} from '#/components/Loader'
 import {Text} from '#/components/Typography'
 
+const PROMPT_HEIGHT = isWeb ? 42 : 36
+// matches the padding of the OnboardingControls.Portal
+const PROMPT_OFFSET = isWeb ? a.pb_2xl.paddingBottom : a.pb_lg.paddingBottom
+const MIN_INTERESTS = 3
+
 export function StepInterests() {
   const {_} = useLingui()
   const t = useTheme()
   const {gtMobile} = useBreakpoints()
   const {track} = useAnalytics()
+  const gate = useGate()
   const interestsDisplayNames = useInterestsDisplayNames()
 
   const {state, dispatch} = React.useContext(Context)
@@ -134,6 +143,11 @@ export function StepInterests() {
     track('OnboardingV2:StepInterests:Start')
   }, [track])
 
+  const isMinimumInterestsEnabled = gate('onboarding_minimum_interests')
+  const meetsMinimumRequirement = isMinimumInterestsEnabled
+    ? interests.length >= MIN_INTERESTS
+    : true
+
   const title = isError ? (
     <Trans>Oh no! Something went wrong.</Trans>
   ) : (
@@ -171,8 +185,13 @@ export function StepInterests() {
 
       <TitleText>{title}</TitleText>
       <DescriptionText>{description}</DescriptionText>
+      {isMinimumInterestsEnabled && (
+        <DescriptionText style={[a.pt_sm]}>
+          <Trans>Choose 3 or more:</Trans>
+        </DescriptionText>
+      )}
 
-      <View style={[a.w_full, a.pt_2xl]}>
+      <View style={[a.w_full, isMinimumInterestsEnabled ? a.pt_md : a.pt_2xl]}>
         {isLoading ? (
           <Loader size="xl" />
         ) : isError || !data ? (
@@ -248,7 +267,7 @@ export function StepInterests() {
           </View>
         ) : (
           <Button
-            disabled={saving || !data}
+            disabled={saving || !data || !meetsMinimumRequirement}
             variant="gradient"
             color="gradient_sky"
             size="large"
@@ -263,6 +282,53 @@ export function StepInterests() {
             />
           </Button>
         )}
+
+        {!meetsMinimumRequirement && (
+          <View
+            style={[
+              a.align_center,
+              a.absolute,
+              {
+                top: 0,
+                left: 0,
+                right: 0,
+                margin: 'auto',
+                transform: [
+                  {
+                    translateY:
+                      -1 *
+                      (PROMPT_OFFSET + PROMPT_HEIGHT + a.pb_lg.paddingBottom),
+                  },
+                ],
+              },
+            ]}>
+            <View
+              style={[
+                a.flex_row,
+                a.align_center,
+                a.gap_sm,
+                a.rounded_full,
+                a.border,
+                t.atoms.bg_contrast_25,
+                t.atoms.border_contrast_medium,
+                {
+                  height: PROMPT_HEIGHT,
+                  ...t.atoms.shadow_sm,
+                  shadowOpacity: 0.1,
+                },
+                isWeb
+                  ? [a.py_md, a.px_lg, a.pr_xl]
+                  : [a.py_sm, a.px_md, a.pr_lg],
+              ]}>
+              <CircleInfo />
+              <Text>
+                <Trans>
+                  Choose at least {MIN_INTERESTS - interests.length} more
+                </Trans>
+              </Text>
+            </View>
+          </View>
+        )}
       </OnboardingControls.Portal>
     </View>
   )