diff options
author | Samuel Newman <mozzius@protonmail.com> | 2024-04-09 00:58:18 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-04-09 00:58:18 +0100 |
commit | a49a5a351d2b58631d067c0524c5ebb097a3d5fe (patch) | |
tree | d199c7312763ac87848c2038c85ef8d6f846e7d2 /src/components/dialogs/EmbedConsent.tsx | |
parent | 2bc20b1752d455bc1ca48e5f8eb4bd670d22ec34 (diff) | |
download | voidsky-a49a5a351d2b58631d067c0524c5ebb097a3d5fe.tar.zst |
Use ALF for the embed consent modal (#3336)
Diffstat (limited to 'src/components/dialogs/EmbedConsent.tsx')
-rw-r--r-- | src/components/dialogs/EmbedConsent.tsx | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/src/components/dialogs/EmbedConsent.tsx b/src/components/dialogs/EmbedConsent.tsx new file mode 100644 index 000000000..c3fefd9f0 --- /dev/null +++ b/src/components/dialogs/EmbedConsent.tsx @@ -0,0 +1,119 @@ +import React, {useCallback} from 'react' +import {View} from 'react-native' +import {msg, Trans} from '@lingui/macro' +import {useLingui} from '@lingui/react' + +import { + type EmbedPlayerSource, + embedPlayerSources, + externalEmbedLabels, +} from '#/lib/strings/embed-player' +import {useSetExternalEmbedPref} from '#/state/preferences' +import {atoms as a, useBreakpoints, useTheme} from '#/alf' +import * as Dialog from '#/components/Dialog' +import {Button, ButtonText} from '../Button' +import {Text} from '../Typography' + +export function EmbedConsentDialog({ + control, + source, + onAccept, +}: { + control: Dialog.DialogControlProps + source: EmbedPlayerSource + onAccept: () => void +}) { + const {_} = useLingui() + const t = useTheme() + const setExternalEmbedPref = useSetExternalEmbedPref() + const {gtMobile} = useBreakpoints() + + const onShowAllPress = useCallback(() => { + for (const key of embedPlayerSources) { + setExternalEmbedPref(key, 'show') + } + onAccept() + control.close() + }, [control, onAccept, setExternalEmbedPref]) + + const onShowPress = useCallback(() => { + setExternalEmbedPref(source, 'show') + onAccept() + control.close() + }, [control, onAccept, setExternalEmbedPref, source]) + + const onHidePress = useCallback(() => { + setExternalEmbedPref(source, 'hide') + control.close() + }, [control, setExternalEmbedPref, source]) + + return ( + <Dialog.Outer control={control}> + <Dialog.Handle /> + + <Dialog.ScrollableInner + label={_(msg`External Media`)} + style={[gtMobile ? {width: 'auto', maxWidth: 400} : a.w_full]}> + <View style={a.gap_sm}> + <Text style={[a.text_2xl, a.font_bold]}> + <Trans>External Media</Trans> + </Text> + + <View style={[a.mt_sm, a.mb_2xl, a.gap_lg]}> + <Text> + <Trans> + This content is hosted by {externalEmbedLabels[source]}. Do you + want to enable external media? + </Trans> + </Text> + + <Text style={t.atoms.text_contrast_medium}> + <Trans> + External media may allow websites to collect information about + you and your device. No information is sent or requested until + you press the "play" button. + </Trans> + </Text> + </View> + </View> + <View style={a.gap_md}> + <Button + style={gtMobile && a.flex_1} + label={_(msg`Enable external media`)} + onPress={onShowAllPress} + onAccessibilityEscape={control.close} + color="primary" + size="medium" + variant="solid"> + <ButtonText> + <Trans>Enable external media</Trans> + </ButtonText> + </Button> + <Button + style={gtMobile && a.flex_1} + label={_(msg`Enable this source only`)} + onPress={onShowPress} + onAccessibilityEscape={control.close} + color="secondary" + size="medium" + variant="solid"> + <ButtonText> + <Trans>Enable {externalEmbedLabels[source]} only</Trans> + </ButtonText> + </Button> + <Button + label={_(msg`No thanks`)} + onAccessibilityEscape={control.close} + onPress={onHidePress} + color="secondary" + size="medium" + variant="ghost"> + <ButtonText> + <Trans>No thanks</Trans> + </ButtonText> + </Button> + </View> + </Dialog.ScrollableInner> + </Dialog.Outer> + ) +} |