From 73289148dfe7f0b01870f9d9f002739f1dd7719a Mon Sep 17 00:00:00 2001
From: Matiss Janis Aboltins <matiss@mja.lv>
Date: Sun, 30 Jul 2023 16:28:33 +0100
Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20(common)=20migrating=20to?=
 =?UTF-8?q?=20specific=20common=20component=20import=20paths=20pt4=20(#142?=
 =?UTF-8?q?2)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Part 4 of the migration. Final moves.

Previous PR: https://github.com/actualbudget/actual/pull/1420
---
 .../src/components/DevelopmentTopBar.tsx      |  2 +-
 .../src/components/FatalError.js              |  2 +-
 .../src/components/ManageRules.js             |  2 +-
 .../src/components/Notifications.tsx          |  2 +-
 .../desktop-client/src/components/Titlebar.js |  3 +-
 .../components/accounts/AccountSyncCheck.js   |  2 +-
 .../desktop-client/src/components/common.tsx  | 62 -------------------
 .../src/components/common/ButtonLink.tsx      | 33 ++++++++++
 .../src/components/common/ExternalLink.tsx    | 32 ++++++++++
 .../src/components/manager/ImportYNAB5.js     |  2 +-
 .../src/components/manager/WelcomeScreen.js   |  2 +-
 .../manager/subscribe/Bootstrap.tsx           |  2 +-
 .../src/components/modals/CreateAccount.js    |  2 +-
 .../components/modals/CreateEncryptionKey.js  |  2 +-
 .../components/modals/CreateLocalAccount.js   |  2 +-
 .../src/components/modals/FixEncryptionKey.js |  2 +-
 .../modals/GoCardlessExternalMsg.js           |  2 +-
 .../modals/GoCardlessInitialise.tsx           |  2 +-
 .../src/components/reports/Header.js          |  2 +-
 .../src/components/settings/Encryption.tsx    |  2 +-
 .../src/components/settings/index.tsx         |  2 +-
 upcoming-release-notes/1422.md                |  6 ++
 22 files changed, 90 insertions(+), 80 deletions(-)
 delete mode 100644 packages/desktop-client/src/components/common.tsx
 create mode 100644 packages/desktop-client/src/components/common/ButtonLink.tsx
 create mode 100644 packages/desktop-client/src/components/common/ExternalLink.tsx
 create mode 100644 upcoming-release-notes/1422.md

diff --git a/packages/desktop-client/src/components/DevelopmentTopBar.tsx b/packages/desktop-client/src/components/DevelopmentTopBar.tsx
index 8bf786a64..581f06f79 100644
--- a/packages/desktop-client/src/components/DevelopmentTopBar.tsx
+++ b/packages/desktop-client/src/components/DevelopmentTopBar.tsx
@@ -1,6 +1,6 @@
 import { theme } from '../style';
 
