SafetyNumberViewer: Disable for contacts with missing data
This commit is contained in:
parent
b879c73b86
commit
33ca9c48af
3 changed files with 112 additions and 83 deletions
|
@ -1652,6 +1652,10 @@
|
||||||
"message": "Verify Safety Number",
|
"message": "Verify Safety Number",
|
||||||
"description": "Label on button included with safety number change notification in the conversation"
|
"description": "Label on button included with safety number change notification in the conversation"
|
||||||
},
|
},
|
||||||
|
"cannotGenerateSafetyNumber": {
|
||||||
|
"message": "This user can't be verified until you've exchanged messages with them.",
|
||||||
|
"description": "Shown on the safety number screen if you have never exchanged messages with that contact"
|
||||||
|
},
|
||||||
"yourSafetyNumberWith": {
|
"yourSafetyNumberWith": {
|
||||||
"message": "Your safety number with $name1$:",
|
"message": "Your safety number with $name1$:",
|
||||||
"description": "Heading for safety number view",
|
"description": "Heading for safety number view",
|
||||||
|
|
|
@ -3,7 +3,7 @@ import { action } from '@storybook/addon-actions';
|
||||||
import { boolean, text } from '@storybook/addon-knobs';
|
import { boolean, text } from '@storybook/addon-knobs';
|
||||||
import { storiesOf } from '@storybook/react';
|
import { storiesOf } from '@storybook/react';
|
||||||
|
|
||||||
import { SafetyNumberViewer } from './SafetyNumberViewer';
|
import { PropsType, SafetyNumberViewer } from './SafetyNumberViewer';
|
||||||
import { ConversationType } from '../state/ducks/conversations';
|
import { ConversationType } from '../state/ducks/conversations';
|
||||||
import { setup as setupI18n } from '../../js/modules/i18n';
|
import { setup as setupI18n } from '../../js/modules/i18n';
|
||||||
import enMessages from '../../_locales/en/messages.json';
|
import enMessages from '../../_locales/en/messages.json';
|
||||||
|
@ -45,88 +45,102 @@ const contactWithNothing = {
|
||||||
phoneNumber: undefined,
|
phoneNumber: undefined,
|
||||||
} as ConversationType;
|
} as ConversationType;
|
||||||
|
|
||||||
const defaultProps = {
|
const createProps = (overrideProps: Partial<PropsType> = {}): PropsType => ({
|
||||||
contact: contactWithAllData,
|
contact: overrideProps.contact || contactWithAllData,
|
||||||
generateSafetyNumber: action('generate-safety-number'),
|
generateSafetyNumber: action('generate-safety-number'),
|
||||||
i18n,
|
i18n,
|
||||||
safetyNumber: 'XXX',
|
safetyNumber: text('safetyNumber', overrideProps.safetyNumber || 'XXX'),
|
||||||
safetyNumberChanged: false,
|
safetyNumberChanged: boolean(
|
||||||
|
'safetyNumberChanged',
|
||||||
|
overrideProps.safetyNumberChanged !== undefined
|
||||||
|
? overrideProps.safetyNumberChanged
|
||||||
|
: false
|
||||||
|
),
|
||||||
toggleVerified: action('toggle-verified'),
|
toggleVerified: action('toggle-verified'),
|
||||||
verificationDisabled: false,
|
verificationDisabled: boolean(
|
||||||
};
|
'verificationDisabled',
|
||||||
|
overrideProps.verificationDisabled !== undefined
|
||||||
|
? overrideProps.verificationDisabled
|
||||||
|
: false
|
||||||
|
),
|
||||||
|
onClose: overrideProps.onClose,
|
||||||
|
});
|
||||||
|
|
||||||
const permutations = [
|
const story = storiesOf('Components/SafetyNumberViewer', module);
|
||||||
{
|
|
||||||
title: 'Safety Number',
|
|
||||||
props: {},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: 'Safety Number (not verified)',
|
|
||||||
props: {
|
|
||||||
contact: {
|
|
||||||
...contactWithAllData,
|
|
||||||
verified: false,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: 'Verification Disabled',
|
|
||||||
props: {
|
|
||||||
verificationDisabled: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: 'Safety Number Changed',
|
|
||||||
props: {
|
|
||||||
safetyNumberChanged: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: 'Safety Number (dialog close)',
|
|
||||||
props: {
|
|
||||||
onClose: action('close'),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: 'Just Profile',
|
|
||||||
props: {
|
|
||||||
contact: contactWithJustProfile,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: 'Just Number',
|
|
||||||
props: {
|
|
||||||
contact: contactWithJustNumber,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: 'No display info',
|
|
||||||
props: {
|
|
||||||
contact: contactWithNothing,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
storiesOf('Components/SafetyNumberViewer', module)
|
story.add('Safety Number', () => {
|
||||||
.add('Knobs Playground', () => {
|
return <SafetyNumberViewer {...createProps({})} />;
|
||||||
const safetyNumber = text('safetyNumber', 'XXX');
|
});
|
||||||
const safetyNumberChanged = boolean('safetyNumberChanged', false);
|
|
||||||
const verificationDisabled = boolean('verificationDisabled', false);
|
|
||||||
|
|
||||||
return (
|
story.add('Safety Number (not verified)', () => {
|
||||||
<SafetyNumberViewer
|
return (
|
||||||
{...defaultProps}
|
<SafetyNumberViewer
|
||||||
safetyNumber={safetyNumber}
|
{...createProps({
|
||||||
safetyNumberChanged={safetyNumberChanged}
|
contact: {
|
||||||
verificationDisabled={verificationDisabled}
|
...contactWithAllData,
|
||||||
/>
|
isVerified: false,
|
||||||
);
|
},
|
||||||
})
|
})}
|
||||||
.add('Iterations', () => {
|
/>
|
||||||
return permutations.map(({ props, title }) => (
|
);
|
||||||
<>
|
});
|
||||||
<h3>{title}</h3>
|
|
||||||
<SafetyNumberViewer {...defaultProps} {...props} />
|
story.add('Verification Disabled', () => {
|
||||||
</>
|
return (
|
||||||
));
|
<SafetyNumberViewer
|
||||||
});
|
{...createProps({
|
||||||
|
verificationDisabled: true,
|
||||||
|
})}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
story.add('Safety Number Changed', () => {
|
||||||
|
return (
|
||||||
|
<SafetyNumberViewer
|
||||||
|
{...createProps({
|
||||||
|
safetyNumberChanged: true,
|
||||||
|
})}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
story.add('Safety Number (dialog close)', () => {
|
||||||
|
return (
|
||||||
|
<SafetyNumberViewer
|
||||||
|
{...createProps({
|
||||||
|
onClose: action('close'),
|
||||||
|
})}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
story.add('Just Profile and Number', () => {
|
||||||
|
return (
|
||||||
|
<SafetyNumberViewer
|
||||||
|
{...createProps({
|
||||||
|
contact: contactWithJustProfile,
|
||||||
|
})}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
story.add('Just Number', () => {
|
||||||
|
return (
|
||||||
|
<SafetyNumberViewer
|
||||||
|
{...createProps({
|
||||||
|
contact: contactWithJustNumber,
|
||||||
|
})}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
story.add('No Phone Number (cannot verify)', () => {
|
||||||
|
return (
|
||||||
|
<SafetyNumberViewer
|
||||||
|
{...createProps({
|
||||||
|
contact: contactWithNothing,
|
||||||
|
})}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
|
@ -4,7 +4,7 @@ import { LocalizerType } from '../types/Util';
|
||||||
import { getPlaceholder } from '../util/safetyNumber';
|
import { getPlaceholder } from '../util/safetyNumber';
|
||||||
import { Intl } from './Intl';
|
import { Intl } from './Intl';
|
||||||
|
|
||||||
type SafetyNumberViewerProps = {
|
export type PropsType = {
|
||||||
contact?: ConversationType;
|
contact?: ConversationType;
|
||||||
generateSafetyNumber: (contact: ConversationType) => void;
|
generateSafetyNumber: (contact: ConversationType) => void;
|
||||||
i18n: LocalizerType;
|
i18n: LocalizerType;
|
||||||
|
@ -24,7 +24,7 @@ export const SafetyNumberViewer = ({
|
||||||
safetyNumberChanged,
|
safetyNumberChanged,
|
||||||
toggleVerified,
|
toggleVerified,
|
||||||
verificationDisabled,
|
verificationDisabled,
|
||||||
}: SafetyNumberViewerProps): JSX.Element | null => {
|
}: PropsType): JSX.Element | null => {
|
||||||
React.useEffect(() => {
|
React.useEffect(() => {
|
||||||
if (!contact) {
|
if (!contact) {
|
||||||
return;
|
return;
|
||||||
|
@ -37,8 +37,19 @@ export const SafetyNumberViewer = ({
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!contact.phoneNumber) {
|
||||||
|
return (
|
||||||
|
<div className="module-safety-number">
|
||||||
|
<div className="module-safety-number__verify-container">
|
||||||
|
{i18n('cannotGenerateSafetyNumber')}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
const showNumber = Boolean(contact.name || contact.profileName);
|
const showNumber = Boolean(contact.name || contact.profileName);
|
||||||
const numberFragment = showNumber ? ` · ${contact.phoneNumber}` : '';
|
const numberFragment =
|
||||||
|
showNumber && contact.phoneNumber ? ` · ${contact.phoneNumber}` : '';
|
||||||
const name = `${contact.title}${numberFragment}`;
|
const name = `${contact.title}${numberFragment}`;
|
||||||
const boldName = (
|
const boldName = (
|
||||||
<span className="module-safety-number__bold-name">{name}</span>
|
<span className="module-safety-number__bold-name">{name}</span>
|
||||||
|
|
Loading…
Add table
Reference in a new issue