Skip to content

Add unreportedExpense to report page #60352

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
e365f44
cherry-pick all changes
sumo-slonik Apr 16, 2025
2cd8507
working solution
sumo-slonik Apr 18, 2025
2276cf0
fix navigation
sumo-slonik Apr 18, 2025
bdb86ef
working in progress
sumo-slonik Apr 22, 2025
fd6c7de
Merge branch 'main' into feature/kuba-nowakowski/unreported_expense_p…
sumo-slonik Apr 22, 2025
5f1a6b4
fixing optimistic data
sumo-slonik Apr 22, 2025
c521fd9
cleanup code
sumo-slonik Apr 22, 2025
72104dd
remove unnecessary button and add translations
sumo-slonik Apr 23, 2025
6d299e1
fix eslint's errors
sumo-slonik Apr 23, 2025
f77f2a8
tes canBeMissing removal
sumo-slonik Apr 23, 2025
989b2fc
fix css
sumo-slonik Apr 23, 2025
a667682
fix transaction type
sumo-slonik Apr 24, 2025
c73a641
Merge branch 'main' into feature/kuba-nowakowski/unreported_expense_p…
sumo-slonik Apr 24, 2025
011ad8f
fix canBeMissing for new report flow
sumo-slonik Apr 24, 2025
b948ef2
fix types after main marge
sumo-slonik Apr 24, 2025
9290800
fix error types after merge
sumo-slonik Apr 24, 2025
c033b39
fix position of circle and total amount
sumo-slonik Apr 28, 2025
1a71992
Merge branch 'main' into feature/kuba-nowakowski/unreported_expense_p…
sumo-slonik Apr 28, 2025
0d34323
Merge branch 'main' into feature/kuba-nowakowski/unreported_expense_p…
sumo-slonik Apr 29, 2025
46076bc
change unreported select icon
sumo-slonik Apr 29, 2025
10a37ae
fix checks
sumo-slonik Apr 29, 2025
075dcdc
changes after review
sumo-slonik Apr 30, 2025
bf64947
Merge branch 'main' into feature/kuba-nowakowski/unreported_expense_p…
sumo-slonik Apr 30, 2025
067a2aa
changes after review
sumo-slonik May 5, 2025
e758197
change names of styles
sumo-slonik May 5, 2025
4539fee
Merge branch 'main' into feature/kuba-nowakowski/unreported_expense_p…
sumo-slonik May 5, 2025
bafbf31
fix view style
sumo-slonik May 5, 2025
3b7099c
Merge branch 'main' into feature/kuba-nowakowski/unreported_expense_p…
sumo-slonik May 6, 2025
a0af98f
Merge branch 'main' into feature/kuba-nowakowski/unreported_expense_p…
sumo-slonik May 6, 2025
4a2f3d5
resolve conflicts
sumo-slonik May 6, 2025
4a4c882
Merge branch 'main' into feature/kuba-nowakowski/unreported_expense_p…
sumo-slonik May 6, 2025
c3404bd
fix prettier
sumo-slonik May 6, 2025
48a8abb
fix padding in unreported expense
sumo-slonik May 6, 2025
b622118
fixes after review
sumo-slonik May 7, 2025
d55b108
add error for unselected unreported expense
sumo-slonik May 7, 2025
86331e3
fix eslint
sumo-slonik May 7, 2025
adf631c
Merge branch 'main' into feature/kuba-nowakowski/unreported_expense_p…
sumo-slonik May 8, 2025
ed2ead3
resolve conflicts
sumo-slonik May 8, 2025
82b05b8
fix translation od error in unreported expense page
sumo-slonik May 8, 2025
ed77507
Merge branch 'main' into feature/kuba-nowakowski/unreported_expense_p…
sumo-slonik May 8, 2025
8ed14bf
Merge branch 'main' into feature/kuba-nowakowski/unreported_expense_p…
sumo-slonik May 8, 2025
0eb256c
fix export
sumo-slonik May 8, 2025
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
4 changes: 4 additions & 0 deletions src/ROUTES.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2334,6 +2334,10 @@ const ROUTES = {
route: 'settings/workspaces/:policyID/accounting/sage-intacct/advanced/payment-account',
getRoute: (policyID: string) => `settings/workspaces/${policyID}/accounting/sage-intacct/advanced/payment-account` as const,
},
ADD_UNREPORTED_EXPENSE: {
route: 'search/r/:reportID/AddUnreportedExpense',
getRoute: (reportID: string | undefined) => `search/r/${reportID}/AddUnreportedExpense` as const,
},
DEBUG_REPORT: {
route: 'debug/report/:reportID',
getRoute: (reportID: string | undefined) => `debug/report/${reportID}` as const,
Expand Down
2 changes: 2 additions & 0 deletions src/SCREENS.ts
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,7 @@ const SCREENS = {
REPORT_EXPORT: 'Report_Export',
MISSING_PERSONAL_DETAILS: 'MissingPersonalDetails',
DEBUG: 'Debug',
ADD_UNREPORTED_EXPENSE: 'AddUnreportedExpense',
},
PUBLIC_CONSOLE_DEBUG: 'Console_Debug',
ONBOARDING_MODAL: {
Expand Down Expand Up @@ -692,6 +693,7 @@ const SCREENS = {
FEATURE_TRAINING_ROOT: 'FeatureTraining_Root',
RESTRICTED_ACTION_ROOT: 'RestrictedAction_Root',
MISSING_PERSONAL_DETAILS_ROOT: 'MissingPersonalDetails_Root',
ADD_UNREPORTED_EXPENSES_ROOT: 'AddUnreportedExpenses_Root',
DEBUG: {
REPORT: 'Debug_Report',
REPORT_ACTION: 'Debug_Report_Action',
Expand Down
10 changes: 8 additions & 2 deletions src/components/SelectionList/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,15 @@
import type {SearchRouterItem} from '@components/Search/SearchAutocompleteList';
import type {SearchColumnType} from '@components/Search/types';
import type {BrickRoad} from '@libs/WorkspacesSettingsUtils';
import type UnreportedExpenseListItem from '@pages/UnreportedExpenseListItem';
// eslint-disable-next-line no-restricted-imports
import type CursorStyles from '@styles/utils/cursor/types';
import type CONST from '@src/CONST';
import type {Attendee} from '@src/types/onyx/IOU';
import type {Errors, Icon, PendingAction} from '@src/types/onyx/OnyxCommon';
import type {SearchPersonalDetails, SearchReport, SearchReportAction, SearchTransaction} from '@src/types/onyx/SearchResults';
import type {ReceiptErrors} from '@src/types/onyx/Transaction';
import type Transaction from '@src/types/onyx/Transaction';
import type ChildrenProps from '@src/types/utils/ChildrenProps';
import type IconAsset from '@src/types/utils/IconAsset';
import type ChatListItem from './ChatListItem';
Expand Down Expand Up @@ -147,7 +149,7 @@
icons?: Icon[];

/** Errors that this user may contain */
errors?: Errors;
errors?: Errors | ReceiptErrors;

/** The type of action that's pending */
pendingAction?: PendingAction;
Expand Down Expand Up @@ -347,6 +349,8 @@
FooterComponent?: ReactElement;
};

type TransactionListItem<TItem extends ListItem> = ListItemProps<TItem> & Transaction;

Check failure on line 352 in src/components/SelectionList/types.ts

View workflow job for this annotation

GitHub Actions / ESLint check

'TransactionListItem' is already defined

Check failure on line 352 in src/components/SelectionList/types.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

'TransactionListItem' is already defined

type InviteMemberListItemProps<TItem extends ListItem> = UserListItemProps<TItem>;

type RadioListItemProps<TItem extends ListItem> = ListItemProps<TItem>;
Expand Down Expand Up @@ -377,7 +381,8 @@
| typeof ChatListItem
| typeof SearchQueryListItem
| typeof SearchRouterItem
| typeof TravelDomainListItem;
| typeof TravelDomainListItem
| typeof UnreportedExpenseListItem;

type Section<TItem extends ListItem> = {
/** Title of the section */
Expand Down Expand Up @@ -748,6 +753,7 @@
TableListItemProps,
TransactionListItemProps,
TransactionListItemType,
TransactionListItem,
UserListItemProps,
ValidListItem,
ReportActionListItemType,
Expand Down
6 changes: 5 additions & 1 deletion src/components/TransactionItemRow/index.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import React from 'react';
import {View} from 'react-native';
import type {ViewStyle} from 'react-native';
import Checkbox from '@components/Checkbox';
import Hoverable from '@components/Hoverable';
import type {TableColumnSize} from '@components/Search/types';
Expand All @@ -26,6 +27,7 @@ function TransactionItemRow({
dateColumnSize,
shouldShowChatBubbleComponent = false,
onCheckboxPress,
containerStyles,
}: {
transactionItem: Transaction;
shouldUseNarrowLayout: boolean;
Expand All @@ -34,6 +36,7 @@ function TransactionItemRow({
dateColumnSize: TableColumnSize;
shouldShowChatBubbleComponent?: boolean;
onCheckboxPress: (transactionID: string) => void;
containerStyles?: ViewStyle[];
}) {
const styles = useThemeStyles();
const StyleUtils = useStyleUtils();
Expand All @@ -48,7 +51,8 @@ function TransactionItemRow({
{shouldUseNarrowLayout ? (
<Hoverable>
{(hovered) => (
<View style={[hovered ? styles.hoveredComponentBG : backgroundColor, styles.expenseWidgetRadius, styles.justifyContentEvenly, styles.gap3]}>
<View style={containerStyles ?? [hovered ? styles.hoveredComponentBG : backgroundColor, styles.p2, styles.expenseWidgetRadius]}>
{' '}
<View style={[styles.flexRow, styles.mt3, styles.mr3, styles.ml3]}>
<View style={[styles.mr3]}>
<ReceiptCell
Expand Down
1 change: 1 addition & 0 deletions src/languages/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1106,6 +1106,7 @@ const translations = {
unholdExpense: 'Unhold expense',
heldExpense: 'held this expense',
unheldExpense: 'unheld this expense',
moveUnreportedExpense: 'Move unreported expense',
explainHold: "Explain why you're holding this expense.",
reason: 'Reason',
holdReasonRequired: 'A reason is required when holding.',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import createPlatformStackNavigator from '@libs/Navigation/PlatformStackNavigati
import Animations from '@libs/Navigation/PlatformStackNavigation/navigationOptions/animation';
import type {
AddPersonalBankAccountNavigatorParamList,
AddUnreportedExpensesParamList,
ConsoleNavigatorParamList,
DebugParamList,
EditRequestNavigatorParamList,
Expand Down Expand Up @@ -750,6 +751,10 @@ const MissingPersonalDetailsModalStackNavigator = createModalStackNavigator<Miss
[SCREENS.MISSING_PERSONAL_DETAILS_ROOT]: () => require<ReactComponentModule>('../../../../pages/MissingPersonalDetails').default,
});

const AddingUnreportedExpenseModalStackNavigator = createModalStackNavigator<AddUnreportedExpensesParamList>({
[SCREENS.ADD_UNREPORTED_EXPENSES_ROOT]: () => require<ReactComponentModule>('../../../../pages/AddUnreportedExpense').default,
});

const DebugModalStackNavigator = createModalStackNavigator<DebugParamList>({
[SCREENS.DEBUG.REPORT]: () => require<ReactComponentModule>('../../../../pages/Debug/Report/DebugReportPage').default,
[SCREENS.DEBUG.REPORT_ACTION]: () => require<ReactComponentModule>('../../../../pages/Debug/ReportAction/DebugReportActionPage').default,
Expand Down Expand Up @@ -804,4 +809,5 @@ export {
DebugModalStackNavigator,
WorkspaceConfirmationModalStackNavigator,
ConsoleModalStackNavigator,
AddingUnreportedExpenseModalStackNavigator,
};
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,10 @@ function RightModalNavigator({navigation, route}: RightModalNavigatorProps) {
name={SCREENS.RIGHT_MODAL.MISSING_PERSONAL_DETAILS}
component={ModalStackNavigators.MissingPersonalDetailsModalStackNavigator}
/>
<Stack.Screen
name={SCREENS.RIGHT_MODAL.ADD_UNREPORTED_EXPENSE}
component={ModalStackNavigators.AddingUnreportedExpenseModalStackNavigator}
/>
</Stack.Navigator>
</View>
</NoDropZone>
Expand Down
5 changes: 5 additions & 0 deletions src/libs/Navigation/linkingConfig/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1469,6 +1469,11 @@ const config: LinkingOptions<RootNavigatorParamList>['config'] = {
[SCREENS.MISSING_PERSONAL_DETAILS_ROOT]: ROUTES.MISSING_PERSONAL_DETAILS,
},
},
[SCREENS.RIGHT_MODAL.ADD_UNREPORTED_EXPENSE]: {
screens: {
[SCREENS.ADD_UNREPORTED_EXPENSES_ROOT]: ROUTES.ADD_UNREPORTED_EXPENSE.route,
},
},
[SCREENS.RIGHT_MODAL.DEBUG]: {
screens: {
[SCREENS.DEBUG.REPORT]: {
Expand Down
8 changes: 8 additions & 0 deletions src/libs/Navigation/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1571,6 +1571,7 @@ type RightModalNavigatorParamList = {
[SCREENS.RIGHT_MODAL.SEARCH_SAVED_SEARCH]: NavigatorScreenParams<SearchSavedSearchParamList>;
[SCREENS.RIGHT_MODAL.MISSING_PERSONAL_DETAILS]: NavigatorScreenParams<MissingPersonalDetailsParamList>;
[SCREENS.RIGHT_MODAL.DEBUG]: NavigatorScreenParams<DebugParamList>;
[SCREENS.RIGHT_MODAL.ADD_UNREPORTED_EXPENSE]: NavigatorScreenParams<{reportId: string | undefined}>;
};

type TravelNavigatorParamList = {
Expand Down Expand Up @@ -1921,6 +1922,12 @@ type MissingPersonalDetailsParamList = {
[SCREENS.MISSING_PERSONAL_DETAILS_ROOT]: undefined;
};

type AddUnreportedExpensesParamList = {
[SCREENS.ADD_UNREPORTED_EXPENSES_ROOT]: {
reportID: string;
};
};

type DebugParamList = {
[SCREENS.DEBUG.REPORT]: {
reportID: string;
Expand Down Expand Up @@ -1980,6 +1987,7 @@ declare global {

export type {
AddPersonalBankAccountNavigatorParamList,
AddUnreportedExpensesParamList,
AuthScreensParamList,
BackToParams,
DebugParamList,
Expand Down
8 changes: 8 additions & 0 deletions src/libs/actions/Report.ts
Original file line number Diff line number Diff line change
Expand Up @@ -465,6 +465,14 @@
return `${CONST.PUSHER.PRIVATE_REPORT_CHANNEL_PREFIX}${reportID}${CONFIG.PUSHER.SUFFIX}`;
}

function openUnreportedExpense(reportID: string | undefined) {

Check failure on line 468 in src/libs/actions/Report.ts

View workflow job for this annotation

GitHub Actions / ESLint check

'openUnreportedExpense' is defined but never used

Check failure on line 468 in src/libs/actions/Report.ts

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

'openUnreportedExpense' is defined but never used
if (!reportID) {
return;
}
clearGroupChat();
Navigation.navigate(ROUTES.ADD_UNREPORTED_EXPENSE.getRoute(reportID));
}

/**
* There are 2 possibilities that we can receive via pusher for a user's typing/leaving status:
* 1. The "new" way from New Expensify is passed as {[login]: Boolean} (e.g. {[email protected]: true}), where the value
Expand Down
91 changes: 91 additions & 0 deletions src/pages/AddUnreportedExpense.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
import React, {useRef} from 'react';
import {useOnyx} from 'react-native-onyx';
import type {OnyxCollection} from 'react-native-onyx';
import HeaderWithBackButton from '@components/HeaderWithBackButton';
import ScreenWrapper from '@components/ScreenWrapper';
import SelectionList from '@components/SelectionList';
import type {ListItem, SectionListDataType, SelectionListHandle} from '@components/SelectionList/types';
import useThemeStyles from '@hooks/useThemeStyles';
import Navigation from '@navigation/Navigation';
import type {PlatformStackScreenProps} from '@navigation/PlatformStackNavigation/types';
import {changeTransactionsReport} from '@userActions/Transaction';
import ONYXKEYS from '@src/ONYXKEYS';
import ROUTES from '@src/ROUTES';
import type SCREENS from '@src/SCREENS';
import type Transaction from '@src/types/onyx/Transaction';
import NewChatSelectorPage from './NewChatSelectorPage';
import UnreportedExpenseListItem from './UnreportedExpenseListItem';

type AddUnreportedExpensePageType = PlatformStackScreenProps<AddUnreportedExpensesParamList, typeof SCREENS.ADD_UNREPORTED_EXPENSES_ROOT>;

type AddUnreportedExpensesParamList = {
[SCREENS.ADD_UNREPORTED_EXPENSES_ROOT]: {
reportID: string;
};
};

function AddUnreportedExpense({route}: AddUnreportedExpensePageType) {
function getUnreportedTransactions(transactions: OnyxCollection<Transaction>) {
if (!transactions) {
return [];
}
return Object.values(transactions || {}).filter((item) => item?.reportID === '0');
}

const [transactions = []] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION, {

Check failure on line 35 in src/pages/AddUnreportedExpense.tsx

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

useOnyx() calls require you to pass the "canBeMissing" param
selector: (_transactions) => getUnreportedTransactions(_transactions),
initialValue: [],
});

const styles = useThemeStyles();
const selectionListRef = useRef<SelectionListHandle>(null);
const sections: Array<SectionListDataType<Transaction & ListItem>> = [
{
shouldShow: true,
data: transactions,

Check failure on line 45 in src/pages/AddUnreportedExpense.tsx

View workflow job for this annotation

GitHub Actions / typecheck

Type '(({ amount: number; taxAmount?: number | undefined; taxCode?: string | undefined; billable?: boolean | undefined; category?: string | undefined; comment?: Comment | undefined; ... 43 more ...; inserted?: string | undefined; } & OfflineFeedback<...>) | undefined)[]' is not assignable to type 'readonly ({ amount: number; taxAmount?: number | undefined; taxCode?: string | undefined; billable?: boolean | undefined; category?: string | undefined; comment?: Comment | undefined; ... 43 more ...; inserted?: string | undefined; } & OfflineFeedback<...> & ListItem)[] & ({ ...; } & ... 1 more ... & ListItem)[]'.
},
];
const reportID = route.params.reportID;
const selectedIds = new Set<string>();
const [report] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${reportID}`);

Check failure on line 50 in src/pages/AddUnreportedExpense.tsx

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

useOnyx() calls require you to pass the "canBeMissing" param

return (
<ScreenWrapper
shouldEnableKeyboardAvoidingView={false}
includeSafeAreaPaddingBottom
shouldShowOfflineIndicator={false}
includePaddingTop={false}
shouldEnablePickerAvoiding={false}
testID={NewChatSelectorPage.displayName}
focusTrapSettings={{active: false}}
>
<HeaderWithBackButton
title="Add unreported expanse"
onBackButtonPress={Navigation.goBack}
/>
<SelectionList<Transaction & ListItem>
ref={selectionListRef}
onSelectRow={(item) => {
if (selectedIds.has(item.transactionID)) {
selectedIds.delete(item.transactionID);
} else {
selectedIds.add(item.transactionID);
}
}}
shouldShowTextInput={false}
canSelectMultiple
sections={sections}
ListItem={UnreportedExpenseListItem}
confirmButtonStyles={[styles.justifyContentCenter]}
showConfirmButton
confirmButtonText="Add to report"
onConfirm={() => {
changeTransactionsReport([...selectedIds], report?.reportID ?? '0');

Check failure on line 83 in src/pages/AddUnreportedExpense.tsx

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

Navigation.goBack(ROUTES.SEARCH_MONEY_REQUEST_REPORT.getRoute({reportID, backTo: Navigation.getActiveRoute()}));
}}
/>
</ScreenWrapper>
);
}

export default AddUnreportedExpense;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

display name missing

78 changes: 78 additions & 0 deletions src/pages/UnreportedExpenseListItem.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
import React, {useState} from 'react';
import {View} from 'react-native';
import type {ViewStyle} from 'react-native';
import SelectCircle from '@components/SelectCircle';
import BaseListItem from '@components/SelectionList/BaseListItem';
import type {ListItem, ListItemProps} from '@components/SelectionList/types';
import TransactionItemRow from '@components/TransactionItemRow';
import useAnimatedHighlightStyle from '@hooks/useAnimatedHighlightStyle';
import useTheme from '@hooks/useTheme';
import useThemeStyles from '@hooks/useThemeStyles';
import variables from '@styles/variables';
import type Transaction from '@src/types/onyx/Transaction';

const emptyStylesArray: ViewStyle[] = [];

function UnreportedExpenseListItem<TItem extends ListItem & Transaction>({
item,
isFocused,
showTooltip,
isDisabled,
canSelectMultiple,
onFocus,
shouldSyncFocus,
onSelectRow,
}: ListItemProps<TItem>) {
const styles = useThemeStyles();
const [isSelected, setIsSelected] = useState<boolean>(false);
const theme = useTheme();

const backgroundColor = isSelected ? styles.buttonDefaultBG : styles.highlightBG;

const animatedHighlightStyle = useAnimatedHighlightStyle({
borderRadius: variables.componentBorderRadius,
shouldHighlight: item?.shouldAnimateInHighlight ?? false,
highlightColor: theme.messageHighlightBG,
backgroundColor: theme.highlightBG,
});
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This hook is used for highlighting items that pop up on Search page, while the user is focused on it. Since we don't suppport highlighting new items on AddUnreportedExpense page(i hope :D), I think we can just remove this hook from here.

Suggested change
const animatedHighlightStyle = useAnimatedHighlightStyle({
borderRadius: variables.componentBorderRadius,
shouldHighlight: item?.shouldAnimateInHighlight ?? false,
highlightColor: theme.messageHighlightBG,
backgroundColor: theme.highlightBG,
});

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is used as the style of the currently selected components by an external checkbox.


return (
<BaseListItem
item={item}
isFocused={isFocused}
isDisabled={isDisabled}
showTooltip={showTooltip}
canSelectMultiple={canSelectMultiple}
pendingAction={item.pendingAction}
keyForList={item.keyForList}
onFocus={onFocus}
shouldSyncFocus={shouldSyncFocus}
pressableWrapperStyle={[animatedHighlightStyle, backgroundColor]}
onSelectRow={() => {
onSelectRow(item);
setIsSelected((val) => !val);
}}
containerStyle={[styles.p3, styles.mbn4, styles.expenseWidgetRadius]}
hoverStyle={[styles.borderRadiusComponentNormal]}
>
<View style={[{flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between'}]}>
<TransactionItemRow
transactionItem={item}
shouldUseNarrowLayout
isSelected={isSelected}
shouldShowTooltip={false}
dateColumnSize="normal"
onCheckboxPress={() => {}}
containerStyles={emptyStylesArray}
/>
<View style={[styles.pb3, styles.justifyContentCenter, styles.alignItemsCenter, styles.expenseWidgetSelectCircle, styles.mln2, styles.pr2]}>
<SelectCircle isChecked={isSelected} />
</View>
</View>
</BaseListItem>
);
}

UnreportedExpenseListItem.displayName = 'unreportedExpenseListItem';

export default UnreportedExpenseListItem;
Loading
Loading