-import { ExternalLink } from './common';
+import ExternalLink from './common/ExternalLink';
 import View from './common/View';
 
 export default function DevelopmentTopBar() {
diff --git a/packages/desktop-client/src/components/FatalError.js b/packages/desktop-client/src/components/FatalError.js
index 59a50cae9..23c2346e4 100644
--- a/packages/desktop-client/src/components/FatalError.js
+++ b/packages/desktop-client/src/components/FatalError.js
@@ -2,9 +2,9 @@ import React, { Component, useState } from 'react';
 
 import { theme } from '../style';
 
-import { ExternalLink } from './common';
 import Block from './common/Block';
 import Button from './common/Button';
+import ExternalLink from './common/ExternalLink';
 import LinkButton from './common/LinkButton';
 import Modal from './common/Modal';
 import Paragraph from './common/Paragraph';
diff --git a/packages/desktop-client/src/components/ManageRules.js b/packages/desktop-client/src/components/ManageRules.js
index 4d427ae58..ad50910ce 100644
--- a/packages/desktop-client/src/components/ManageRules.js
+++ b/packages/desktop-client/src/components/ManageRules.js
@@ -31,8 +31,8 @@ import useSelected, {
 import ArrowRight from '../icons/v0/RightArrow2';
 import { colors } from '../style';
 
-import { ExternalLink } from './common';
 import Button from './common/Button';
+import ExternalLink from './common/ExternalLink';
 import Input from './common/Input';
 import LinkButton from './common/LinkButton';
 import Stack from './common/Stack';
diff --git a/packages/desktop-client/src/components/Notifications.tsx b/packages/desktop-client/src/components/Notifications.tsx
index e2599bb75..02ff9c8fa 100644
--- a/packages/desktop-client/src/components/Notifications.tsx
+++ b/packages/desktop-client/src/components/Notifications.tsx
@@ -15,8 +15,8 @@ import AnimatedLoading from '../icons/AnimatedLoading';
 import Delete from '../icons/v0/Delete';
 import { styles, colors } from '../style';
 
-import { ExternalLink } from './common';
 import Button, { ButtonWithLoading } from './common/Button';
+import ExternalLink from './common/ExternalLink';
 import LinkButton from './common/LinkButton';
 import Stack from './common/Stack';
 import Text from './common/Text';
diff --git a/packages/desktop-client/src/components/Titlebar.js b/packages/desktop-client/src/components/Titlebar.js
index 34e0f1074..779e8ee66 100644
--- a/packages/desktop-client/src/components/Titlebar.js
+++ b/packages/desktop-client/src/components/Titlebar.js
@@ -28,8 +28,9 @@ import tokens from '../tokens';
 import AccountSyncCheck from './accounts/AccountSyncCheck';
 import AnimatedRefresh from './AnimatedRefresh';
 import { MonthCountSelector } from './budget/MonthCountSelector';
-import { ButtonLink, ExternalLink } from './common';
 import Button, { ButtonWithLoading } from './common/Button';
+import ButtonLink from './common/ButtonLink';
+import ExternalLink from './common/ExternalLink';
 import Paragraph from './common/Paragraph';
 import Text from './common/Text';
 import View from './common/View';
diff --git a/packages/desktop-client/src/components/accounts/AccountSyncCheck.js b/packages/desktop-client/src/components/accounts/AccountSyncCheck.js
index 03f831b49..05f58c7cf 100644
--- a/packages/desktop-client/src/components/accounts/AccountSyncCheck.js
+++ b/packages/desktop-client/src/components/accounts/AccountSyncCheck.js
@@ -6,8 +6,8 @@ import { authorizeBank } from '../../gocardless';
 import { useActions } from '../../hooks/useActions';
 import ExclamationOutline from '../../icons/v1/ExclamationOutline';
 import { colors } from '../../style';
-import { ExternalLink } from '../common';
 import Button from '../common/Button';
+import ExternalLink from '../common/ExternalLink';
 import View from '../common/View';
 import { Tooltip } from '../tooltips';
 
diff --git a/packages/desktop-client/src/components/common.tsx b/packages/desktop-client/src/components/common.tsx
deleted file mode 100644
index a74afd246..000000000
--- a/packages/desktop-client/src/components/common.tsx
+++ /dev/null
@@ -1,62 +0,0 @@
-import React, { type ComponentProps, type ReactNode, forwardRef } from 'react';
-import { useMatch, useNavigate } from 'react-router-dom';
-
-import { type CSSProperties } from 'glamor';
-
-import { colors } from '../style';
-
-import Button from './common/Button';
-
-let externalLinkColors = {
-  purple: colors.p4,
-  blue: colors.b4,
-  muted: 'inherit',
-};
-type ExternalLinkProps = {
-  children?: ReactNode;
-  to: string;
-  linkColor?: keyof typeof externalLinkColors;
-};
-
-export const ExternalLink = forwardRef<HTMLAnchorElement, ExternalLinkProps>(
-  ({ children, to, linkColor = 'blue' }, ref) => (
-    // we can’t use <ExternalLink /> here for obvious reasons
-    // eslint-disable-next-line no-restricted-syntax
-    <a
-      ref={ref}
-      href={to}
-      target="_blank"
-      rel="noopener noreferrer"
-      style={{ color: externalLinkColors[linkColor] }}
-    >
-      {children}
-    </a>
-  ),
-);
-
-type ButtonLinkProps = ComponentProps<typeof Button> & {
-  to: string;
-  activeStyle?: CSSProperties;
-};
-export function ButtonLink({
-  to,
-  style,
-  activeStyle,
-  ...props
-}: ButtonLinkProps) {
-  const navigate = useNavigate();
-  const match = useMatch({ path: to });
-  return (
-    <Button
-      style={{
-        ...style,
-        ...(match ? activeStyle : {}),
-      }}
-      {...props}
-      onClick={e => {
-        props.onClick?.(e);
-        navigate(to);
-      }}
-    />
-  );
-}
diff --git a/packages/desktop-client/src/components/common/ButtonLink.tsx b/packages/desktop-client/src/components/common/ButtonLink.tsx
new file mode 100644
index 000000000..77688daf5
--- /dev/null
+++ b/packages/desktop-client/src/components/common/ButtonLink.tsx
@@ -0,0 +1,33 @@
+import React, { type ComponentProps } from 'react';
+import { useMatch, useNavigate } from 'react-router-dom';
+
+import { type CSSProperties } from 'glamor';
+
+import Button from './Button';
+
+type ButtonLinkProps = ComponentProps<typeof Button> & {
+  to: string;
+  activeStyle?: CSSProperties;
+};
+export default function ButtonLink({
+  to,
+  style,
+  activeStyle,
+  ...props
+}: ButtonLinkProps) {
+  const navigate = useNavigate();
+  const match = useMatch({ path: to });
+  return (
+    <Button
+      style={{
+        ...style,
+        ...(match ? activeStyle : {}),
+      }}
+      {...props}
+      onClick={e => {
+        props.onClick?.(e);
+        navigate(to);
+      }}
+    />
+  );
+}
diff --git a/packages/desktop-client/src/components/common/ExternalLink.tsx b/packages/desktop-client/src/components/common/ExternalLink.tsx
new file mode 100644
index 000000000..e4fa656b5
--- /dev/null
+++ b/packages/desktop-client/src/components/common/ExternalLink.tsx
@@ -0,0 +1,32 @@
+import React, { type ReactNode, forwardRef } from 'react';
+
+import { colors } from '../../style';
+
+let externalLinkColors = {
+  purple: colors.p4,
+  blue: colors.b4,
+  muted: 'inherit',
+};
+type ExternalLinkProps = {
+  children?: ReactNode;
+  to: string;
+  linkColor?: keyof typeof externalLinkColors;
+};
+
+const ExternalLink = forwardRef<HTMLAnchorElement, ExternalLinkProps>(
+  ({ children, to, linkColor = 'blue' }, ref) => (
+    // we can’t use <ExternalLink /> here for obvious reasons
+    // eslint-disable-next-line no-restricted-syntax
+    <a
+      ref={ref}
+      href={to}
+      target="_blank"
+      rel="noopener noreferrer"
+      style={{ color: externalLinkColors[linkColor] }}
+    >
+      {children}
+    </a>
+  ),
+);
+
+export default ExternalLink;
diff --git a/packages/desktop-client/src/components/manager/ImportYNAB5.js b/packages/desktop-client/src/components/manager/ImportYNAB5.js
index 2be944234..b30257402 100644
--- a/packages/desktop-client/src/components/manager/ImportYNAB5.js
+++ b/packages/desktop-client/src/components/manager/ImportYNAB5.js
@@ -4,9 +4,9 @@ import { useDispatch } from 'react-redux';
 import { importBudget } from 'loot-core/src/client/actions/budgets';
 
 import { styles, colors } from '../../style';
-import { ExternalLink } from '../common';
 import Block from '../common/Block';
 import { ButtonWithLoading } from '../common/Button';
+import ExternalLink from '../common/ExternalLink';
 import Modal from '../common/Modal';
 import Paragraph from '../common/Paragraph';
 import View from '../common/View';
diff --git a/packages/desktop-client/src/components/manager/WelcomeScreen.js b/packages/desktop-client/src/components/manager/WelcomeScreen.js
index 6276a641b..1fc42330d 100644
--- a/packages/desktop-client/src/components/manager/WelcomeScreen.js
+++ b/packages/desktop-client/src/components/manager/WelcomeScreen.js
@@ -2,8 +2,8 @@ import React from 'react';
 
 import { useActions } from '../../hooks/useActions';
 import { colors, styles } from '../../style';
-import { ExternalLink } from '../common';
 import Button from '../common/Button';
+import ExternalLink from '../common/ExternalLink';
 import Paragraph from '../common/Paragraph';
 import Text from '../common/Text';
 import View from '../common/View';
diff --git a/packages/desktop-client/src/components/manager/subscribe/Bootstrap.tsx b/packages/desktop-client/src/components/manager/subscribe/Bootstrap.tsx
index 3d6e792e5..80d49ef10 100644
--- a/packages/desktop-client/src/components/manager/subscribe/Bootstrap.tsx
+++ b/packages/desktop-client/src/components/manager/subscribe/Bootstrap.tsx
@@ -6,8 +6,8 @@ import { loggedIn } from 'loot-core/src/client/actions/user';
 import { send } from 'loot-core/src/platform/client/fetch';
 
 import { colors } from '../../../style';
-import { ExternalLink } from '../../common';
 import Button from '../../common/Button';
+import ExternalLink from '../../common/ExternalLink';
 import Paragraph from '../../common/Paragraph';
 import Text from '../../common/Text';
 import View from '../../common/View';
diff --git a/packages/desktop-client/src/components/modals/CreateAccount.js b/packages/desktop-client/src/components/modals/CreateAccount.js
index e5bfbd9dd..751cd30f3 100644
--- a/packages/desktop-client/src/components/modals/CreateAccount.js
+++ b/packages/desktop-client/src/components/modals/CreateAccount.js
@@ -5,8 +5,8 @@ import { pushModal } from 'loot-core/src/client/actions/modals';
 
 import { authorizeBank } from '../../gocardless';
 import useGoCardlessStatus from '../../hooks/useGoCardlessStatus';
-import { ExternalLink } from '../common';
 import Button, { ButtonWithLoading } from '../common/Button';
+import ExternalLink from '../common/ExternalLink';
 import Modal from '../common/Modal';
 import Paragraph from '../common/Paragraph';
 import Text from '../common/Text';
diff --git a/packages/desktop-client/src/components/modals/CreateEncryptionKey.js b/packages/desktop-client/src/components/modals/CreateEncryptionKey.js
index 5644581ac..8f312e40b 100644
--- a/packages/desktop-client/src/components/modals/CreateEncryptionKey.js
+++ b/packages/desktop-client/src/components/modals/CreateEncryptionKey.js
@@ -6,8 +6,8 @@ import { send } from 'loot-core/src/platform/client/fetch';
 import { getCreateKeyError } from 'loot-core/src/shared/errors';
 
 import { colors } from '../../style';
-import { ExternalLink } from '../common';
 import { ButtonWithLoading } from '../common/Button';
+import ExternalLink from '../common/ExternalLink';
 import InitialFocus from '../common/InitialFocus';
 import Input from '../common/Input';
 import Modal, { ModalButtons } from '../common/Modal';
diff --git a/packages/desktop-client/src/components/modals/CreateLocalAccount.js b/packages/desktop-client/src/components/modals/CreateLocalAccount.js
index e037fb369..7a15bd7cd 100644
--- a/packages/desktop-client/src/components/modals/CreateLocalAccount.js
+++ b/packages/desktop-client/src/components/modals/CreateLocalAccount.js
@@ -4,8 +4,8 @@ import { useNavigate } from 'react-router-dom';
 import { toRelaxedNumber } from 'loot-core/src/shared/util';
 
 import { colors } from '../../style';
-import { ExternalLink } from '../common';
 import Button from '../common/Button';
+import ExternalLink from '../common/ExternalLink';
 import FormError from '../common/FormError';
 import InitialFocus from '../common/InitialFocus';
 import InlineField from '../common/InlineField';
diff --git a/packages/desktop-client/src/components/modals/FixEncryptionKey.js b/packages/desktop-client/src/components/modals/FixEncryptionKey.js
index a617d33b5..099bd3498 100644
--- a/packages/desktop-client/src/components/modals/FixEncryptionKey.js
+++ b/packages/desktop-client/src/components/modals/FixEncryptionKey.js
@@ -4,8 +4,8 @@ import { send } from 'loot-core/src/platform/client/fetch';
 import { getTestKeyError } from 'loot-core/src/shared/errors';
 
 import { colors } from '../../style';
-import { ExternalLink } from '../common';
 import Button, { ButtonWithLoading } from '../common/Button';
+import ExternalLink from '../common/ExternalLink';
 import InitialFocus from '../common/InitialFocus';
 import Input from '../common/Input';
 import Modal, { ModalButtons } from '../common/Modal';
diff --git a/packages/desktop-client/src/components/modals/GoCardlessExternalMsg.js b/packages/desktop-client/src/components/modals/GoCardlessExternalMsg.js
index 7e3dc8f7a..a17520d5a 100644
--- a/packages/desktop-client/src/components/modals/GoCardlessExternalMsg.js
+++ b/packages/desktop-client/src/components/modals/GoCardlessExternalMsg.js
@@ -10,8 +10,8 @@ import DotsHorizontalTriple from '../../icons/v1/DotsHorizontalTriple';
 import { colors } from '../../style';
 import { Error, Warning } from '../alerts';
 import Autocomplete from '../autocomplete/Autocomplete';
-import { ExternalLink } from '../common';
 import Button from '../common/Button';
+import ExternalLink from '../common/ExternalLink';
 import LinkButton from '../common/LinkButton';
 import Menu from '../common/Menu';
 import Modal from '../common/Modal';
diff --git a/packages/desktop-client/src/components/modals/GoCardlessInitialise.tsx b/packages/desktop-client/src/components/modals/GoCardlessInitialise.tsx
index c18a02ac7..39f8e4005 100644
--- a/packages/desktop-client/src/components/modals/GoCardlessInitialise.tsx
+++ b/packages/desktop-client/src/components/modals/GoCardlessInitialise.tsx
@@ -3,8 +3,8 @@ import React, { useState } from 'react';
 import { send } from 'loot-core/src/platform/client/fetch';
 
 import { Error } from '../alerts';
-import { ExternalLink } from '../common';
 import { ButtonWithLoading } from '../common/Button';
+import ExternalLink from '../common/ExternalLink';
 import Input from '../common/Input';
 import Modal, { ModalButtons } from '../common/Modal';
 import type { ModalProps } from '../common/Modal';
diff --git a/packages/desktop-client/src/components/reports/Header.js b/packages/desktop-client/src/components/reports/Header.js
index 2f1849796..b46aeba22 100644
--- a/packages/desktop-client/src/components/reports/Header.js
+++ b/packages/desktop-client/src/components/reports/Header.js
@@ -2,8 +2,8 @@ import * as monthUtils from 'loot-core/src/shared/months';
 
 import ArrowLeft from '../../icons/v1/ArrowLeft';
 import { styles } from '../../style';
-import { ButtonLink } from '../common';
 import Button from '../common/Button';
+import ButtonLink from '../common/ButtonLink';
 import Select from '../common/Select';
 import View from '../common/View';
 import { FilterButton, AppliedFilters } from '../filters/FiltersMenu';
diff --git a/packages/desktop-client/src/components/settings/Encryption.tsx b/packages/desktop-client/src/components/settings/Encryption.tsx
index 0b0908509..6df29b85a 100644
--- a/packages/desktop-client/src/components/settings/Encryption.tsx
+++ b/packages/desktop-client/src/components/settings/Encryption.tsx
@@ -3,8 +3,8 @@ import { useSelector } from 'react-redux';
 
 import { useActions } from '../../hooks/useActions';
 import { colors } from '../../style';
-import { ExternalLink } from '../common';
 import Button from '../common/Button';
+import ExternalLink from '../common/ExternalLink';
 import Text from '../common/Text';
 import { useServerURL } from '../ServerContext';
 
diff --git a/packages/desktop-client/src/components/settings/index.tsx b/packages/desktop-client/src/components/settings/index.tsx
index 375835c99..271845687 100644
--- a/packages/desktop-client/src/components/settings/index.tsx
+++ b/packages/desktop-client/src/components/settings/index.tsx
@@ -13,8 +13,8 @@ import { useSetThemeColor } from '../../hooks/useSetThemeColor';
 import { useResponsive } from '../../ResponsiveProvider';
 import { colors } from '../../style';
 import tokens from '../../tokens';
-import { ExternalLink } from '../common';
 import Button from '../common/Button';
+import ExternalLink from '../common/ExternalLink';
 import Input from '../common/Input';
 import Text from '../common/Text';
 import View from '../common/View';
diff --git a/upcoming-release-notes/1422.md b/upcoming-release-notes/1422.md
new file mode 100644
index 000000000..55e38310d
--- /dev/null
+++ b/upcoming-release-notes/1422.md
@@ -0,0 +1,6 @@
+---
+category: Maintenance
+authors: [MatissJanis]
+---
+
+Moving away from barrel `common` imports to more specific per-component imports (part 4)
-- 
GitLab