Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
42e0672
Feature: [Travel Invoicing] Release 2.1: Opening the Travel Invoicing…
ikevin127 Jan 7, 2026
7f42902
fix: failing workflows
ikevin127 Jan 7, 2026
63b6324
Merge branch 'main' of https://github.com/Expensify/App into ikevin12…
ikevin127 Jan 8, 2026
cc4455d
fix: updated UI and resolved failing workflows
ikevin127 Jan 9, 2026
2caea0a
fix: eslint - ready for review
ikevin127 Jan 9, 2026
3442294
Merge branch 'main' of https://github.com/Expensify/App into ikevin12…
ikevin127 Jan 9, 2026
e775554
fix: mobile UI padding and illustrations export order
ikevin127 Jan 9, 2026
db51b68
fix: removed unused translations
ikevin127 Jan 9, 2026
4268f79
fix: confirmed translation suggestion
ikevin127 Jan 12, 2026
ca83f0e
Merge branch 'main' of https://github.com/Expensify/App into ikevin12…
ikevin127 Jan 12, 2026
13ea366
Merge branch 'main' of https://github.com/Expensify/App into ikevin12…
ikevin127 Jan 13, 2026
808afdf
fix: updated translations, added Learn how link
ikevin127 Jan 14, 2026
bfd14b3
chore: submodule sync
ikevin127 Jan 14, 2026
540ae51
Merge branch 'main' of https://github.com/Expensify/App into ikevin12…
ikevin127 Jan 16, 2026
22deb05
feat: integrate 'OpenPolicyTravelPage' API
ikevin127 Jan 16, 2026
35fd25d
chore: submodule sync
ikevin127 Jan 16, 2026
47fc114
feat: release 2.3 - update settlement account flow
ikevin127 Jan 17, 2026
b9cf2ca
fix: clear error logic w/ tests
ikevin127 Jan 17, 2026
3f3369a
chore: draft preparation
ikevin127 Jan 17, 2026
58a0448
fix: eslint
ikevin127 Jan 17, 2026
530d292
fix: lint
ikevin127 Jan 17, 2026
5912c27
fix: CI, BE integration, optimistic behaviour, styles
ikevin127 Jan 17, 2026
b58d69d
fix: default frequency adjustment and eslint
ikevin127 Jan 17, 2026
21d0155
fix: unit test
ikevin127 Jan 17, 2026
c9cb1d7
fix: codex review and error handling
ikevin127 Jan 17, 2026
e055dcd
fix: updated tests
ikevin127 Jan 17, 2026
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
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
8 changes: 8 additions & 0 deletions src/ROUTES.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2460,6 +2460,14 @@ const ROUTES = {
return `workspaces/${policyID}/travel` as const;
},
},
WORKSPACE_TRAVEL_SETTINGS_ACCOUNT: {
route: 'workspaces/:policyID/travel/settings/account',
getRoute: (policyID: string) => `workspaces/${policyID}/travel/settings/account` as const,
},
WORKSPACE_TRAVEL_SETTINGS_FREQUENCY: {
route: 'workspaces/:policyID/travel/settings/frequency',
getRoute: (policyID: string) => `workspaces/${policyID}/travel/settings/frequency` as const,
},
WORKSPACE_CREATE_DISTANCE_RATE: {
route: 'workspaces/:policyID/distance-rates/new',
getRoute: (policyID: string, transactionID?: string, reportID?: string) =>
Expand Down
2 changes: 2 additions & 0 deletions src/SCREENS.ts
Original file line number Diff line number Diff line change
Expand Up @@ -703,6 +703,8 @@ const SCREENS = {
OWNER_CHANGE_ERROR: 'Workspace_Owner_Change_Error',
DISTANCE_RATES: 'Distance_Rates',
TRAVEL: 'Travel',
TRAVEL_SETTINGS_ACCOUNT: 'Workspace_Travel_Settings_Account',
TRAVEL_SETTINGS_FREQUENCY: 'Workspace_Travel_Settings_Frequency',
CREATE_DISTANCE_RATE: 'Create_Distance_Rate',
CREATE_DISTANCE_RATE_UPGRADE: 'Create_Distance_Rate_Upgrade',
DISTANCE_RATES_SETTINGS: 'Distance_Rates_Settings',
Expand Down
66 changes: 35 additions & 31 deletions src/components/Icon/Illustrations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import Approval from '@assets/images/simple-illustrations/simple-illustration__a
import Binoculars from '@assets/images/simple-illustrations/simple-illustration__binoculars.svg';
import BlueShield from '@assets/images/simple-illustrations/simple-illustration__blueshield.svg';
import Buildings from '@assets/images/simple-illustrations/simple-illustration__buildings.svg';
import CalendarMonthly from '@assets/images/simple-illustrations/simple-illustration__calendar-monthly.svg';
import CarIce from '@assets/images/simple-illustrations/simple-illustration__car-ice.svg';
import Car from '@assets/images/simple-illustrations/simple-illustration__car.svg';
import ChatBubbles from '@assets/images/simple-illustrations/simple-illustration__chatbubbles.svg';
Expand All @@ -27,6 +28,7 @@ import EmailAddress from '@assets/images/simple-illustrations/simple-illustratio
import EmptyShelves from '@assets/images/simple-illustrations/simple-illustration__empty-shelves.svg';
import Encryption from '@assets/images/simple-illustrations/simple-illustration__encryption.svg';
import EnvelopeReceipt from '@assets/images/simple-illustrations/simple-illustration__envelopereceipt.svg';
import FastMoney from '@assets/images/simple-illustrations/simple-illustration__fastmoney.svg';
import Filters from '@assets/images/simple-illustrations/simple-illustration__filters.svg';
import Flash from '@assets/images/simple-illustrations/simple-illustration__flash.svg';
import Gears from '@assets/images/simple-illustrations/simple-illustration__gears.svg';
Expand All @@ -45,49 +47,51 @@ import ExpensifyApprovedLogo from '@assets/images/subscription-details__approved
import TurtleInShell from '@assets/images/turtle-in-shell.svg';

export {
Encryption,
Abacus,
Alert,
Approval,
Binoculars,
BlueShield,
Buildings,
CalendarMonthly,
Car,
CarIce,
ChatBubbles,
Computer,
CheckmarkCircle,
Clock,
CommentBubbles,
Computer,
ConciergeBot,
ConciergeBubble,
CreditCardEyes,
CreditCardsNewGreen,
EmailAddress,
EmptyCardState,
EmptyShelves,
EmptyStateTravel,
Encryption,
EnvelopeReceipt,
ExpensifyApprovedLogo,
ExpensifyCardImage,
Mailbox,
CreditCardsNewGreen,
FastMoney,
Filters,
Flash,
Gears,
HeadSet,
Hourglass,
House,
LaptopWithSecondScreenAndHourglass,
LaptopWithSecondScreenSync,
LaptopWithSecondScreenX,
Lightbulb,
LockClosed,
LockClosedOrange,
LockOpen,
Luggage,
MagnifyingGlassReceipt,
ConciergeBot,
ConciergeBubble,
HeadSet,
Hourglass,
CommentBubbles,
Puzzle,
LockClosed,
Gears,
Approval,
House,
Buildings,
Alert,
Abacus,
Binoculars,
Car,
Mailbox,
Pencil,
CarIce,
Lightbulb,
ExpensifyApprovedLogo,
CheckmarkCircle,
CreditCardEyes,
LockClosedOrange,
Filters,
TurtleInShell,
Flash,
PendingTravel,
EmptyStateTravel,
EmptyShelves,
BlueShield,
Puzzle,
TurtleInShell,
};
4 changes: 4 additions & 0 deletions src/components/Icon/chunks/illustrations.chunk.ts
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ import Binoculars from '@assets/images/simple-illustrations/simple-illustration_
import BlueShield from '@assets/images/simple-illustrations/simple-illustration__blueshield.svg';
import Building from '@assets/images/simple-illustrations/simple-illustration__building.svg';
import Buildings from '@assets/images/simple-illustrations/simple-illustration__buildings.svg';
import CalendarMonthly from '@assets/images/simple-illustrations/simple-illustration__calendar-monthly.svg';
import CarIce from '@assets/images/simple-illustrations/simple-illustration__car-ice.svg';
import Car from '@assets/images/simple-illustrations/simple-illustration__car.svg';
import ChatBubbles from '@assets/images/simple-illustrations/simple-illustration__chatbubbles.svg';
Expand All @@ -110,6 +111,7 @@ import EmailAddress from '@assets/images/simple-illustrations/simple-illustratio
import EmptyShelves from '@assets/images/simple-illustrations/simple-illustration__empty-shelves.svg';
import Encryption from '@assets/images/simple-illustrations/simple-illustration__encryption.svg';
import EnvelopeReceipt from '@assets/images/simple-illustrations/simple-illustration__envelopereceipt.svg';
import FastMoney from '@assets/images/simple-illustrations/simple-illustration__fastmoney.svg';
import Filters from '@assets/images/simple-illustrations/simple-illustration__filters.svg';
import Flash from '@assets/images/simple-illustrations/simple-illustration__flash.svg';
import FolderOpen from '@assets/images/simple-illustrations/simple-illustration__folder-open.svg';
Expand Down Expand Up @@ -309,6 +311,7 @@ const Illustrations = {
Approval,
Binoculars,
Buildings,
CalendarMonthly,
Car,
ChatBubbles,
CheckmarkCircle,
Expand All @@ -320,6 +323,7 @@ const Illustrations = {
EmptyShelves,
Encryption,
EnvelopeReceipt,
FastMoney,
Filters,
Flash,
Gears,
Expand Down
9 changes: 8 additions & 1 deletion src/components/MenuItem.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@
import FormHelpMessage from './FormHelpMessage';
import Hoverable from './Hoverable';
import Icon from './Icon';
import * as Expensicons from './Icon/Expensicons';

Check warning on line 39 in src/components/MenuItem.tsx

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

'./Icon/Expensicons' import is restricted from being used by a pattern. Direct imports from Icon/Expensicons are deprecated. Please use lazy loading hooks instead. Use `useMemoizedLazyExpensifyIcons` from @hooks/useLazyAsset. See docs/LAZY_ICONS_AND_ILLUSTRATIONS.md for details
import {MenuItemGroupContext} from './MenuItemGroup';
import PlaidCardFeedIcon from './PlaidCardFeedIcon';
import type {PressableRef} from './Pressable/GenericPressable/types';
Expand Down Expand Up @@ -401,6 +401,9 @@
/** Whether the screen containing the item is focused */
isFocused?: boolean;

/** Additional styles for the root wrapper View */
rootWrapperStyle?: StyleProp<ViewStyle>;

/** Whether to show the badge in a separate row */
shouldShowBadgeInSeparateRow?: boolean;

Expand Down Expand Up @@ -544,6 +547,7 @@
ref,
isFocused,
sentryLabel,
rootWrapperStyle,
shouldBeAccessible = true,
tabIndex = 0,
}: MenuItemProps) {
Expand Down Expand Up @@ -697,7 +701,10 @@
const isIDPassed = !!iconReportID || !!iconAccountID || iconAccountID === CONST.DEFAULT_NUMBER_ID;

return (
<View onBlur={onBlur}>
<View
style={rootWrapperStyle}
onBlur={onBlur}
>
{!!label && !isLabelHoverable && (
<View style={[styles.ph5, labelStyle]}>
<Text style={StyleUtils.combineStyles([styles.sidebarLinkText, styles.optionAlternateText, styles.textLabelSupporting, styles.pre])}>{label}</Text>
Expand Down
20 changes: 20 additions & 0 deletions src/languages/de.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5075,6 +5075,26 @@ _Für ausführlichere Anweisungen [besuchen Sie unsere Hilfeseite](${CONST.NETSU
subtitle: 'Nutzen Sie Expensify Travel für die besten Reiseangebote und verwalten Sie alle Ihre Geschäftsausgaben an einem Ort.',
ctaText: 'Buchen oder verwalten',
},
travelInvoicing: {
travelBookingSection: {
title: 'Reisebuchung',
subtitle: 'Glückwunsch! Du kannst jetzt in diesem Workspace Reisen buchen und verwalten.',
manageTravelLabel: 'Reisen verwalten',
},
centralInvoicingSection: {
title: 'Zentrale Rechnungsstellung',
subtitle: 'Zentralisieren Sie alle Reisekosten in einer monatlichen Rechnung, anstatt zum Zeitpunkt des Kaufs zu bezahlen.',
learnHow: `<muted-text><a href="${CONST.FOOTER.TRAVEL_URL}">So funktioniert's.</a></muted-text>`,
subsections: {
currentTravelSpendLabel: 'Aktuelle Reisekosten',
currentTravelSpendCta: 'Saldo bezahlen',
currentTravelLimitLabel: 'Aktuelles Reiselimit',
settlementAccountLabel: 'Ausgleichskonto',
settlementFrequencyLabel: 'Abrechnungshäufigkeit',
settlementFrequencyDescription: 'Wie oft Expensify Ihr Geschäftskonto belastet, um aktuelle Expensify Travel-Transaktionen zu begleichen.',
},
},
},
},
expensifyCard: {
title: 'Expensify Card',
Expand Down
20 changes: 20 additions & 0 deletions src/languages/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4981,6 +4981,26 @@ const translations = {
subtitle: 'Use Expensify Travel to get the best travel offers and manage all your business expenses in a single place.',
ctaText: 'Book or manage',
},
travelInvoicing: {
travelBookingSection: {
title: 'Travel booking',
subtitle: "Congrats! You're all set to book and manage travel on this workspace.",
manageTravelLabel: 'Manage travel',
},
centralInvoicingSection: {
title: 'Central invoicing',
subtitle: 'Centralize all travel spend in a monthly invoice instead of paying at time of purchase.',
learnHow: `<muted-text><a href="${CONST.FOOTER.TRAVEL_URL}">Learn how.</a></muted-text>`,
subsections: {
currentTravelSpendLabel: 'Current travel spend',
currentTravelSpendCta: 'Pay balance',
currentTravelLimitLabel: 'Current travel limit',
settlementAccountLabel: 'Settlement account',
settlementFrequencyLabel: 'Settlement frequency',
settlementFrequencyDescription: 'How often Expensify will pull from your business bank account to settle recent Expensify Travel transactions.',
},
},
},
},
expensifyCard: {
title: 'Expensify Card',
Expand Down
21 changes: 21 additions & 0 deletions src/languages/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4716,6 +4716,27 @@ ${amount} para ${merchant} - ${date}`,
subtitle: 'Usa Expensify Travel para obtener las mejores ofertas de viaje y gestionar todos tus gastos de empresa en un solo lugar.',
ctaText: 'Reservar o gestionar',
},
travelInvoicing: {
travelBookingSection: {
title: 'Reserva de viajes',
subtitle: '¡Felicidades! Todo está listo para reservar y gestionar viajes en este espacio de trabajo.',
manageTravelLabel: 'Gestionar viajes',
},
centralInvoicingSection: {
title: 'Facturación centralizada',
subtitle: 'Centraliza todos los gastos de viaje en una factura mensual en lugar de pagar en el momento de la compra.',
learnHow: `<muted-text><a href="${CONST.FOOTER.TRAVEL_URL}">Aprende cómo.</a></muted-text>`,
subsections: {
currentTravelSpendLabel: 'Gasto actual en viajes',
currentTravelSpendCta: 'Pagar saldo',
currentTravelLimitLabel: 'Límite actual de viajes',
settlementAccountLabel: 'Cuenta de liquidación',
settlementFrequencyLabel: 'Frecuencia de liquidación',
settlementFrequencyDescription:
'Con qué frecuencia Expensify retirará fondos de la cuenta bancaria de tu empresa para liquidar transacciones recientes de Expensify Travel.',
},
},
},
},
expensifyCard: {
title: 'Tarjeta Expensify',
Expand Down
Loading
Loading