|  | 
| 1 | 1 | // @flow | 
| 2 | 2 | import React, { Component } from 'react'; | 
| 3 |  | -import { Animated, Easing, View, NativeModules, Modal, StatusBar, Platform } from 'react-native'; | 
|  | 3 | +import { | 
|  | 4 | +  Animated, | 
|  | 5 | +  Easing, | 
|  | 6 | +  View, | 
|  | 7 | +  NativeModules, | 
|  | 8 | +  Modal, | 
|  | 9 | +  StatusBar, | 
|  | 10 | +  Platform, | 
|  | 11 | +  I18nManager, | 
|  | 12 | +} from 'react-native'; | 
| 4 | 13 | import Tooltip from './Tooltip'; | 
| 5 | 14 | import StepNumber from './StepNumber'; | 
| 6 | 15 | import styles, { MARGIN, ARROW_SIZE, STEP_NUMBER_DIAMETER, STEP_NUMBER_RADIUS } from './style'; | 
| @@ -36,6 +45,10 @@ type State = { | 
| 36 | 45 | 
 | 
| 37 | 46 | const noop = () => {}; | 
| 38 | 47 | 
 | 
|  | 48 | +const rtl = I18nManager.isRTL; | 
|  | 49 | +const start = rtl ? 'right' : 'left'; | 
|  | 50 | +const end = rtl ? 'left' : 'right'; | 
|  | 51 | + | 
| 39 | 52 | class CopilotModal extends Component<Props, State> { | 
| 40 | 53 |   static defaultProps = { | 
| 41 | 54 |     easing: Easing.elastic(0.7), | 
| @@ -101,15 +114,31 @@ class CopilotModal extends Component<Props, State> { | 
| 101 | 114 |       obj.top -= StatusBar.currentHeight; // eslint-disable-line no-param-reassign | 
| 102 | 115 |     } | 
| 103 | 116 | 
 | 
| 104 |  | -    let stepNumberLeft = obj.left - STEP_NUMBER_RADIUS; | 
|  | 117 | +    let stepNumberLeft; | 
|  | 118 | + | 
|  | 119 | +    const edgeCase = (stepLeft) => { | 
|  | 120 | +      if (stepLeft > layout.width - STEP_NUMBER_DIAMETER) { | 
|  | 121 | +        return layout.width - STEP_NUMBER_DIAMETER; | 
|  | 122 | +      } | 
|  | 123 | +      return stepLeft; | 
|  | 124 | +    }; | 
|  | 125 | + | 
|  | 126 | +    if (!rtl) { | 
|  | 127 | +      stepNumberLeft = obj.left - STEP_NUMBER_RADIUS; | 
| 105 | 128 | 
 | 
| 106 |  | -    if (stepNumberLeft < 0) { | 
|  | 129 | +      if (stepNumberLeft < 0) { | 
|  | 130 | +        stepNumberLeft = (obj.left + obj.width) - STEP_NUMBER_RADIUS; | 
|  | 131 | +        stepNumberLeft = edgeCase(stepNumberLeft); | 
|  | 132 | +      } | 
|  | 133 | +    } else { | 
| 107 | 134 |       stepNumberLeft = (obj.left + obj.width) - STEP_NUMBER_RADIUS; | 
| 108 |  | -      if (stepNumberLeft > layout.width - STEP_NUMBER_DIAMETER) { | 
| 109 |  | -        stepNumberLeft = layout.width - STEP_NUMBER_DIAMETER; | 
|  | 135 | +      if (stepNumberLeft > layout.width) { | 
|  | 136 | +        stepNumberLeft = obj.left - STEP_NUMBER_RADIUS; | 
|  | 137 | +        stepNumberLeft = edgeCase(stepNumberLeft); | 
| 110 | 138 |       } | 
| 111 | 139 |     } | 
| 112 | 140 | 
 | 
|  | 141 | + | 
| 113 | 142 |     const center = { | 
| 114 | 143 |       x: obj.left + (obj.width / 2), | 
| 115 | 144 |       y: obj.top + (obj.height / 2), | 
| @@ -137,15 +166,15 @@ class CopilotModal extends Component<Props, State> { | 
| 137 | 166 |     } | 
| 138 | 167 | 
 | 
| 139 | 168 |     if (horizontalPosition === 'left') { | 
| 140 |  | -      tooltip.right = Math.max(layout.width - (obj.left + obj.width), 0); | 
|  | 169 | +      tooltip[end] = Math.max(layout.width - (obj.left + obj.width), 0); | 
| 141 | 170 |       tooltip.right = tooltip.right === 0 ? tooltip.right + MARGIN : tooltip.right; | 
| 142 | 171 |       tooltip.maxWidth = layout.width - tooltip.right - MARGIN; | 
| 143 |  | -      arrow.right = tooltip.right + MARGIN; | 
|  | 172 | +      arrow[end] = tooltip[end] + MARGIN; | 
| 144 | 173 |     } else { | 
| 145 |  | -      tooltip.left = Math.max(obj.left, 0); | 
|  | 174 | +      tooltip[start] = Math.max(obj.left, 0); | 
| 146 | 175 |       tooltip.left = tooltip.left === 0 ? tooltip.left + MARGIN : tooltip.left; | 
| 147 | 176 |       tooltip.maxWidth = layout.width - tooltip.left - MARGIN; | 
| 148 |  | -      arrow.left = tooltip.left + MARGIN; | 
|  | 177 | +      arrow[start] = tooltip[start] + MARGIN; | 
| 149 | 178 |     } | 
| 150 | 179 | 
 | 
| 151 | 180 |     const animate = { | 
| @@ -249,7 +278,7 @@ class CopilotModal extends Component<Props, State> { | 
| 249 | 278 |         style={[ | 
| 250 | 279 |           styles.stepNumberContainer, | 
| 251 | 280 |           { | 
| 252 |  | -            left: this.state.animatedValues.stepNumberLeft, | 
|  | 281 | +            [start]: this.state.animatedValues.stepNumberLeft, | 
| 253 | 282 |             top: Animated.add(this.state.animatedValues.top, -STEP_NUMBER_RADIUS), | 
| 254 | 283 |           }, | 
| 255 | 284 |         ]} | 
|  | 
0 commit comments