Gate content visibility setting
This commit is contained in:
@@ -25,6 +25,7 @@ export enum Features {
|
|||||||
FollowSortEnable = 'follow_sort:enable',
|
FollowSortEnable = 'follow_sort:enable',
|
||||||
OnboardingInterestsRequiredEnable = 'onboarding:interests:required:enable',
|
OnboardingInterestsRequiredEnable = 'onboarding:interests:required:enable',
|
||||||
CanonicalPostNumberingEnable = 'canonical_post_numbering:enable',
|
CanonicalPostNumberingEnable = 'canonical_post_numbering:enable',
|
||||||
|
ContentVisibilitySettingsEnable = 'content_visibility_settings:enable',
|
||||||
|
|
||||||
// values
|
// values
|
||||||
TrendingDiscoverValues = 'trending_discover:values',
|
TrendingDiscoverValues = 'trending_discover:values',
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ import {MagnifyingGlass_Stroke2_Corner0_Rounded as MagnifyingGlassIcon} from '#/
|
|||||||
import {ShieldCheck_Stroke2_Corner0_Rounded as ShieldIcon} from '#/components/icons/Shield'
|
import {ShieldCheck_Stroke2_Corner0_Rounded as ShieldIcon} from '#/components/icons/Shield'
|
||||||
import * as Layout from '#/components/Layout'
|
import * as Layout from '#/components/Layout'
|
||||||
import {InlineLinkText} from '#/components/Link'
|
import {InlineLinkText} from '#/components/Link'
|
||||||
|
import {useAnalytics} from '#/analytics'
|
||||||
import {AlgoVisibilityOptOut} from './components/AlgoVisibilityOptOut'
|
import {AlgoVisibilityOptOut} from './components/AlgoVisibilityOptOut'
|
||||||
import {Email2FAToggle} from './components/Email2FAToggle'
|
import {Email2FAToggle} from './components/Email2FAToggle'
|
||||||
import {PwiOptOut} from './components/PwiOptOut'
|
import {PwiOptOut} from './components/PwiOptOut'
|
||||||
@@ -30,6 +31,10 @@ type Props = NativeStackScreenProps<
|
|||||||
export function PrivacyAndSecuritySettingsScreen({}: Props) {
|
export function PrivacyAndSecuritySettingsScreen({}: Props) {
|
||||||
const {_} = useLingui()
|
const {_} = useLingui()
|
||||||
const t = useTheme()
|
const t = useTheme()
|
||||||
|
const ax = useAnalytics()
|
||||||
|
const isContentVisibilityEnabled = ax.features.enabled(
|
||||||
|
ax.features.ContentVisibilitySettingsEnable,
|
||||||
|
)
|
||||||
const {data: appPasswords} = useAppPasswordsQuery()
|
const {data: appPasswords} = useAppPasswordsQuery()
|
||||||
const {currentAccount} = useSession()
|
const {currentAccount} = useSession()
|
||||||
const {
|
const {
|
||||||
@@ -103,10 +108,12 @@ export function PrivacyAndSecuritySettingsScreen({}: Props) {
|
|||||||
/>
|
/>
|
||||||
</SettingsList.LinkItem>
|
</SettingsList.LinkItem>
|
||||||
<SettingsList.Divider />
|
<SettingsList.Divider />
|
||||||
<SettingsList.Item style={[a.align_start]}>
|
{isContentVisibilityEnabled && (
|
||||||
<SettingsList.ItemIcon icon={MagnifyingGlassIcon} />
|
<SettingsList.Item style={[a.align_start]}>
|
||||||
<AlgoVisibilityOptOut />
|
<SettingsList.ItemIcon icon={MagnifyingGlassIcon} />
|
||||||
</SettingsList.Item>
|
<AlgoVisibilityOptOut />
|
||||||
|
</SettingsList.Item>
|
||||||
|
)}
|
||||||
<SettingsList.Item style={[a.align_start]}>
|
<SettingsList.Item style={[a.align_start]}>
|
||||||
<SettingsList.ItemIcon icon={EyeSlashIcon} />
|
<SettingsList.ItemIcon icon={EyeSlashIcon} />
|
||||||
<PwiOptOut />
|
<PwiOptOut />
|
||||||
|
|||||||
@@ -10,12 +10,10 @@ import {
|
|||||||
import {atoms as a, useTheme} from '#/alf'
|
import {atoms as a, useTheme} from '#/alf'
|
||||||
import * as Toggle from '#/components/forms/Toggle'
|
import * as Toggle from '#/components/forms/Toggle'
|
||||||
import {Text} from '#/components/Typography'
|
import {Text} from '#/components/Typography'
|
||||||
import {useAnalytics} from '#/analytics'
|
|
||||||
|
|
||||||
export function AlgoVisibilityOptOut() {
|
export function AlgoVisibilityOptOut() {
|
||||||
const t = useTheme()
|
const t = useTheme()
|
||||||
const {_} = useLingui()
|
const {_} = useLingui()
|
||||||
const ax = useAnalytics()
|
|
||||||
const {data, isPending: isQueryPending} = useContentVisibilityQuery()
|
const {data, isPending: isQueryPending} = useContentVisibilityQuery()
|
||||||
const updateContentVisibility = useContentVisibilityMutation()
|
const updateContentVisibility = useContentVisibilityMutation()
|
||||||
|
|
||||||
@@ -23,7 +21,6 @@ export function AlgoVisibilityOptOut() {
|
|||||||
const canToggle = !isQueryPending && !updateContentVisibility.isPending
|
const canToggle = !isQueryPending && !updateContentVisibility.isPending
|
||||||
|
|
||||||
const onToggleOptOut = (hide: boolean) => {
|
const onToggleOptOut = (hide: boolean) => {
|
||||||
ax.metric('contentVisibility:algorithmicRecommendations:change', {hide})
|
|
||||||
updateContentVisibility.mutate(hide)
|
updateContentVisibility.mutate(hide)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import {useMutation, useQuery, useQueryClient} from '@tanstack/react-query'
|
|||||||
|
|
||||||
import {useAgent, useSession} from '#/state/session'
|
import {useAgent, useSession} from '#/state/session'
|
||||||
import * as Toast from '#/components/Toast'
|
import * as Toast from '#/components/Toast'
|
||||||
|
import {useAnalytics} from '#/analytics'
|
||||||
import {
|
import {
|
||||||
CONTENT_VISIBILITY_COLLECTION,
|
CONTENT_VISIBILITY_COLLECTION,
|
||||||
CONTENT_VISIBILITY_RKEY,
|
CONTENT_VISIBILITY_RKEY,
|
||||||
@@ -46,6 +47,7 @@ export function useContentVisibilityQuery() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function useContentVisibilityMutation() {
|
export function useContentVisibilityMutation() {
|
||||||
|
const ax = useAnalytics()
|
||||||
const agent = useAgent()
|
const agent = useAgent()
|
||||||
const {currentAccount} = useSession()
|
const {currentAccount} = useSession()
|
||||||
const queryClient = useQueryClient()
|
const queryClient = useQueryClient()
|
||||||
@@ -81,6 +83,9 @@ export function useContentVisibilityMutation() {
|
|||||||
queryClient.setQueryData(queryKey, context?.previous)
|
queryClient.setQueryData(queryKey, context?.previous)
|
||||||
Toast.show(t`Failed to update content visibility`)
|
Toast.show(t`Failed to update content visibility`)
|
||||||
},
|
},
|
||||||
|
onSuccess: (_record, hide) => {
|
||||||
|
ax.metric('contentVisibility:algorithmicRecommendations:change', {hide})
|
||||||
|
},
|
||||||
onSettled: () => {
|
onSettled: () => {
|
||||||
void queryClient.invalidateQueries({queryKey})
|
void queryClient.invalidateQueries({queryKey})
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user