From a95ff7f595e40939e817de60ccadcc4cd12c0b5f Mon Sep 17 00:00:00 2001
From: Raphael Krut-Landau <raphael.kl@gmail.com>
Date: Thu, 13 Jun 2024 22:32:54 -0400
Subject: [PATCH] fix: Remove console warnings in cache-related code (#44173)

This PR removes:
- a warning about missing React keys in the `Schedule` component
- a warning about invalid props in the `StrategyFormLauncher` component
---
 .../components/StrategyFormLauncher.styled.tsx  |  6 +++++-
 .../metabase/common/utils/doNotForwardProps.ts  |  3 +++
 .../ResponsiveContainer/ResponsiveContainer.tsx |  5 +----
 .../src/metabase/components/Schedule/utils.tsx  | 17 +++++++++++++----
 4 files changed, 22 insertions(+), 9 deletions(-)
 create mode 100644 frontend/src/metabase/common/utils/doNotForwardProps.ts

diff --git a/enterprise/frontend/src/metabase-enterprise/caching/components/StrategyFormLauncher.styled.tsx b/enterprise/frontend/src/metabase-enterprise/caching/components/StrategyFormLauncher.styled.tsx
index 76be3a58977..18e877514ce 100644
--- a/enterprise/frontend/src/metabase-enterprise/caching/components/StrategyFormLauncher.styled.tsx
+++ b/enterprise/frontend/src/metabase-enterprise/caching/components/StrategyFormLauncher.styled.tsx
@@ -2,6 +2,7 @@ import { css } from "@emotion/react";
 import styled from "@emotion/styled";
 import type { HTMLAttributes, MutableRefObject } from "react";
 
+import { doNotForwardProps } from "metabase/common/utils/doNotForwardProps";
 import { color } from "metabase/lib/colors";
 import { breakpointMaxSmall } from "metabase/styled-components/theme";
 import type { ButtonProps as BaseButtonProps } from "metabase/ui";
@@ -33,7 +34,10 @@ export const PolicyToken = styled(Button)<
 `;
 PolicyToken.defaultProps = { radius: "sm" };
 
-export const StyledLauncher = styled(Flex)<
+export const StyledLauncher = styled(
+  Flex,
+  doNotForwardProps("forRoot", "inheritsRootStrategy"),
+)<
   {
     forRoot?: boolean;
     inheritsRootStrategy?: boolean;
diff --git a/frontend/src/metabase/common/utils/doNotForwardProps.ts b/frontend/src/metabase/common/utils/doNotForwardProps.ts
new file mode 100644
index 00000000000..0af247e83cc
--- /dev/null
+++ b/frontend/src/metabase/common/utils/doNotForwardProps.ts
@@ -0,0 +1,3 @@
+export const doNotForwardProps = (...propNamesToBlock: string[]) => ({
+  shouldForwardProp: (propName: string) => !propNamesToBlock.includes(propName),
+});
diff --git a/frontend/src/metabase/components/ResponsiveContainer/ResponsiveContainer.tsx b/frontend/src/metabase/components/ResponsiveContainer/ResponsiveContainer.tsx
index 16aaed73179..48f141a13de 100644
--- a/frontend/src/metabase/components/ResponsiveContainer/ResponsiveContainer.tsx
+++ b/frontend/src/metabase/components/ResponsiveContainer/ResponsiveContainer.tsx
@@ -1,12 +1,9 @@
 import styled from "@emotion/styled";
 
 import type { RefProp } from "metabase/browse/types";
+import { doNotForwardProps } from "metabase/common/utils/doNotForwardProps";
 import { Box, type BoxProps } from "metabase/ui";
 
-const doNotForwardProps = (...propNamesToBlock: string[]) => ({
-  shouldForwardProp: (propName: string) => !propNamesToBlock.includes(propName),
-});
-
 /** Helps with @container queries in CSS */
 export const ResponsiveContainer = styled(
   Box,
diff --git a/frontend/src/metabase/components/Schedule/utils.tsx b/frontend/src/metabase/components/Schedule/utils.tsx
index 1a428c18d86..3e1fd7d1089 100644
--- a/frontend/src/metabase/components/Schedule/utils.tsx
+++ b/frontend/src/metabase/components/Schedule/utils.tsx
@@ -20,21 +20,30 @@ export const addScheduleComponents = (
 
 const addBlanks = (arr: ReactNode[]) => {
   const result: ReactNode[] = [];
-  const addBlank = () => result.push(<Box></Box>);
+  const addBlank = () =>
+    result.push(<Box key={`blank-${result.length}`}></Box>);
   for (let c = 0; c < arr.length; c++) {
     const curr = arr[c];
     const next = arr[c + 1];
     const isLastItemString = c === arr.length - 1 && typeof curr === "string";
     if (isLastItemString) {
       addBlank();
-      result.push(<Box mt="-.5rem">{curr}</Box>);
+      result.push(
+        <Box key={curr} mt="-.5rem">
+          {curr}
+        </Box>,
+      );
     } else {
       const isFirstItemString = c === 0 && typeof curr !== "string";
       if (isFirstItemString) {
         addBlank();
       }
       if (typeof curr === "string") {
-        const wrappedCurr = <Box style={{ textAlign: "end" }}>{curr}</Box>;
+        const wrappedCurr = (
+          <Box key={`wrapped-${curr}`} style={{ textAlign: "end" }}>
+            {curr}
+          </Box>
+        );
         result.push(wrappedCurr);
       } else {
         result.push(curr);
@@ -46,7 +55,7 @@ const addBlanks = (arr: ReactNode[]) => {
         curr.props.longestLabel.length + next.props.longestLabel.length < 24;
       if (canSelectsProbablyFitOnOneLine) {
         result[result.length - 1] = (
-          <Group spacing="xs">
+          <Group spacing="xs" key={`selects-on-one-line`}>
             {result[result.length - 1]}
             {next}
           </Group>
-- 
GitLab