Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
5c66404
Added image displays for odometer
jakubkalinski0 Jan 14, 2026
a412406
Prettier run
jakubkalinski0 Jan 14, 2026
d09e290
Merge branch 'main' into jakubkalinski0/Odometer_Build_Odometer_expen…
jakubkalinski0 Jan 14, 2026
d79e152
Added IOURequestStepOdometerImage screen for web
jakubkalinski0 Jan 14, 2026
d86f3c6
Prettier run
jakubkalinski0 Jan 14, 2026
487d51c
Merge branch 'main' into jakubkalinski0/Odometer_Build_Odometer_expen…
jakubkalinski0 Jan 21, 2026
39f1b00
Merge branch 'main' into jakubkalinski0/Odometer_Build_Odometer_expen…
jakubkalinski0 Jan 21, 2026
879e455
Adjust style of ImageOdometer screen
jakubkalinski0 Jan 21, 2026
fc8c1dc
Merge branch 'main' into jakubkalinski0/Odometer_Build_Odometer_expen…
jakubkalinski0 Jan 22, 2026
322da5a
Updated icons for odometer image capture
jakubkalinski0 Jan 22, 2026
1f65491
Merge branch 'main' into jakubkalinski0/Odometer_Build_Odometer_expen…
jakubkalinski0 Jan 23, 2026
b7f533e
Merge branch 'main' into jakubkalinski0/Odometer_Build_Odometer_expen…
jakubkalinski0 Jan 26, 2026
a583eee
Styling of odometer image and code cleanup
jakubkalinski0 Jan 26, 2026
3f285e0
prettier run
jakubkalinski0 Jan 26, 2026
ac70488
Remove odometer mobile translations
jakubkalinski0 Jan 26, 2026
6096440
Code cleanup
jakubkalinski0 Jan 26, 2026
f41a9d2
prettier run
jakubkalinski0 Jan 26, 2026
57c268c
Merge branch 'main' into jakubkalinski0/Odometer_Build_Odometer_expen…
jakubkalinski0 Jan 27, 2026
9c4ec73
Added spanish translation
jakubkalinski0 Jan 29, 2026
75bfc69
Added missing translations
jakubkalinski0 Jan 29, 2026
a0d22cf
Merge branch 'main' into jakubkalinski0/Odometer_Build_Odometer_expen…
jakubkalinski0 Jan 30, 2026
f35ca71
Fix merge conflict
jakubkalinski0 Jan 30, 2026
e2769a4
Adjusted icon of the odometer image dropzone
jakubkalinski0 Jan 30, 2026
c6d1daf
Fixed dropzone
jakubkalinski0 Jan 30, 2026
20b8779
Hide odometer tab behind a flag
jakubkalinski0 Jan 30, 2026
fadc623
Cleanup commit
jakubkalinski0 Jan 30, 2026
5c9f591
Merge branch 'main' into jakubkalinski0/Odometer_Build_Odometer_expen…
jakubkalinski0 Jan 30, 2026
1516f63
Merge branch 'main' into jakubkalinski0/Odometer_Build_Odometer_expen…
jakubkalinski0 Jan 30, 2026
230bb91
Merge branch 'main' into jakubkalinski0/Odometer_Build_Odometer_expen…
jakubkalinski0 Feb 4, 2026
e277b70
Fix conflict
jakubkalinski0 Feb 4, 2026
ecca2b4
Added sentryLabels to odometer page
jakubkalinski0 Feb 4, 2026
36ac49e
Adjusted DropZone icons for odometer
jakubkalinski0 Feb 4, 2026
07cd6e8
prettier run
jakubkalinski0 Feb 4, 2026
7dc6a71
revoke blob urls on unmount in odometer
jakubkalinski0 Feb 5, 2026
f920698
Added OdomtereImageType to consts
jakubkalinski0 Feb 5, 2026
7c858cf
Added action and ioutype to odometer image route
jakubkalinski0 Feb 5, 2026
30762e7
fix eslint
jakubkalinski0 Feb 5, 2026
d9f95a1
Hide odometer tab behind a flag
jakubkalinski0 Feb 5, 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
1 change: 1 addition & 0 deletions assets/images/gallery-plus.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions assets/images/odometer-end.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions assets/images/odometer-start.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
23 changes: 22 additions & 1 deletion src/CONST/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2983,6 +2983,10 @@ const CONST = {
DISTANCE_ODOMETER: 'distance-odometer',
TIME: 'time',
},
ODOMETER_IMAGE_TYPE: {
START: 'start',
END: 'end',
},
EXPENSE_TYPE: {
DISTANCE: 'distance',
MANUAL: 'manual',
Expand Down Expand Up @@ -8026,6 +8030,10 @@ const CONST = {
NEW_WORKSPACE: 'FABMenu-NewWorkspace',
QUICK_ACTION: 'FABMenu-QuickAction',
},
ODOMETER_EXPENSE: {
CAPTURE_IMAGE_START: 'IOURequestStepDistanceOdometer-CaptureStartImage',
CAPTURE_IMAGE_END: 'IOURequestStepDistanceOdometer-CaptureEndImage',
},
ATTACHMENT_CAROUSEL: {
PREVIOUS_BUTTON: 'AttachmentCarousel-PreviousButton',
NEXT_BUTTON: 'AttachmentCarousel-NextButton',
Expand Down Expand Up @@ -8297,13 +8305,26 @@ type Country = keyof typeof CONST.ALL_COUNTRIES;
type IOUType = ValueOf<typeof CONST.IOU.TYPE>;
type IOUAction = ValueOf<typeof CONST.IOU.ACTION>;
type IOURequestType = ValueOf<typeof CONST.IOU.REQUEST_TYPE>;
type OdometerImageType = ValueOf<typeof CONST.IOU.ODOMETER_IMAGE_TYPE>;
type FeedbackSurveyOptionID = ValueOf<Pick<ValueOf<typeof CONST.FEEDBACK_SURVEY_OPTIONS>, 'ID'>>;
type IOUActionParams = ValueOf<typeof CONST.IOU.ACTION_PARAMS>;

type SubscriptionType = ValueOf<typeof CONST.SUBSCRIPTION.TYPE>;
type CancellationType = ValueOf<typeof CONST.CANCELLATION_TYPE>;

export type {Country, IOUAction, IOUType, IOURequestType, SubscriptionType, FeedbackSurveyOptionID, CancellationType, OnboardingInvite, OnboardingAccounting, IOUActionParams};
export type {
Country,
IOUAction,
IOUType,
IOURequestType,
OdometerImageType,
SubscriptionType,
FeedbackSurveyOptionID,
CancellationType,
OnboardingInvite,
OnboardingAccounting,
IOUActionParams,
};

export {CONTINUATION_DETECTION_SEARCH_FILTER_KEYS, TASK_TO_FEATURE, FRAUD_PROTECTION_EVENT, COUNTRIES_US_BANK_FLOW};

Expand Down
7 changes: 6 additions & 1 deletion src/ROUTES.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import type {TupleToUnion, ValueOf} from 'type-fest';
import type {UpperCaseCharacters} from 'type-fest/source/internal';
import type {SearchFilterKey, SearchQueryString, UserFriendlyKey} from './components/Search/types';
import type CONST from './CONST';
import type {IOUAction, IOUType} from './CONST';
import type {IOUAction, IOUType, OdometerImageType} from './CONST';
import type {ReplacementReason} from './libs/actions/Card';
import type {IOURequestType} from './libs/actions/IOU';
import Log from './libs/Log';
Expand Down Expand Up @@ -1431,6 +1431,11 @@ const ROUTES = {
getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string, backToReport?: string) =>
`${action as string}/${iouType as string}/start/${transactionID}/${reportID}/distance-new${backToReport ? `/${backToReport}` : ''}/distance-odometer` as const,
},
ODOMETER_IMAGE: {
route: ':action/:iouType/odometer-image/:transactionID/:readingType',
getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, readingType: OdometerImageType) =>
`${action as string}/${iouType as string}/odometer-image/${transactionID}/${readingType}` as const,
},
IOU_SEND_ADD_BANK_ACCOUNT: 'pay/new/add-bank-account',
IOU_SEND_ADD_DEBIT_CARD: 'pay/new/add-debit-card',
IOU_SEND_ENABLE_PAYMENTS: 'pay/new/enable-payments',
Expand Down
1 change: 1 addition & 0 deletions src/SCREENS.ts
Original file line number Diff line number Diff line change
Expand Up @@ -365,6 +365,7 @@ const SCREENS = {
STEP_DISTANCE_MANUAL: 'Money_Request_Step_Distance_Manual',
STEP_DISTANCE_GPS: 'Money_Request_Step_Distance_GPS',
STEP_DISTANCE_ODOMETER: 'Money_Request_Step_Distance_Odometer',
ODOMETER_IMAGE: 'Money_Request_Odometer_Image',
RECEIPT_PREVIEW: 'Money_Request_Receipt_preview',
STEP_TIME_RATE: 'Money_Request_Step_Time_Rate',
STEP_HOURS: 'Money_Request_Step_Hours',
Expand Down
12 changes: 9 additions & 3 deletions src/components/DropZone/DropZoneUI.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,12 @@ type DropZoneUIProps = {
/** Icon to display in the drop zone */
icon: IconAsset;

/** Icon width to display in the drop zone */
iconWidth?: number;

/** Icon height to display in the drop zone */
iconHeight?: number;

/** Title to display in the drop zone */
dropTitle?: string;

Expand All @@ -26,7 +32,7 @@ type DropZoneUIProps = {
dropWrapperStyles?: StyleProp<ViewStyle>;
};

function DropZoneUI({icon, dropTitle, dropStyles, dropTextStyles, dropWrapperStyles, dashedBorderStyles}: DropZoneUIProps) {
function DropZoneUI({icon, iconWidth = 100, iconHeight = 100, dropTitle, dropStyles, dropTextStyles, dropWrapperStyles, dashedBorderStyles}: DropZoneUIProps) {
const styles = useThemeStyles();

return (
Expand All @@ -36,8 +42,8 @@ function DropZoneUI({icon, dropTitle, dropStyles, dropTextStyles, dropWrapperSty
<View style={styles.mb3}>
<Icon
src={icon}
width={100}
height={100}
width={iconWidth}
height={iconHeight}
/>
</View>
<Text style={[styles.textDropZone, dropTextStyles]}>{dropTitle}</Text>
Expand Down
2 changes: 2 additions & 0 deletions src/components/Icon/Expensicons.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ import FlagLevelThree from '@assets/images/flag_level_03.svg';
import Folder from '@assets/images/folder.svg';
import Fullscreen from '@assets/images/fullscreen.svg';
import GalleryNotFound from '@assets/images/gallery-not-found.svg';
import GalleryPlus from '@assets/images/gallery-plus.svg';
import Gallery from '@assets/images/gallery.svg';
import Gear from '@assets/images/gear.svg';
import Heart from '@assets/images/heart.svg';
Expand Down Expand Up @@ -326,4 +327,5 @@ export {
BillComSquare,
CertiniaSquare,
ZenefitsSquare,
GalleryPlus,
};
4 changes: 4 additions & 0 deletions src/components/Icon/chunks/expensify-icons.chunk.ts
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,8 @@ import Fingerprint from '@assets/images/multifactorAuthentication/fingerprint.sv
import Mute from '@assets/images/mute.svg';
import NewWindow from '@assets/images/new-window.svg';
import NewWorkspace from '@assets/images/new-workspace.svg';
import OdometerEnd from '@assets/images/odometer-end.svg';
import OdometerStart from '@assets/images/odometer-start.svg';
import OfflineCloud from '@assets/images/offline-cloud.svg';
import Offline from '@assets/images/offline.svg';
import Paperclip from '@assets/images/paperclip.svg';
Expand Down Expand Up @@ -372,6 +374,8 @@ const Expensicons = {
NotificationsAvatar,
Offline,
OfflineCloud,
OdometerStart,
OdometerEnd,
Paperclip,
Pause,
Pencil,
Expand Down
4 changes: 4 additions & 0 deletions src/languages/de.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7425,6 +7425,10 @@ Fordern Sie Spesendetails wie Belege und Beschreibungen an, legen Sie Limits und
endReading: 'Lesen beenden',
saveForLater: 'Für später speichern',
totalDistance: 'Gesamtdistanz',
startTitle: 'Foto des Kilometerzähler-Starts',
endTitle: 'Kilometerzähler-Endfoto',
startMessageWeb: 'Füge ein Foto deines Kilometerzählers vom <strong>Beginn</strong> deiner Fahrt hinzu. Ziehe eine Datei hierher oder wähle eine zum Hochladen aus.',
endMessageWeb: 'Fügen Sie ein Foto Ihres Kilometerzählers vom <strong>Ende</strong> Ihrer Fahrt hinzu. Ziehen Sie eine Datei hierher oder wählen Sie eine zum Hochladen aus.',
},
},
gps: {
Expand Down
4 changes: 4 additions & 0 deletions src/languages/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7345,6 +7345,10 @@ const translations = {
endReading: 'End reading',
saveForLater: 'Save for later',
totalDistance: 'Total distance',
startTitle: 'Odometer start photo',
endTitle: 'Odometer end photo',
startMessageWeb: 'Add a photo of your odometer from the <strong>start</strong> of your trip. Drag a file here or choose one to upload.',
endMessageWeb: 'Add a photo of your odometer from the <strong>end</strong> of your trip. Drag a file here or choose one to upload.',
},
},
gps: {
Expand Down
4 changes: 4 additions & 0 deletions src/languages/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7558,6 +7558,10 @@ ${amount} para ${merchant} - ${date}`,
endReading: 'Lectura final',
saveForLater: 'Guardar para después',
totalDistance: 'Distancia total',
startTitle: 'Foto inicial del odómetro',
endTitle: 'Foto final del odómetro',
startMessageWeb: 'Añade una foto de tu odómetro al <strong>inicio</strong> de tu viaje. Arrastra un archivo aquí o elige uno para subirlo.',
endMessageWeb: 'Añade una foto de tu odómetro al <strong>final</strong> de tu viaje. Arrastra un archivo aquí o elige uno para subirlo.',
},
},
reportCardLostOrDamaged: {
Expand Down
5 changes: 5 additions & 0 deletions src/languages/fr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7441,6 +7441,11 @@ Rendez obligatoires des informations de dépense comme les reçus et les descrip
endReading: 'Fin de lecture',
saveForLater: 'Enregistrer pour plus tard',
totalDistance: 'Distance totale',
startTitle: 'Photo du compteur au départ',
endTitle: 'Photo de fin d’odomètre',
startMessageWeb:
'Ajoutez une photo de votre compteur kilométrique prise au <strong>début</strong> de votre trajet. Faites glisser un fichier ici ou choisissez-en un à télécharger.',
endMessageWeb: 'Ajoutez une photo du compteur kilométrique prise à la <strong>fin</strong> de votre trajet. Faites glisser un fichier ici ou choisissez-en un à télécharger.',
},
},
gps: {
Expand Down
4 changes: 4 additions & 0 deletions src/languages/it.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7408,6 +7408,10 @@ Richiedi dettagli sulle spese come ricevute e descrizioni, imposta limiti e valo
endReading: 'Fine lettura',
saveForLater: 'Salva per dopo',
totalDistance: 'Distanza totale',
startTitle: 'Foto iniziale del contachilometri',
endTitle: 'Foto del contachilometri finale',
startMessageWeb: 'Aggiungi una foto del contachilometri all’<strong>inizio</strong> del tuo viaggio. Trascina qui un file oppure scegli un file da caricare.',
endMessageWeb: 'Aggiungi una foto del contachilometri scattata alla <strong>fine</strong> del viaggio. Trascina qui un file oppure scegli un file da caricare.',
},
},
gps: {
Expand Down
4 changes: 4 additions & 0 deletions src/languages/ja.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7347,6 +7347,10 @@ ${reportName}
endReading: '読み終える',
saveForLater: '後で保存',
totalDistance: '合計距離',
startTitle: '走行距離計の開始写真',
endTitle: '走行距離計終了時の写真',
startMessageWeb: '旅行の<strong>開始時</strong>のオドメーターの写真を追加してください。ここにファイルをドラッグするか、またはアップロードするファイルを選択してください。',
endMessageWeb: '旅行の<strong>終了時</strong>の走行距離計の写真を追加してください。ここにファイルをドラッグするか、アップロードするファイルを選択してください。',
},
},
gps: {
Expand Down
4 changes: 4 additions & 0 deletions src/languages/nl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7396,6 +7396,10 @@ Vereis onkostendetails zoals bonnen en beschrijvingen, stel limieten en standaar
endReading: 'Lezen beëindigen',
saveForLater: 'Bewaren voor later',
totalDistance: 'Totale afstand',
startTitle: 'Foto beginstand kilometerteller',
endTitle: 'Eindfoto kilometerteller',
startMessageWeb: 'Voeg een foto toe van de kilometerteller aan het <strong>begin</strong> van je reis. Sleep een bestand hierheen of kies er een om te uploaden.',
endMessageWeb: 'Voeg een foto toe van je kilometerteller aan het <strong>einde</strong> van je reis. Sleep hier een bestand naartoe of kies er één om te uploaden.',
},
},
gps: {
Expand Down
4 changes: 4 additions & 0 deletions src/languages/pl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7378,6 +7378,10 @@ Wymagaj szczegółów wydatków, takich jak paragony i opisy, ustawiaj limity i
endReading: 'Zakończ czytanie',
saveForLater: 'Zapisz na później',
totalDistance: 'Całkowity dystans',
startTitle: 'Zdjęcie początku stanu licznika',
endTitle: 'Zdjęcie końcowe licznika przebiegu',
startMessageWeb: 'Dodaj zdjęcie licznika kilometrów z <strong>początku</strong> swojej podróży. Przeciągnij tutaj plik lub wybierz go, aby przesłać.',
endMessageWeb: 'Dodaj zdjęcie licznika przebiegu z <strong>końca</strong> swojej podróży. Przeciągnij tutaj plik lub wybierz jeden, aby go przesłać.',
},
},
gps: {
Expand Down
4 changes: 4 additions & 0 deletions src/languages/pt-BR.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7378,6 +7378,10 @@ Exija dados de despesas como recibos e descrições, defina limites e padrões e
endReading: 'Finalizar leitura',
saveForLater: 'Salvar para depois',
totalDistance: 'Distância total',
startTitle: 'Foto inicial do hodômetro',
endTitle: 'Foto do hodômetro final',
startMessageWeb: 'Adicione uma foto do hodômetro do <strong>início</strong> da sua viagem. Arraste um arquivo aqui ou escolha um para enviar.',
endMessageWeb: 'Adicione uma foto do hodômetro do <strong>final</strong> da sua viagem. Arraste um arquivo aqui ou escolha um para enviar.',
},
},
gps: {
Expand Down
4 changes: 4 additions & 0 deletions src/languages/zh-hans.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7237,6 +7237,10 @@ ${reportName}
endReading: '结束阅读',
saveForLater: '稍后保存',
totalDistance: '总距离',
startTitle: '里程表起始照片',
endTitle: '里程表结束照片',
startMessageWeb: '从行程<strong>开始</strong>时添加一张里程表照片。将文件拖到此处或选择一个文件上传。',
endMessageWeb: '在行程<strong>结束</strong>时添加一张里程表照片。将文件拖到此处或选择一个文件上传。',
},
},
gps: {
Expand Down
4 changes: 4 additions & 0 deletions src/libs/DebugUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1057,6 +1057,8 @@ function validateTransactionDraftProperty(key: keyof Transaction, value: string)
distanceUnit: CONST.RED_BRICK_ROAD_PENDING_ACTION,
odometerStart: CONST.RED_BRICK_ROAD_PENDING_ACTION,
odometerEnd: CONST.RED_BRICK_ROAD_PENDING_ACTION,
odometerStartImage: CONST.RED_BRICK_ROAD_PENDING_ACTION,
odometerEndImage: CONST.RED_BRICK_ROAD_PENDING_ACTION,
attendees: CONST.RED_BRICK_ROAD_PENDING_ACTION,
amount: CONST.RED_BRICK_ROAD_PENDING_ACTION,
taxAmount: CONST.RED_BRICK_ROAD_PENDING_ACTION,
Expand Down Expand Up @@ -1166,6 +1168,8 @@ function validateTransactionDraftProperty(key: keyof Transaction, value: string)
splitsEndDate: 'string',
odometerStart: 'number',
odometerEnd: 'number',
odometerStartImage: 'object',
odometerEndImage: 'object',
});
case 'accountant':
return validateObject<ObjectElement<Transaction, 'accountant'>>(value, {
Expand Down
Loading
Loading