// Copyright 2024 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only import React, { type JSX, useId, useMemo, useState } from 'react'; import { Tabs } from 'radix-ui'; import type { LocalizerType } from '../types/I18N.std.ts'; import { AxoDialog } from '../axo/AxoDialog.dom.tsx'; import { tw } from '../axo/tw.dom.tsx'; import { useReducedMotion } from '../hooks/useReducedMotion.dom.ts'; import { AxoIconButton } from '../axo/AxoIconButton.dom.tsx'; import { AxoButton } from '../axo/AxoButton.dom.tsx'; export type SafetyTipsModalProps = Readonly<{ i18n: LocalizerType; onClose(): void; }>; export function SafetyTipsModal({ i18n, onClose, }: SafetyTipsModalProps): JSX.Element { const [page, setPage] = useState<'summary' | 'details'>('summary'); return ( {page === 'summary' ? ( setPage('details')} /> ) : ( )} ); } function SafetyTipsSummary({ i18n, onViewMore, }: { i18n: LocalizerType; onViewMore: () => void; }): React.JSX.Element { const tips = useMemo( () => [ { key: 'signal', iconUrl: 'images/safety-tips/safety-tip-icon-chat-x.svg', titleId: i18n('icu:SafetyTipsModal__TipTitle--SignalChat'), descriptionId: i18n( 'icu:SafetyTipsModal__TipDescription--SignalChat' ), }, { key: 'names-and-photos', iconUrl: 'images/safety-tips/safety-tip-icon-person-question.svg', titleId: i18n('icu:SafetyTipsModal__TipTitle--NamesAndPhotos'), descriptionId: i18n( 'icu:SafetyTipsModal__TipDescription--NamesAndPhotos' ), }, { key: 'scams', iconUrl: 'images/safety-tips/safety-tip-icon-raised-hand.svg', titleId: i18n('icu:SafetyTipsModal__TipTitle--Scams'), descriptionId: i18n('icu:SafetyTipsModal__TipDescription--Scams'), }, ] as const, [i18n] ); return ( <> {i18n('icu:SafetyTipsModal__Title-v2')} {i18n('icu:SafetyTipsModal__Title-v2')} {tips.map(tip => ( {tip.titleId} {tip.descriptionId} ))} {i18n('icu:SafetyTipsModal__Button--ViewMore')} > ); } function SafetyTipsDetails({ i18n, }: { i18n: LocalizerType; }): React.JSX.Element { const cardWrapperId = useId(); const tips = useMemo( () => [ { key: 'dontRespond', title: i18n('icu:SafetyTipsModal__TipTitle--DontRespond'), description: i18n('icu:SafetyTipsModal__TipDescription--DontRespond'), imageUrl: 'images/safety-tips/safety-tip-dont-respond.svg', }, { key: 'reviewNames', title: i18n('icu:SafetyTipsModal__TipTitle--ReviewNames'), description: i18n('icu:SafetyTipsModal__TipDescription--ReviewNames'), imageUrl: 'images/safety-tips/safety-tip-review-names.svg', }, { key: 'vague', title: i18n('icu:SafetyTipsModal__TipTitle--Vague'), description: i18n('icu:SafetyTipsModal__TipDescription--Vague'), imageUrl: 'images/safety-tips/safety-tip-vague.svg', }, { key: 'links', title: i18n('icu:SafetyTipsModal__TipTitle--Links-v2'), description: i18n('icu:SafetyTipsModal__TipDescription--Links'), imageUrl: 'images/safety-tips/safety-tip-links.svg', }, { key: 'crypto', title: i18n('icu:SafetyTipsModal__TipTitle--Crypto'), description: i18n('icu:SafetyTipsModal__TipDescription--Crypto'), imageUrl: 'images/safety-tips/safety-tip-crypto.svg', }, { key: 'business', title: i18n('icu:SafetyTipsModal__TipTitle--Business'), description: i18n('icu:SafetyTipsModal__TipDescription--Business'), imageUrl: 'images/safety-tips/safety-tip-business.svg', }, ] as const, [i18n] ); function getCardIdForPage(pageIndex: number) { // oxlint-disable-next-line typescript/no-non-null-assertion return `${cardWrapperId}_${tips[pageIndex]!.key}`; } const maxPageIndex = tips.length - 1; const [pageIndex, setPageIndex] = useState(0); const reducedMotion = useReducedMotion(); function scrollToPageIndex(nextPageIndex: number) { setPageIndex(nextPageIndex); document.getElementById(getCardIdForPage(nextPageIndex))?.scrollIntoView({ inline: 'center', behavior: reducedMotion ? 'instant' : 'smooth', }); } function scrollToPageKey(key: string) { const index = tips.findIndex(tip => tip.key === key); if (index >= 0) { scrollToPageIndex(index); } } return ( <> {i18n('icu:SafetyTipsModal__Title-v2')} {tips.map((page, index) => { return ( {page.title} {page.description} ); })} { if (pageIndex === 0) { return; } scrollToPageIndex(pageIndex - 1); }} /> {tips.map(page => { return ( ); })} { if (pageIndex === maxPageIndex) { return; } scrollToPageIndex(pageIndex + 1); }} /> > ); }
{tip.descriptionId}
{page.description}