Skip to content

Commit f8b5b52

Browse files
authored
Picker - add driver (initial) (#2905)
* Picker - add driver (initial) * Remove driver
1 parent 5a6fa4c commit f8b5b52

File tree

9 files changed

+289
-55
lines changed

9 files changed

+289
-55
lines changed

src/components/modal/Modal.driver.new.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import {ModalProps} from './index';
22
import {useComponentDriver, ComponentProps} from '../../testkit/new/Component.driver';
3-
import {usePressableDriver} from '../../testkit/new/usePressable.driver';
3+
import {ButtonDriver} from '../button/Button.driver.new';
44

55
export const ModalDriver = (props: ComponentProps) => {
66
const {renderTree, testID} = props;
77
const driver = useComponentDriver<ModalProps>(props);
8-
const overlayDriver = usePressableDriver<{}>(useComponentDriver<{}>({renderTree, testID: `${testID}.TouchableOverlay`}));
9-
8+
const overlayDriver = ButtonDriver({renderTree, testID: `${testID}.TouchableOverlay`});
9+
1010
const isVisible = () => {
1111
return !!driver.getProps().visible;
1212
};

src/components/modal/TopBar.tsx

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ export interface ModalTopBarProps {
8181
* Whether or not to handle SafeArea
8282
*/
8383
useSafeArea?: boolean;
84+
testID?: string;
8485
}
8586

8687
type topBarButtonProp = {
@@ -89,6 +90,7 @@ type topBarButtonProp = {
8990
icon?: ImageSourcePropType | null;
9091
accessibilityLabel?: string;
9192
buttonProps?: Omit<ButtonProps, 'onPress'>;
93+
testID?: string;
9294
};
9395

9496
const TOP_BAR_HEIGHT = Constants.isIOS ? 44 : 56;
@@ -111,7 +113,7 @@ class TopBar extends Component<ModalTopBarProps> {
111113
includeStatusBar: Constants.isIOS
112114
};
113115

114-
renderTopBarButton({onPress, label, icon, accessibilityLabel, buttonProps}: topBarButtonProp, key: string) {
116+
renderTopBarButton({onPress, label, icon, accessibilityLabel, buttonProps, testID}: topBarButtonProp, key: string) {
115117
if (onPress && (label || icon)) {
116118
return (
117119
<Button
@@ -125,31 +127,34 @@ class TopBar extends Component<ModalTopBarProps> {
125127
{...DEFAULT_BUTTON_PROPS}
126128
accessibilityLabel={accessibilityLabel}
127129
hitSlop={{top: 10, bottom: 10, left: 20, right: 20}}
130+
testID={testID}
128131
{...buttonProps}
129132
/>
130133
);
131134
}
132135
}
133136

134137
renderDone() {
135-
const {doneButtonProps, doneLabel, doneIcon, onDone} = this.props;
138+
const {doneButtonProps, doneLabel, doneIcon, onDone, testID} = this.props;
136139
return this.renderTopBarButton({
137140
onPress: onDone,
138141
label: doneLabel,
139142
icon: doneIcon,
140143
accessibilityLabel: 'Done',
144+
testID: `${testID}.done`,
141145
buttonProps: doneButtonProps
142146
},
143147
'done');
144148
}
145149

146150
renderCancel() {
147-
const {cancelButtonProps, cancelLabel, cancelIcon, onCancel} = this.props;
151+
const {cancelButtonProps, cancelLabel, cancelIcon, onCancel, testID} = this.props;
148152
return this.renderTopBarButton({
149153
onPress: onCancel,
150154
label: cancelLabel,
151155
icon: cancelIcon,
152156
accessibilityLabel: 'Cancel',
157+
testID: `${testID}.cancel`,
153158
buttonProps: cancelButtonProps
154159
},
155160
'cancel');
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import {ComponentProps} from '../../testkit/new/Component.driver';
2+
import {TextFieldDriver} from '../textField/TextField.driver.new';
3+
import {ModalDriver} from '../modal/Modal.driver.new';
4+
import {DialogDriver} from '../../incubator/Dialog/Dialog.driver.new';
5+
import {ButtonDriver} from '../button/Button.driver.new';
6+
7+
export const PickerDriver = (props: ComponentProps) => {
8+
const textFieldDriver = TextFieldDriver({
9+
renderTree: props.renderTree,
10+
testID: `${props.testID}.input`
11+
});
12+
const modalDriver = ModalDriver({
13+
renderTree: props.renderTree,
14+
testID: `${props.testID}.overlay`
15+
});
16+
const dialogDriver = DialogDriver({
17+
renderTree: props.renderTree,
18+
testID: `${props.testID}.overlay`
19+
});
20+
const cancelButtonDriver = ButtonDriver({
21+
renderTree: props.renderTree,
22+
testID: `${props.testID}.modal.topBar.cancel`
23+
});
24+
const doneButtonDriver = ButtonDriver({
25+
renderTree: props.renderTree,
26+
testID: `${props.testID}.modal.topBar.done`
27+
});
28+
29+
const getValue = (): string | undefined => {
30+
return textFieldDriver.getValue();
31+
};
32+
33+
const open = (): void => {
34+
textFieldDriver.press();
35+
};
36+
37+
const cancel = (): void => {
38+
cancelButtonDriver.press();
39+
};
40+
41+
const done = (): void => {
42+
doneButtonDriver.press();
43+
};
44+
45+
const isOpen = (): boolean => {
46+
// TODO: we should find a better solution for when using useDialog (maybe in the refactor)
47+
if (modalDriver.exists()) {
48+
return modalDriver.isVisible();
49+
} else {
50+
return dialogDriver.getModal().isVisible();
51+
}
52+
};
53+
54+
const selectItem = (testID: string): void => {
55+
const itemDriver = ButtonDriver({renderTree: props.renderTree, testID});
56+
itemDriver.press();
57+
};
58+
59+
return {
60+
getValue,
61+
open,
62+
cancel,
63+
done,
64+
isOpen,
65+
selectItem
66+
};
67+
};

src/components/picker/PickerItemsList.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ const PickerItemsList = (props: PickerItemsListProps) => {
150150
if (renderCustomDialogHeader) {
151151
return renderCustomDialogHeader?.({onDone: topBarProps?.onDone, onCancel: topBarProps?.onCancel});
152152
} else if (!useDialog || mode === PickerModes.MULTI) {
153-
return <Modal.TopBar {...topBarProps}/>;
153+
return <Modal.TopBar testID={`${props.testID}.topBar`} {...topBarProps}/>;
154154
}
155155
};
156156

0 commit comments

Comments
 (0)