Skip to content
Merged
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
86 changes: 68 additions & 18 deletions src/components/Search/SearchList/ListItem/ExportedIconCell.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import {getOriginalMessage, isExportedToIntegrationAction} from '@libs/ReportAct

import CONST from '@src/CONST';
import type {ReportAction} from '@src/types/onyx';
import type IconAsset from '@src/types/utils/IconAsset';

import React from 'react';
import {View} from 'react-native';
Expand Down Expand Up @@ -86,18 +85,7 @@ function ExportedIconCell({reportActions}: ExportedIconCellProps) {
}
}

const integrationIcons = [
isExportedToNetsuite && {name: 'NetSuiteSquare', src: icons.NetSuiteSquare},
isExportedToXero && {name: 'XeroSquare', src: icons.XeroSquare},
isExportedToIntacct && {name: 'IntacctSquare', src: icons.IntacctSquare},
(isExportedToQuickbooksOnline || isExportedToQuickbooksDesktop) && {name: 'QBOSquare', src: icons.QBOSquare},
isExportedToIntuitEnterpriseSuite && {name: 'IntuitSquare', src: icons.IntuitSquare},
isExportedToCertinia && {name: 'CertiniaSquare', src: icons.CertiniaSquare},
isExportedToRillet && {name: 'RilletSquare', src: icons.RilletSquare},
isExportedToDualEntry && {name: 'DualEntrySquare', src: icons.DualEntrySquare},
isExportedToBillCom && {name: 'BillComSquare', src: icons.BillComSquare},
isExportedToZenefits && {name: 'ZenefitsSquare', src: icons.ZenefitsSquare},
].filter((icon): icon is {name: string; src: IconAsset} => !!icon);
const integrationIconStyle = StyleUtils.getAvatarBorderStyle(CONST.AVATAR_SIZE.XXX_SMALL, CONST.AVATAR_SHAPE.CIRCLE);

return (
<View style={[styles.flexRow, styles.gap2]}>
Expand All @@ -115,14 +103,76 @@ function ExportedIconCell({reportActions}: ExportedIconCellProps) {
size={CONST.ICON_SIZE.SMALL}
/>
)}
{integrationIcons.map(({name, src}) => (
{isExportedToNetsuite && (

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

❌ CONSISTENCY-3 (docs)

This change replaces a single, data-driven icon list with ten near-identical <Icon> JSX blocks that differ only in the guarding boolean and the src value. Every block repeats the same size={CONST.ICON_SIZE.SMALL} and additionalStyles={[integrationIconStyle]} structure, so adding, removing, or restyling an integration icon now requires editing every copy, raising maintenance overhead and bug risk (DRY violation).

Consolidate the repetition by iterating over a small config that maps a condition to its icon source, keeping a single <Icon> definition:

const integrationIcons = [
    {show: isExportedToNetsuite, name: 'NetSuiteSquare', src: icons.NetSuiteSquare},
    {show: isExportedToXero, name: 'XeroSquare', src: icons.XeroSquare},
    {show: isExportedToIntacct, name: 'IntacctSquare', src: icons.IntacctSquare},
    {show: isExportedToQuickbooksOnline || isExportedToQuickbooksDesktop, name: 'QBOSquare', src: icons.QBOSquare},
    {show: isExportedToIntuitEnterpriseSuite, name: 'IntuitSquare', src: icons.IntuitSquare},
    {show: isExportedToCertinia, name: 'CertiniaSquare', src: icons.CertiniaSquare},
    {show: isExportedToRillet, name: 'RilletSquare', src: icons.RilletSquare},
    {show: isExportedToDualEntry, name: 'DualEntrySquare', src: icons.DualEntrySquare},
    {show: isExportedToBillCom, name: 'BillComSquare', src: icons.BillComSquare},
    {show: isExportedToZenefits, name: 'ZenefitsSquare', src: icons.ZenefitsSquare},
];

// ...
{integrationIcons
    .filter(({show}) => show)
    .map(({name, src}) => (
        <Icon
            key={name}
            src={src}
            size={CONST.ICON_SIZE.SMALL}
            additionalStyles={[integrationIconStyle]}
        />
    ))}

This keeps a single source of truth for the <Icon> markup while still avoiding the removed inline object churn.


Reviewed at: 5398ced | Please rate this suggestion with 👍 or 👎 to help us improve! Reactions are used to monitor reviewer efficiency.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

<Icon
key={name}
src={src}
src={icons.NetSuiteSquare}
size={CONST.ICON_SIZE.SMALL}
additionalStyles={[StyleUtils.getAvatarBorderStyle(CONST.AVATAR_SIZE.XXX_SMALL, CONST.AVATAR_SHAPE.CIRCLE)]}
additionalStyles={[integrationIconStyle]}
/>
))}
)}
{isExportedToXero && (
<Icon
src={icons.XeroSquare}
size={CONST.ICON_SIZE.SMALL}
additionalStyles={[integrationIconStyle]}
/>
)}
{isExportedToIntacct && (
<Icon
src={icons.IntacctSquare}
size={CONST.ICON_SIZE.SMALL}
additionalStyles={[integrationIconStyle]}
/>
)}
{(isExportedToQuickbooksOnline || isExportedToQuickbooksDesktop) && (
<Icon
src={icons.QBOSquare}
size={CONST.ICON_SIZE.SMALL}
additionalStyles={[integrationIconStyle]}
/>
)}
{isExportedToIntuitEnterpriseSuite && (
<Icon
src={icons.IntuitSquare}
size={CONST.ICON_SIZE.SMALL}
additionalStyles={[integrationIconStyle]}
/>
)}
{isExportedToCertinia && (
<Icon
src={icons.CertiniaSquare}
size={CONST.ICON_SIZE.SMALL}
additionalStyles={[integrationIconStyle]}
/>
)}
{isExportedToRillet && (
<Icon
src={icons.RilletSquare}
size={CONST.ICON_SIZE.SMALL}
additionalStyles={[integrationIconStyle]}
/>
)}
{isExportedToDualEntry && (
<Icon
src={icons.DualEntrySquare}
size={CONST.ICON_SIZE.SMALL}
additionalStyles={[integrationIconStyle]}
/>
)}
{isExportedToBillCom && (
<Icon
src={icons.BillComSquare}
size={CONST.ICON_SIZE.SMALL}
additionalStyles={[integrationIconStyle]}
/>
)}
{isExportedToZenefits && (
<Icon
src={icons.ZenefitsSquare}
size={CONST.ICON_SIZE.SMALL}
additionalStyles={[integrationIconStyle]}
/>
)}
</View>
);
}
Expand Down
Loading