Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 4 additions & 6 deletions .claude/skills/playwright-app-testing/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,12 +30,10 @@ ps aux | grep "webpack" | grep -v grep
## Playwright Testing Workflow

1. **Verify server**: Check webpack process is running
2. **Navigate**: Use `mcp__playwright__browser_navigate` to `https://dev.new.expensify.com:8082/`
3. **Interact**: Use Playwright MCP tools including:
- **Inspection**: `browser_snapshot`, `browser_take_screenshot`, `browser_console_messages`
- **Interaction**: `browser_click`, `browser_type`, `browser_fill_form`, `browser_hover`
- **Navigation**: `browser_navigate_back`, `browser_tabs`, `browser_wait_for`
- All other Playwright tools as needed
2. **Navigate**: Open `https://dev.new.expensify.com:8082/` in the browser
3. **Interact**: Use Playwright MCP tools to inspect, click, type, and navigate

Do NOT add arbitrary waits after actions. Instead, take a snapshot to check the result and only add short waits if the page hasn't updated yet.

## Dev Environment Sign-In

Expand Down
1 change: 1 addition & 0 deletions src/components/FloatingActionButton.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,7 @@ function FloatingActionButton({onPress, onLongPress, isActive, accessibilityLabe
<Svg
width={fabSize}
height={fabSize}
pointerEvents="none"
>
<AnimatedPath
d={isLHBVisible ? SMALL_FAB_PATH : FAB_PATH}
Expand Down
4 changes: 4 additions & 0 deletions src/components/Icon/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,7 @@ function Icon({
<View
testID={testID}
style={[StyleUtils.getWidthAndHeightStyle(width ?? 0, height), styles.bgTransparent, styles.overflowVisible]}
pointerEvents="none"
>
<View style={iconStyles}>
<ImageSVG
Expand All @@ -145,6 +146,7 @@ function Icon({
hovered={hovered}
pressed={pressed}
contentFit={contentFit}
pointerEvents="none"
/>
</View>
</View>
Expand Down Expand Up @@ -196,6 +198,7 @@ function Icon({
accessibilityElementsHidden
importantForAccessibility="no-hide-descendants"
accessible={false}
pointerEvents="none"
>
<ImageSVG
src={src}
Expand All @@ -205,6 +208,7 @@ function Icon({
hovered={hovered}
pressed={pressed}
contentFit={contentFit}
pointerEvents="none"
/>
</View>
);
Expand Down
7 changes: 6 additions & 1 deletion src/components/RadioButtonWithLabel.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,9 @@ type RadioButtonWithLabelProps = ForwardedFSClassProps & {
/** React element to display for the label */
labelElement?: ReactNode;

/** Specifies the accessibility label for the radio button. Falls back to label if not provided. */
accessibilityLabel?: string;

/** Should the input be styled for errors */
hasError?: boolean;

Expand All @@ -47,6 +50,7 @@ function RadioButtonWithLabel({
labelElement,
style,
label = '',
accessibilityLabel,
hasError = false,
errorText = '',
isChecked,
Expand All @@ -67,10 +71,11 @@ function RadioButtonWithLabel({
<RadioButton
isChecked={isChecked}
onPress={onPress}
accessibilityLabel={label}
accessibilityLabel={accessibilityLabel ?? label}
hasError={hasError}
/>
<PressableWithFeedback
sentryLabel="RadioButtonWithLabel"
tabIndex={-1}
accessible={false}
onPress={onPress}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,8 @@ function BaseTextInput({
shouldUseDefaultLineHeightForPrefix = true,
ref,
sentryLabel,

role,
...inputProps
}: BaseTextInputProps) {
const InputComponent = InputComponentMap.get(type) ?? RNTextInput;
Expand Down Expand Up @@ -440,6 +442,9 @@ function BaseTextInput({
}}
// eslint-disable-next-line
{...inputProps}
// Filter out role="presentation" so it doesn't strip the native
// semantics of the <input>. Other roles (e.g. searchbox) are preserved.
role={role === CONST.ROLE.PRESENTATION ? undefined : role}
autoCorrect={inputProps.secureTextEntry ? false : autoCorrect}
placeholder={newPlaceholder}
placeholderTextColor={placeholderTextColor ?? theme.placeholderText}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -196,16 +196,17 @@ function BaseOnboardingAccounting({shouldUseNativeStyles, route}: BaseOnboarding
const renderOption = useCallback(
(item: OnboardingListItem) => (
<PressableWithoutFeedback
sentryLabel="OnboardingAccounting-integrationOption"
key={item.keyForList ?? ''}
onPress={() => handleIntegrationSelect(item.keyForList)}
accessibilityLabel={item.text}
accessible={false}
hoverStyle={!item.isSelected ? styles.hoveredComponentBG : undefined}
style={[styles.onboardingAccountingItem, isSmallScreenWidth && styles.flexBasis100, item.isSelected && styles.activeComponentBG]}
>
<RadioButtonWithLabel
isChecked={!!item.isSelected}
onPress={() => handleIntegrationSelect(item.keyForList)}
accessibilityLabel={item.text}
style={[styles.flexRowReverse]}
wrapperStyle={[styles.ml0]}
labelElement={
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ exports[`getInitialAvatarSvg matches snapshot for a letter avatar 1`] = `
accessibilityElementsHidden={true}
accessible={false}
importantForAccessibility="no-hide-descendants"
pointerEvents="none"
style={[]}
testID=""
>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ exports[`PresetAvatarCatalog matches snapshot for a default avatar 1`] = `
accessibilityElementsHidden={true}
accessible={false}
importantForAccessibility="no-hide-descendants"
pointerEvents="none"
style={[]}
testID=""
>
Expand Down
Loading