summaryrefslogtreecommitdiff
blob: 50f6791464a06dd76a306ef29cba3c1bbb1d5cc8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/**
 * Internal dependencies
 */

export function renderPhone( inputText ) {
	const arrayOfNumbers = inputText.match( /\d+\.\d+|\d+\b|\d+(?=\w)/g );
	if ( ! arrayOfNumbers ) {
		// No numbers found
		return inputText;
	}
	const indexOfFirstNumber = inputText.indexOf( arrayOfNumbers[ 0 ] );

	// Assume that eveything after the first number should be part of the phone number.
	// care about the first prefix character.
	let phoneNumber = indexOfFirstNumber ? inputText.substring( indexOfFirstNumber - 1 ) : inputText;
	let prefix = indexOfFirstNumber ? inputText.substring( 0, indexOfFirstNumber ) : '';

	let justNumber = phoneNumber.replace( /\D/g, '' );
	// Phone numbers starting with + should be part of the number.
	if ( /[0-9/+/(]/.test( phoneNumber[ 0 ] ) ) {
		// Remove the special character from the prefix so they don't appear twice.
		prefix = prefix.slice( 0, -1 );
		// Phone numbers starting with + shoud be part of the number.
		if ( phoneNumber[ 0 ] === '+' ) {
			justNumber = '+' + justNumber;
		}
	} else {
		// Remove the first character.
		phoneNumber = phoneNumber.substring( 1 );
	}
	const prefixSpan = prefix.trim() ? (
		<span key="phonePrefix" className="phone-prefix">
			{ prefix }
		</span>
	) : null;
	return [
		prefixSpan,
		<a key="phoneNumber" href={ `tel:${ justNumber }` }>
			{ phoneNumber }
		</a>,
	];
}

const save = ( { attributes: { phone }, className } ) =>
	phone && <div className={ className }>{ renderPhone( phone ) }</div>;

export default save;