diff --git a/e2e/test-component/scenarios/embedding-sdk/redux-provider-clash.cy.spec.tsx b/e2e/test-component/scenarios/embedding-sdk/redux-provider-clash.cy.spec.tsx new file mode 100644 index 0000000000000000000000000000000000000000..e5dcdcb733ab43672b803569e7e45c2b076f005a --- /dev/null +++ b/e2e/test-component/scenarios/embedding-sdk/redux-provider-clash.cy.spec.tsx @@ -0,0 +1,99 @@ +import { + MetabaseProvider, + StaticDashboard, +} from "@metabase/embedding-sdk-react"; +import { configureStore, createSlice } from "@reduxjs/toolkit"; +import { Provider, useDispatch, useSelector } from "react-redux"; + +import { ORDERS_DASHBOARD_ID } from "e2e/support/cypress_sample_instance_data"; +import { describeEE } from "e2e/support/helpers"; +import { + AUTH_PROVIDER_URL, + METABASE_INSTANCE_URL, + mockAuthProviderAndJwtSignIn, + signInAsAdminAndEnableEmbeddingSdk, +} from "e2e/support/helpers/component-testing-sdk"; +import { getSdkRoot } from "e2e/support/helpers/e2e-embedding-sdk-helpers"; + +describeEE( + "scenarios > embedding-sdk > the redux provider context should not clash with the host app", + () => { + beforeEach(() => { + signInAsAdminAndEnableEmbeddingSdk(); + + cy.signOut(); + + mockAuthProviderAndJwtSignIn(); + }); + + it("the host app redux logic should work normally even inside MetabaseProvider", () => { + cy.mount( + <Provider store={customerStore}> + <div data-testid="outside-metabase-provider"> + <CounterButton /> + </div> + <MetabaseProvider + authConfig={{ + authProviderUri: AUTH_PROVIDER_URL, + metabaseInstanceUrl: METABASE_INSTANCE_URL, + }} + > + <div data-testid="inside-metabase-provider"> + <CounterButton /> + </div> + <StaticDashboard dashboardId={ORDERS_DASHBOARD_ID} withDownloads /> + </MetabaseProvider> + </Provider>, + ); + + // the button should render and access the correct redux state both inside and outside the MetabaseProvider + cy.findByTestId("outside-metabase-provider") + .findByText("0") + .should("exist"); + cy.findByTestId("inside-metabase-provider") + .findByText("0") + .should("exist"); + + // sanity check that it's actually working and actions work + cy.findByTestId("inside-metabase-provider").findByText("0").click(); + cy.findByTestId("outside-metabase-provider") + .findByText("1") + .should("exist"); + cy.findByTestId("inside-metabase-provider") + .findByText("1") + .should("exist"); + + // also make sure the sdk is working, most data goes through redux so if it renders + // it means it's working + getSdkRoot().findByText("Orders in a dashboard").should("exist"); + getSdkRoot().findByText("Product ID").should("exist"); + }); + }, +); + +// sample code for customer app +const slice = createSlice({ + name: "counter", + initialState: { + value: 0, + }, + reducers: { + increment: state => { + state.value += 1; + }, + }, +}); +const { increment } = slice.actions; +const customerStore = configureStore({ + reducer: { + counter: slice.reducer, + }, +}); + +const CounterButton = () => { + const count = useSelector( + (state: { counter: { value: number } }) => state.counter.value, + ); + const dispatch = useDispatch(); + return <button onClick={() => dispatch(increment())}>{count}</button>; +}; diff --git a/enterprise/frontend/src/embedding-sdk/components/private/SdkGlobalFontsStyles.tsx b/enterprise/frontend/src/embedding-sdk/components/private/SdkGlobalFontsStyles.tsx index 3c8f711617340bee1d126e8549f4c7f1ec4eea9a..68e8d145c7795ff538701bb11d35e5dc5a091d48 100644 --- a/enterprise/frontend/src/embedding-sdk/components/private/SdkGlobalFontsStyles.tsx +++ b/enterprise/frontend/src/embedding-sdk/components/private/SdkGlobalFontsStyles.tsx @@ -1,8 +1,8 @@ import { Global, css } from "@emotion/react"; import { useMemo } from "react"; -import { useSelector } from "react-redux"; import { defaultFontFiles } from "metabase/css/core/fonts.styled"; +import { useSelector } from "metabase/lib/redux"; import { getFontFiles } from "metabase/styled-components/selectors"; /** diff --git a/enterprise/frontend/src/embedding-sdk/components/public/InteractiveDashboard/ConnectedDashboard.tsx b/enterprise/frontend/src/embedding-sdk/components/public/InteractiveDashboard/ConnectedDashboard.tsx index c34f45a418fc5151463aad56050730f6e097b1a5..2d626e734fb942fe31045e5c8d226651f5bb8afe 100644 --- a/enterprise/frontend/src/embedding-sdk/components/public/InteractiveDashboard/ConnectedDashboard.tsx +++ b/enterprise/frontend/src/embedding-sdk/components/public/InteractiveDashboard/ConnectedDashboard.tsx @@ -1,6 +1,6 @@ import type { Query } from "history"; import type { ComponentType, FC } from "react"; -import { type ConnectedProps, connect } from "react-redux"; +import type { ConnectedProps } from "react-redux"; import _ from "underscore"; import type { SdkPluginsConfig } from "embedding-sdk"; @@ -39,6 +39,7 @@ import type { DashboardRefreshPeriodControls, } from "metabase/dashboard/types"; import { useValidatedEntityId } from "metabase/lib/entity-id/hooks/use-validated-entity-id"; +import { connect } from "metabase/lib/redux"; import type { PublicOrEmbeddedDashboardEventHandlersProps } from "metabase/public/containers/PublicOrEmbeddedDashboard/types"; import { useDashboardLoadHandlers } from "metabase/public/containers/PublicOrEmbeddedDashboard/use-dashboard-load-handlers"; import { closeNavbar, setErrorPage } from "metabase/redux/app"; diff --git a/enterprise/frontend/src/embedding-sdk/components/public/MetabaseProvider.tsx b/enterprise/frontend/src/embedding-sdk/components/public/MetabaseProvider.tsx index 7aebcf0a27223f899e512f787146c50fd5426ef1..90d4eee2684b2e8026ac95b412d5bebcf2c9cd4b 100644 --- a/enterprise/frontend/src/embedding-sdk/components/public/MetabaseProvider.tsx +++ b/enterprise/frontend/src/embedding-sdk/components/public/MetabaseProvider.tsx @@ -1,7 +1,6 @@ import { Global } from "@emotion/react"; import type { Action, Store } from "@reduxjs/toolkit"; import { type JSX, type ReactNode, memo, useEffect, useRef } from "react"; -import { Provider } from "react-redux"; import { SdkThemeProvider } from "embedding-sdk/components/private/SdkThemeProvider"; import { EMBEDDING_SDK_ROOT_ELEMENT_ID } from "embedding-sdk/config"; @@ -22,6 +21,7 @@ import type { } from "embedding-sdk/store/types"; import type { MetabaseAuthConfig } from "embedding-sdk/types"; import type { MetabaseTheme } from "embedding-sdk/types/theme"; +import { MetabaseReduxProvider } from "metabase/lib/redux"; import { LocaleProvider } from "metabase/public/LocaleProvider"; import { setOptions } from "metabase/redux/embed"; import { EmotionCacheProvider } from "metabase/styled-components/components/EmotionCacheProvider"; @@ -141,8 +141,8 @@ export const MetabaseProvider = memo(function MetabaseProvider( } return ( - <Provider store={storeRef.current}> + <MetabaseReduxProvider store={storeRef.current}> <MetabaseProviderInternal store={storeRef.current} {...props} /> - </Provider> + </MetabaseReduxProvider> ); }); diff --git a/enterprise/frontend/src/embedding-sdk/hooks/private/use-sdk-usage-problem.ts b/enterprise/frontend/src/embedding-sdk/hooks/private/use-sdk-usage-problem.ts index 86c575b7d24b23519c7a263958b5c98df4cced53..eda6345f66d99067e26d02b16b1c796deab1ea78 100644 --- a/enterprise/frontend/src/embedding-sdk/hooks/private/use-sdk-usage-problem.ts +++ b/enterprise/frontend/src/embedding-sdk/hooks/private/use-sdk-usage-problem.ts @@ -1,12 +1,11 @@ import { useEffect, useMemo, useRef } from "react"; -import { useDispatch } from "react-redux"; import type { MetabaseAuthConfig } from "embedding-sdk"; import { printUsageProblemToConsole } from "embedding-sdk/lib/print-usage-problem"; import { getSdkUsageProblem } from "embedding-sdk/lib/usage-problem"; +import { useSdkDispatch, useSdkSelector } from "embedding-sdk/store"; import { setUsageProblem } from "embedding-sdk/store/reducer"; import { useSetting } from "metabase/common/hooks"; -import { useSelector } from "metabase/lib/redux"; import { getTokenFeature } from "metabase/setup/selectors"; export function useSdkUsageProblem({ @@ -18,7 +17,7 @@ export function useSdkUsageProblem({ }) { const hasLoggedRef = useRef(false); - const dispatch = useDispatch(); + const dispatch = useSdkDispatch(); // When the setting haven't been loaded or failed to query, we assume that the // feature is _enabled_ first. Otherwise, when a user's instance is temporarily down, @@ -26,7 +25,7 @@ export function useSdkUsageProblem({ // TODO: replace this with "enable-embedding-sdk" once the settings PR landed. const isEnabled = useSetting("enable-embedding") ?? true; - const hasTokenFeature = useSelector(state => { + const hasTokenFeature = useSdkSelector(state => { // We also assume that the feature is enabled if the token-features are missing. // Same reason as above. if (!state.settings.values?.["token-features"]) { diff --git a/enterprise/frontend/src/embedding-sdk/hooks/public/use-current-user.ts b/enterprise/frontend/src/embedding-sdk/hooks/public/use-current-user.ts index 5e63607da5fee60fe5943804b8e9b22cc518cf2a..3fd865720d371f3833e97eeca0088929b6d5ccd1 100644 --- a/enterprise/frontend/src/embedding-sdk/hooks/public/use-current-user.ts +++ b/enterprise/frontend/src/embedding-sdk/hooks/public/use-current-user.ts @@ -1,5 +1,4 @@ -import { useSelector } from "react-redux"; - +import { useSelector } from "metabase/lib/redux"; import { getUser } from "metabase/selectors/user"; export const useCurrentUser = () => useSelector(getUser); diff --git a/enterprise/frontend/src/embedding-sdk/store/index.ts b/enterprise/frontend/src/embedding-sdk/store/index.ts index bce7dffdc278237d7a11fa05b65bb2366692df26..cabf7521ad417adcc3eaf4c039c30dfc5c369f59 100644 --- a/enterprise/frontend/src/embedding-sdk/store/index.ts +++ b/enterprise/frontend/src/embedding-sdk/store/index.ts @@ -1,12 +1,12 @@ -import type { - AnyAction, - Reducer, - Store, - ThunkDispatch, -} from "@reduxjs/toolkit"; +/* eslint-disable no-restricted-imports */ +import type { AnyAction, Reducer, Store } from "@reduxjs/toolkit"; import { useContext } from "react"; -import { ReactReduxContext, useDispatch, useStore } from "react-redux"; +import { + MetabaseReduxContext, + useDispatch, + useStore, +} from "metabase/lib/redux"; import { mainReducers } from "metabase/reducers-main"; import { getStore } from "metabase/store"; @@ -29,11 +29,7 @@ export const getSdkStore = () => }, }) as unknown as Store<SdkStoreState, AnyAction>; -export const useSdkDispatch: () => ThunkDispatch< - SdkStoreState, - void, - AnyAction -> = () => { +export const useSdkDispatch = () => { useCheckSdkReduxContext(); return useDispatch(); @@ -46,7 +42,7 @@ export const useSdkStore = () => { }; const useCheckSdkReduxContext = () => { - const context = useContext(ReactReduxContext); + const context = useContext(MetabaseReduxContext); if (!context) { console.warn( diff --git a/enterprise/frontend/src/embedding-sdk/store/use-sdk-selector.ts b/enterprise/frontend/src/embedding-sdk/store/use-sdk-selector.ts index 74f03d0f7f7821e518042522f599111c0835ee84..3bdb1df10a8d54082804ff936b9ed0e7d3bd5ca2 100644 --- a/enterprise/frontend/src/embedding-sdk/store/use-sdk-selector.ts +++ b/enterprise/frontend/src/embedding-sdk/store/use-sdk-selector.ts @@ -1,24 +1,26 @@ import { useContext } from "react"; -import { - ReactReduxContext, - type TypedUseSelectorHook, - useSelector, -} from "react-redux"; +import type { TypedUseSelectorHook } from "react-redux"; +import { createSelectorHook } from "react-redux"; import type { SdkStoreState } from "embedding-sdk/store/types"; +import { MetabaseReduxContext } from "metabase/lib/redux"; // eslint-disable-next-line no-literal-metabase-strings -- this string only shows in the console. export const USE_OUTSIDE_OF_CONTEXT_MESSAGE = `Hooks from the Metabase Embedding SDK must be used within a component wrapped by the MetabaseProvider`; +const _useSdkSelector: TypedUseSelectorHook<SdkStoreState> = + createSelectorHook(MetabaseReduxContext); + export const useSdkSelector: TypedUseSelectorHook<SdkStoreState> = ( selector, options, ) => { - const context = useContext(ReactReduxContext); + const context = useContext(MetabaseReduxContext); if (!context) { throw new Error(USE_OUTSIDE_OF_CONTEXT_MESSAGE); } - return useSelector(selector, options); + // @ts-expect-error -- weird error on the options type + return _useSdkSelector(selector, options); }; diff --git a/enterprise/frontend/src/metabase-enterprise/advanced_permissions/components/ImpersonationModal/ImpersonationModal.tsx b/enterprise/frontend/src/metabase-enterprise/advanced_permissions/components/ImpersonationModal/ImpersonationModal.tsx index 393637073cb778a9bafe2c29c940cd73b363a7ac..06b1b92f08f565ce8d30c74b00b1de025fcbb371 100644 --- a/enterprise/frontend/src/metabase-enterprise/advanced_permissions/components/ImpersonationModal/ImpersonationModal.tsx +++ b/enterprise/frontend/src/metabase-enterprise/advanced_permissions/components/ImpersonationModal/ImpersonationModal.tsx @@ -1,5 +1,4 @@ import { useCallback } from "react"; -import { useSelector } from "react-redux"; import { withRouter } from "react-router"; import { push } from "react-router-redux"; import { useAsyncFn, useMount } from "react-use"; @@ -17,11 +16,11 @@ import { useDispatch } from "metabase/lib/redux"; import { updateImpersonation } from "metabase-enterprise/advanced_permissions/reducer"; import { getImpersonation } from "metabase-enterprise/advanced_permissions/selectors"; import type { - AdvancedPermissionsStoreState, ImpersonationModalParams, ImpersonationParams, } from "metabase-enterprise/advanced_permissions/types"; import { getImpersonatedDatabaseId } from "metabase-enterprise/advanced_permissions/utils"; +import { useEnterpriseSelector } from "metabase-enterprise/redux"; import { ImpersonationApi } from "metabase-enterprise/services"; import { fetchUserAttributes } from "metabase-enterprise/shared/reducer"; import { getUserAttributes } from "metabase-enterprise/shared/selectors"; @@ -76,11 +75,10 @@ const _ImpersonationModal = ({ route, params }: ImpersonationModalProps) => { id: databaseId, }); - const attributes = useSelector(getUserAttributes); - const draftImpersonation = useSelector< - AdvancedPermissionsStoreState, - Impersonation | undefined - >(getImpersonation(databaseId, groupId)); + const attributes = useEnterpriseSelector(getUserAttributes); + const draftImpersonation = useEnterpriseSelector( + getImpersonation(databaseId, groupId), + ); const selectedAttribute = draftImpersonation?.attribute ?? impersonation?.attribute; diff --git a/enterprise/frontend/src/metabase-enterprise/application_permissions/pages/ApplicationPermissionsPage/ApplicationPermissionsPage.tsx b/enterprise/frontend/src/metabase-enterprise/application_permissions/pages/ApplicationPermissionsPage/ApplicationPermissionsPage.tsx index ebff86fbf8d0c2b8f7ad89f5d6ff4304c10fac26..0bd543349c23c2175674449b4cc3c6efce5aa279 100644 --- a/enterprise/frontend/src/metabase-enterprise/application_permissions/pages/ApplicationPermissionsPage/ApplicationPermissionsPage.tsx +++ b/enterprise/frontend/src/metabase-enterprise/application_permissions/pages/ApplicationPermissionsPage/ApplicationPermissionsPage.tsx @@ -1,5 +1,4 @@ import { useCallback, useEffect } from "react"; -import { connect } from "react-redux"; import type { Route } from "react-router"; import _ from "underscore"; @@ -7,6 +6,7 @@ import { ApplicationPermissionsHelp } from "metabase/admin/permissions/component import { PermissionsEditor } from "metabase/admin/permissions/components/PermissionsEditor"; import PermissionsPageLayout from "metabase/admin/permissions/components/PermissionsPageLayout"; import Groups from "metabase/entities/groups"; +import { connect } from "metabase/lib/redux"; import { initializeApplicationPermissions, saveApplicationPermissions, diff --git a/enterprise/frontend/src/metabase-enterprise/audit_app/containers/AuditTable.jsx b/enterprise/frontend/src/metabase-enterprise/audit_app/containers/AuditTable.jsx index bbb4c149cd0871351deca65cba8a4b60fdd1aa96..f19ab291abf0aa11da596930f5af4202f58b287d 100644 --- a/enterprise/frontend/src/metabase-enterprise/audit_app/containers/AuditTable.jsx +++ b/enterprise/frontend/src/metabase-enterprise/audit_app/containers/AuditTable.jsx @@ -3,13 +3,13 @@ import "../components/AuditTableVisualization"; import { chain } from "icepick"; import PropTypes from "prop-types"; import { useState } from "react"; -import { connect } from "react-redux"; import { push } from "react-router-redux"; import _ from "underscore"; import { PaginationControls } from "metabase/components/PaginationControls"; import CS from "metabase/css/core/index.css"; import { usePagination } from "metabase/hooks/use-pagination"; +import { connect } from "metabase/lib/redux"; import { getMetadata } from "metabase/selectors/metadata"; import Question from "metabase-lib/v1/Question"; diff --git a/enterprise/frontend/src/metabase-enterprise/audit_app/containers/UnsubscribeUserModal/UnsubscribeUserModal.jsx b/enterprise/frontend/src/metabase-enterprise/audit_app/containers/UnsubscribeUserModal/UnsubscribeUserModal.jsx index 9e237981bd03ae9835784346c39bb1c6c568d1bf..f0454ac55ce4c9202073773bb80af3681572f5d8 100644 --- a/enterprise/frontend/src/metabase-enterprise/audit_app/containers/UnsubscribeUserModal/UnsubscribeUserModal.jsx +++ b/enterprise/frontend/src/metabase-enterprise/audit_app/containers/UnsubscribeUserModal/UnsubscribeUserModal.jsx @@ -1,8 +1,8 @@ -import { connect } from "react-redux"; import { t } from "ttag"; import _ from "underscore"; import Users from "metabase/entities/users"; +import { connect } from "metabase/lib/redux"; import { addUndo } from "metabase/redux/undo"; import { AuditApi } from "metabase-enterprise/services"; diff --git a/enterprise/frontend/src/metabase-enterprise/auth/components/SettingsJWTForm/SettingsJWTForm.tsx b/enterprise/frontend/src/metabase-enterprise/auth/components/SettingsJWTForm/SettingsJWTForm.tsx index 7ae1b20085bff521a96022a46e65d817d38fe1d3..827cbba7195774df4bff7f239b2de2044bfb8494 100644 --- a/enterprise/frontend/src/metabase-enterprise/auth/components/SettingsJWTForm/SettingsJWTForm.tsx +++ b/enterprise/frontend/src/metabase-enterprise/auth/components/SettingsJWTForm/SettingsJWTForm.tsx @@ -1,5 +1,4 @@ import { useCallback, useMemo } from "react"; -import { connect } from "react-redux"; import { t } from "ttag"; import _ from "underscore"; @@ -19,6 +18,7 @@ import { FormSwitch, FormTextInput, } from "metabase/forms"; +import { connect } from "metabase/lib/redux"; import { Flex, Stack, rem } from "metabase/ui"; import type { SettingValue } from "metabase-types/api"; diff --git a/enterprise/frontend/src/metabase-enterprise/auth/components/SettingsSAMLForm/SettingsSAMLForm.jsx b/enterprise/frontend/src/metabase-enterprise/auth/components/SettingsSAMLForm/SettingsSAMLForm.jsx index 7c6d9653fddd1205fdb11250097ecdc4398fecd1..b19bb500eae70991fd5b5a8bcdb1ef06d84247fb 100644 --- a/enterprise/frontend/src/metabase-enterprise/auth/components/SettingsSAMLForm/SettingsSAMLForm.jsx +++ b/enterprise/frontend/src/metabase-enterprise/auth/components/SettingsSAMLForm/SettingsSAMLForm.jsx @@ -1,7 +1,6 @@ import cx from "classnames"; import PropTypes from "prop-types"; import { useCallback, useMemo } from "react"; -import { connect } from "react-redux"; import { jt, t } from "ttag"; import _ from "underscore"; @@ -23,6 +22,7 @@ import { FormTextInput, FormTextarea, } from "metabase/forms"; +import { connect } from "metabase/lib/redux"; import { Stack } from "metabase/ui"; import { diff --git a/enterprise/frontend/src/metabase-enterprise/auth/containers/JwtAuthCard/JwtAuthCard.tsx b/enterprise/frontend/src/metabase-enterprise/auth/containers/JwtAuthCard/JwtAuthCard.tsx index 9e33cd124046004c65d075415d0ac83963162918..be1e39148dc8c8ca1c53ac5508fa2de4c68d304e 100644 --- a/enterprise/frontend/src/metabase-enterprise/auth/containers/JwtAuthCard/JwtAuthCard.tsx +++ b/enterprise/frontend/src/metabase-enterprise/auth/containers/JwtAuthCard/JwtAuthCard.tsx @@ -1,8 +1,8 @@ -import { connect } from "react-redux"; import { t } from "ttag"; import AuthCard from "metabase/admin/settings/auth/components/AuthCard"; import { updateSettings } from "metabase/admin/settings/settings"; +import { connect } from "metabase/lib/redux"; import { getSetting } from "metabase/selectors/settings"; import type { Dispatch, State } from "metabase-types/store"; diff --git a/enterprise/frontend/src/metabase-enterprise/auth/containers/SamlAuthCard/SamlAuthCard.tsx b/enterprise/frontend/src/metabase-enterprise/auth/containers/SamlAuthCard/SamlAuthCard.tsx index dbd1d1073ba0fade61c6479a61bbed9e5af37af4..36612c5c7c631f4d8e85759ba305e7788e4731ce 100644 --- a/enterprise/frontend/src/metabase-enterprise/auth/containers/SamlAuthCard/SamlAuthCard.tsx +++ b/enterprise/frontend/src/metabase-enterprise/auth/containers/SamlAuthCard/SamlAuthCard.tsx @@ -1,8 +1,8 @@ -import { connect } from "react-redux"; import { t } from "ttag"; import AuthCard from "metabase/admin/settings/auth/components/AuthCard"; import { updateSettings } from "metabase/admin/settings/settings"; +import { connect } from "metabase/lib/redux"; import { getSetting } from "metabase/selectors/settings"; import type { Dispatch, State } from "metabase-types/store"; diff --git a/enterprise/frontend/src/metabase-enterprise/license/components/LicenseAndBillingSettings/LicenseAndBillingSettings.tsx b/enterprise/frontend/src/metabase-enterprise/license/components/LicenseAndBillingSettings/LicenseAndBillingSettings.tsx index f18438427e9d08c3611e5663a347b6690abbb5ad..71abd7f1130ba900210bb71f0f8c41a58c900aeb 100644 --- a/enterprise/frontend/src/metabase-enterprise/license/components/LicenseAndBillingSettings/LicenseAndBillingSettings.tsx +++ b/enterprise/frontend/src/metabase-enterprise/license/components/LicenseAndBillingSettings/LicenseAndBillingSettings.tsx @@ -1,5 +1,4 @@ import moment from "moment-timezone"; // eslint-disable-line no-restricted-imports -- deprecated usage -import { connect } from "react-redux"; import { jt, t } from "ttag"; import { LicenseInput } from "metabase/admin/settings/components/LicenseInput"; @@ -13,6 +12,7 @@ import { import { ExplorePlansIllustration } from "metabase/admin/settings/components/SettingsLicense/ExplorePlansIllustration"; import LoadingSpinner from "metabase/components/LoadingSpinner"; import ExternalLink from "metabase/core/components/ExternalLink"; +import { connect } from "metabase/lib/redux"; import { getUpgradeUrl } from "metabase/selectors/settings"; import { useGetBillingInfoQuery } from "metabase-enterprise/api"; import { showLicenseAcceptedToast } from "metabase-enterprise/license/actions"; diff --git a/enterprise/frontend/src/metabase-enterprise/moderation/components/QuestionModerationSection/QuestionModerationSection.jsx b/enterprise/frontend/src/metabase-enterprise/moderation/components/QuestionModerationSection/QuestionModerationSection.jsx index 2d1db5e17ead093eda20d0dd4083f66a680fa6d8..2e7cf651ad7d6013120156babf4993b43d84f98e 100644 --- a/enterprise/frontend/src/metabase-enterprise/moderation/components/QuestionModerationSection/QuestionModerationSection.jsx +++ b/enterprise/frontend/src/metabase-enterprise/moderation/components/QuestionModerationSection/QuestionModerationSection.jsx @@ -1,8 +1,8 @@ import PropTypes from "prop-types"; import { Fragment } from "react"; -import { connect } from "react-redux"; import { useEditItemVerificationMutation } from "metabase/api"; +import { connect } from "metabase/lib/redux"; import { getIsModerator } from "metabase-enterprise/moderation/selectors"; import { getLatestModerationReview } from "metabase-enterprise/moderation/service"; diff --git a/enterprise/frontend/src/metabase-enterprise/moderation/containers/ModerationReviewIcon/ModerationReviewIcon.tsx b/enterprise/frontend/src/metabase-enterprise/moderation/containers/ModerationReviewIcon/ModerationReviewIcon.tsx index 74c9fed85835df8cca16009f3c1084778ea2821b..9ab72f2ed54c01a4141229903fd22a055e0f67b1 100644 --- a/enterprise/frontend/src/metabase-enterprise/moderation/containers/ModerationReviewIcon/ModerationReviewIcon.tsx +++ b/enterprise/frontend/src/metabase-enterprise/moderation/containers/ModerationReviewIcon/ModerationReviewIcon.tsx @@ -1,6 +1,6 @@ -import { connect } from "react-redux"; import _ from "underscore"; +import { connect } from "metabase/lib/redux"; import { getUser } from "metabase/selectors/user"; import type { State } from "metabase-types/store"; diff --git a/enterprise/frontend/src/metabase-enterprise/redux.ts b/enterprise/frontend/src/metabase-enterprise/redux.ts new file mode 100644 index 0000000000000000000000000000000000000000..3c4724ea664e86cdd9bc137cd39c9881b3021cff --- /dev/null +++ b/enterprise/frontend/src/metabase-enterprise/redux.ts @@ -0,0 +1,10 @@ +import type { TypedUseSelectorHook } from "react-redux"; +import { createSelectorHook } from "react-redux"; + +import { MetabaseReduxContext } from "metabase/lib/redux"; + +// TODO: use the real type after we figure out what it is +type EnterpriseState = any; + +export const useEnterpriseSelector: TypedUseSelectorHook<EnterpriseState> = + createSelectorHook(MetabaseReduxContext); diff --git a/enterprise/frontend/src/metabase-enterprise/sandboxes/containers/EditSandboxingModal.tsx b/enterprise/frontend/src/metabase-enterprise/sandboxes/containers/EditSandboxingModal.tsx index 128c2aeeaaa487b4397c5996c9f16b1f13c7832f..15269727e99f8f4e6e687e651949a4c199cb9f29 100644 --- a/enterprise/frontend/src/metabase-enterprise/sandboxes/containers/EditSandboxingModal.tsx +++ b/enterprise/frontend/src/metabase-enterprise/sandboxes/containers/EditSandboxingModal.tsx @@ -1,11 +1,11 @@ import { useEffect } from "react"; -import { connect } from "react-redux"; import { withRouter } from "react-router"; import { push } from "react-router-redux"; import _ from "underscore"; import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper"; import { getParentPath } from "metabase/hoc/ModalRoute"; +import { connect } from "metabase/lib/redux"; import { getGroupTableAccessPolicy, getPolicyRequestState, diff --git a/enterprise/frontend/src/metabase-enterprise/snippets/components/SnippetCollectionForm.tsx b/enterprise/frontend/src/metabase-enterprise/snippets/components/SnippetCollectionForm.tsx index 098dd6e4838df17170fc5ca29e21dc0c54b6d1a9..0dc1ba9077da8142e52fdcf30bc2d80bc00bd691 100644 --- a/enterprise/frontend/src/metabase-enterprise/snippets/components/SnippetCollectionForm.tsx +++ b/enterprise/frontend/src/metabase-enterprise/snippets/components/SnippetCollectionForm.tsx @@ -1,5 +1,4 @@ import { useCallback, useMemo } from "react"; -import { connect } from "react-redux"; import { t } from "ttag"; import _ from "underscore"; import * as Yup from "yup"; @@ -17,6 +16,7 @@ import SnippetCollections from "metabase/entities/snippet-collections"; import { Form, FormProvider } from "metabase/forms"; import { color } from "metabase/lib/colors"; import * as Errors from "metabase/lib/errors"; +import { connect } from "metabase/lib/redux"; import type { Collection, CollectionId } from "metabase-types/api"; import type { State } from "metabase-types/store"; diff --git a/enterprise/frontend/src/metabase-enterprise/whitelabel/components/LogoIcon.jsx b/enterprise/frontend/src/metabase-enterprise/whitelabel/components/LogoIcon.jsx index f180130a1b78e381f04e386e5137178d84b5f7ef..9afdab51d4815e9d1ec0d5c32369c3ea5f3aa538 100644 --- a/enterprise/frontend/src/metabase-enterprise/whitelabel/components/LogoIcon.jsx +++ b/enterprise/frontend/src/metabase-enterprise/whitelabel/components/LogoIcon.jsx @@ -2,10 +2,10 @@ import cx from "classnames"; import PropTypes from "prop-types"; import { Component } from "react"; -import { connect } from "react-redux"; import CS from "metabase/css/core/index.css"; import { parseDataUri, removeAllChildren } from "metabase/lib/dom"; +import { connect } from "metabase/lib/redux"; import { getLogoUrl } from "metabase-enterprise/settings/selectors"; const mapStateToProps = state => ({ diff --git a/frontend/src/metabase/App.tsx b/frontend/src/metabase/App.tsx index b5c1dc4e4bfd3e3b9e746f74f2a033d3ba5a4992..11a1bd1b45b4558901e7e8b83f3f278e7341ef88 100644 --- a/frontend/src/metabase/App.tsx +++ b/frontend/src/metabase/App.tsx @@ -2,7 +2,6 @@ import type { Location } from "history"; import { KBarProvider } from "kbar"; import type { ReactNode } from "react"; import { useEffect, useState } from "react"; -import { connect } from "react-redux"; import { AppBanner } from "metabase/components/AppBanner"; import { @@ -17,6 +16,7 @@ import { ContentViewportContext } from "metabase/core/context/ContentViewportCon import CS from "metabase/css/core/index.css"; import ScrollToTop from "metabase/hoc/ScrollToTop"; import { initializeIframeResizer } from "metabase/lib/dom"; +import { connect } from "metabase/lib/redux"; import AppBar from "metabase/nav/containers/AppBar"; import Navbar from "metabase/nav/containers/Navbar"; import { setErrorPage } from "metabase/redux/app"; diff --git a/frontend/src/metabase/account/app/containers/AccountApp/AccountApp.jsx b/frontend/src/metabase/account/app/containers/AccountApp/AccountApp.jsx index addbb738d7aced627d40f3f387ade08643ea77b7..645cef15f996cdad710ae18b940f74ba67e60134 100644 --- a/frontend/src/metabase/account/app/containers/AccountApp/AccountApp.jsx +++ b/frontend/src/metabase/account/app/containers/AccountApp/AccountApp.jsx @@ -1,6 +1,6 @@ -import { connect } from "react-redux"; import { push } from "react-router-redux"; +import { connect } from "metabase/lib/redux"; import { getUser } from "metabase/selectors/user"; import AccountLayout from "../../components/AccountLayout"; diff --git a/frontend/src/metabase/account/notifications/containers/ArchiveAlertModal/ArchiveAlertModal.jsx b/frontend/src/metabase/account/notifications/containers/ArchiveAlertModal/ArchiveAlertModal.jsx index 923a6079ed5e42943cd9be9317a226ca6346478f..9577b6ebf4cd45bf120f40d434abf187fcced383 100644 --- a/frontend/src/metabase/account/notifications/containers/ArchiveAlertModal/ArchiveAlertModal.jsx +++ b/frontend/src/metabase/account/notifications/containers/ArchiveAlertModal/ArchiveAlertModal.jsx @@ -1,7 +1,7 @@ -import { connect } from "react-redux"; import _ from "underscore"; import Alerts from "metabase/entities/alerts"; +import { connect } from "metabase/lib/redux"; import { getUser } from "metabase/selectors/user"; import ArchiveModal from "../../components/ArchiveModal"; diff --git a/frontend/src/metabase/account/notifications/containers/ArchivePulseModal/ArchivePulseModal.jsx b/frontend/src/metabase/account/notifications/containers/ArchivePulseModal/ArchivePulseModal.jsx index 19a5fa0cbe5a28a05d9e4c20266072c8d4d3b72e..15a3206e47f4f8f7666a227b70f420c292fc810c 100644 --- a/frontend/src/metabase/account/notifications/containers/ArchivePulseModal/ArchivePulseModal.jsx +++ b/frontend/src/metabase/account/notifications/containers/ArchivePulseModal/ArchivePulseModal.jsx @@ -1,7 +1,7 @@ -import { connect } from "react-redux"; import _ from "underscore"; import Pulses from "metabase/entities/pulses"; +import { connect } from "metabase/lib/redux"; import { getUser } from "metabase/selectors/user"; import ArchiveModal from "../../components/ArchiveModal"; diff --git a/frontend/src/metabase/account/notifications/containers/NotificationsApp/NotificationsApp.jsx b/frontend/src/metabase/account/notifications/containers/NotificationsApp/NotificationsApp.jsx index 4486aabf50ac5815355f1695f3b0c45928abf317..50649cd5871ee60945983c1dc2ed7e1e0fcd03ce 100644 --- a/frontend/src/metabase/account/notifications/containers/NotificationsApp/NotificationsApp.jsx +++ b/frontend/src/metabase/account/notifications/containers/NotificationsApp/NotificationsApp.jsx @@ -1,8 +1,8 @@ -import { connect } from "react-redux"; import _ from "underscore"; import Alerts from "metabase/entities/alerts"; import Pulses from "metabase/entities/pulses"; +import { connect } from "metabase/lib/redux"; import { canManageSubscriptions, getUser, diff --git a/frontend/src/metabase/account/notifications/containers/UnsubscribeAlertModal/UnsubscribeAlertModal.jsx b/frontend/src/metabase/account/notifications/containers/UnsubscribeAlertModal/UnsubscribeAlertModal.jsx index 7b244e8c8fa66278f5c241b226104d8ccbc090e3..ff2daf00ea3ecd8683040ec8d00bf22567d44770 100644 --- a/frontend/src/metabase/account/notifications/containers/UnsubscribeAlertModal/UnsubscribeAlertModal.jsx +++ b/frontend/src/metabase/account/notifications/containers/UnsubscribeAlertModal/UnsubscribeAlertModal.jsx @@ -1,7 +1,7 @@ -import { connect } from "react-redux"; import _ from "underscore"; import Alerts from "metabase/entities/alerts"; +import { connect } from "metabase/lib/redux"; import { getUser } from "metabase/selectors/user"; import { navigateToArchive } from "../../actions"; diff --git a/frontend/src/metabase/account/notifications/containers/UnsubscribePulseModal/UnsubscribePulseModal.jsx b/frontend/src/metabase/account/notifications/containers/UnsubscribePulseModal/UnsubscribePulseModal.jsx index d7925d758bf5ec86188c39784817b15feef09a0e..886f1058f4bdb140d532f2a2d9ce80fc526973a3 100644 --- a/frontend/src/metabase/account/notifications/containers/UnsubscribePulseModal/UnsubscribePulseModal.jsx +++ b/frontend/src/metabase/account/notifications/containers/UnsubscribePulseModal/UnsubscribePulseModal.jsx @@ -1,7 +1,7 @@ -import { connect } from "react-redux"; import _ from "underscore"; import Pulses from "metabase/entities/pulses"; +import { connect } from "metabase/lib/redux"; import { getUser } from "metabase/selectors/user"; import { navigateToArchive } from "../../actions"; diff --git a/frontend/src/metabase/account/password/containers/UserPasswordApp/UserPasswordApp.tsx b/frontend/src/metabase/account/password/containers/UserPasswordApp/UserPasswordApp.tsx index 3c67481550601a50ccb5bd6b896684dbb1307251..407ffb699c056278c1914ec99497504dea33af1e 100644 --- a/frontend/src/metabase/account/password/containers/UserPasswordApp/UserPasswordApp.tsx +++ b/frontend/src/metabase/account/password/containers/UserPasswordApp/UserPasswordApp.tsx @@ -1,5 +1,4 @@ -import { connect } from "react-redux"; - +import { connect } from "metabase/lib/redux"; import { checkNotNull } from "metabase/lib/types"; import { getUser } from "metabase/selectors/user"; import type { State } from "metabase-types/store"; diff --git a/frontend/src/metabase/account/profile/containers/UserProfileApp/UserProfileApp.tsx b/frontend/src/metabase/account/profile/containers/UserProfileApp/UserProfileApp.tsx index 77e462a6e055a6777303567304c20b238b79c78c..dec3ece13645db95da644e64a773ebe1b6318f99 100644 --- a/frontend/src/metabase/account/profile/containers/UserProfileApp/UserProfileApp.tsx +++ b/frontend/src/metabase/account/profile/containers/UserProfileApp/UserProfileApp.tsx @@ -1,5 +1,4 @@ -import { connect } from "react-redux"; - +import { connect } from "metabase/lib/redux"; import { checkNotNull } from "metabase/lib/types"; import { getUser } from "metabase/selectors/user"; import type { State } from "metabase-types/store"; diff --git a/frontend/src/metabase/actions/components/ActionViz/Action.tsx b/frontend/src/metabase/actions/components/ActionViz/Action.tsx index d4d6ce2c1eb4c26353de37037deca31f2c1b6636..340025c7bba5933e299139a3a5afdbefda1de6d5 100644 --- a/frontend/src/metabase/actions/components/ActionViz/Action.tsx +++ b/frontend/src/metabase/actions/components/ActionViz/Action.tsx @@ -1,5 +1,4 @@ import { useCallback, useMemo } from "react"; -import { connect } from "react-redux"; import { t } from "ttag"; import { skipToken, useGetCardQuery } from "metabase/api"; @@ -13,7 +12,7 @@ import { getParameterValues, } from "metabase/dashboard/selectors"; import { getActionIsEnabledInDatabase } from "metabase/dashboard/utils"; -import { useSelector } from "metabase/lib/redux"; +import { connect, useSelector } from "metabase/lib/redux"; import { getMetadata } from "metabase/selectors/metadata"; import type { VisualizationProps } from "metabase/visualizations/types"; import Question from "metabase-lib/v1/Question"; diff --git a/frontend/src/metabase/actions/components/ActionViz/ActionDashcardSettings.tsx b/frontend/src/metabase/actions/components/ActionViz/ActionDashcardSettings.tsx index 30c79093cd5706f1d4c8e407f898e179ac3a4482..b76eb513b9a641cd1d4194d8cfb5bd4566d3a42c 100644 --- a/frontend/src/metabase/actions/components/ActionViz/ActionDashcardSettings.tsx +++ b/frontend/src/metabase/actions/components/ActionViz/ActionDashcardSettings.tsx @@ -1,5 +1,4 @@ import { useMemo } from "react"; -import { connect } from "react-redux"; import { t } from "ttag"; import { ConnectedActionPicker } from "metabase/actions/containers/ActionPicker"; @@ -7,6 +6,7 @@ import EmptyState from "metabase/components/EmptyState"; import Button from "metabase/core/components/Button"; import CS from "metabase/css/core/index.css"; import { setActionForDashcard } from "metabase/dashboard/actions"; +import { connect } from "metabase/lib/redux"; import type { ActionDashboardCard, Dashboard, diff --git a/frontend/src/metabase/actions/containers/ActionCreator/ActionCreator.tsx b/frontend/src/metabase/actions/containers/ActionCreator/ActionCreator.tsx index c0f1a707d8538187c38c9062c59072a171a0b48f..f6eeceb4c0e36bf03e9a36db9dfa862064a857f1 100644 --- a/frontend/src/metabase/actions/containers/ActionCreator/ActionCreator.tsx +++ b/frontend/src/metabase/actions/containers/ActionCreator/ActionCreator.tsx @@ -1,5 +1,4 @@ import { useState } from "react"; -import { connect } from "react-redux"; import type { Route } from "react-router"; import { t } from "ttag"; import _ from "underscore"; @@ -15,6 +14,7 @@ import Database from "metabase/entities/databases"; import Questions from "metabase/entities/questions"; import useBeforeUnload from "metabase/hooks/use-before-unload"; import { useCallbackEffect } from "metabase/hooks/use-callback-effect"; +import { connect } from "metabase/lib/redux"; import { getMetadata } from "metabase/selectors/metadata"; import type Question from "metabase-lib/v1/Question"; import type Metadata from "metabase-lib/v1/metadata/Metadata"; diff --git a/frontend/src/metabase/actions/containers/ActionCreator/InlineActionSettings.tsx b/frontend/src/metabase/actions/containers/ActionCreator/InlineActionSettings.tsx index 0abb99f1e2e793a86c5233902da44bc3dfc665e8..228fe24deac2cb01a146d0480725c6ffc3d51606 100644 --- a/frontend/src/metabase/actions/containers/ActionCreator/InlineActionSettings.tsx +++ b/frontend/src/metabase/actions/containers/ActionCreator/InlineActionSettings.tsx @@ -1,5 +1,4 @@ import type { ChangeEvent } from "react"; -import { connect } from "react-redux"; import { t } from "ttag"; import ConfirmContent from "metabase/components/ConfirmContent"; @@ -13,6 +12,7 @@ import Tooltip from "metabase/core/components/Tooltip"; import Actions from "metabase/entities/actions/actions"; import { useToggle } from "metabase/hooks/use-toggle"; import { useUniqueId } from "metabase/hooks/use-unique-id"; +import { connect } from "metabase/lib/redux"; import * as Urls from "metabase/lib/urls"; import SidebarContent from "metabase/query_builder/components/SidebarContent"; import { getSetting } from "metabase/selectors/settings"; diff --git a/frontend/src/metabase/actions/containers/ActionCreatorModal/ActionCreatorModal.tsx b/frontend/src/metabase/actions/containers/ActionCreatorModal/ActionCreatorModal.tsx index e906edf5ba7cc62a9dbed0958845a3d07f45eda1..b65244bfefd9ed230f07b3d93d73f10d28d9b12d 100644 --- a/frontend/src/metabase/actions/containers/ActionCreatorModal/ActionCreatorModal.tsx +++ b/frontend/src/metabase/actions/containers/ActionCreatorModal/ActionCreatorModal.tsx @@ -1,12 +1,12 @@ import type { LocationDescriptor } from "history"; import { useEffect } from "react"; -import { connect } from "react-redux"; import type { Route } from "react-router"; import { replace } from "react-router-redux"; import _ from "underscore"; import { skipToken, useGetActionQuery } from "metabase/api"; import Models from "metabase/entities/questions"; +import { connect } from "metabase/lib/redux"; import * as Urls from "metabase/lib/urls"; import { setErrorPage } from "metabase/redux/app"; import type Question from "metabase-lib/v1/Question"; diff --git a/frontend/src/metabase/admin/app/containers/DeprecationNotice/DeprecationNotice.tsx b/frontend/src/metabase/admin/app/containers/DeprecationNotice/DeprecationNotice.tsx index 91ca2124dfc3cf5442ecb463ad20f1e6ef757a25..a608f01f1d5614f21bbf9a048f84494d8b607416 100644 --- a/frontend/src/metabase/admin/app/containers/DeprecationNotice/DeprecationNotice.tsx +++ b/frontend/src/metabase/admin/app/containers/DeprecationNotice/DeprecationNotice.tsx @@ -1,7 +1,7 @@ -import { connect } from "react-redux"; import _ from "underscore"; import Databases from "metabase/entities/databases"; +import { connect } from "metabase/lib/redux"; import type Database from "metabase-lib/v1/metadata/Database"; import type { State } from "metabase-types/store"; diff --git a/frontend/src/metabase/admin/databases/containers/DatabaseEditApp.tsx b/frontend/src/metabase/admin/databases/containers/DatabaseEditApp.tsx index 70032cfb365e3489c30e028f5db3a7f481d36906..055927dd0d678c25f6d7672014e61b1ea8ec9a23 100644 --- a/frontend/src/metabase/admin/databases/containers/DatabaseEditApp.tsx +++ b/frontend/src/metabase/admin/databases/containers/DatabaseEditApp.tsx @@ -2,7 +2,6 @@ import type { Location, LocationDescriptor } from "history"; import { updateIn } from "icepick"; import type { ComponentType } from "react"; import { useState } from "react"; -import { connect } from "react-redux"; import type { Route } from "react-router"; import { push } from "react-router-redux"; import { useMount } from "react-use"; @@ -19,6 +18,7 @@ import CS from "metabase/css/core/index.css"; import { DatabaseForm } from "metabase/databases/components/DatabaseForm"; import title from "metabase/hoc/Title"; import { useCallbackEffect } from "metabase/hooks/use-callback-effect"; +import { connect } from "metabase/lib/redux"; import { getSetting } from "metabase/selectors/settings"; import { getUserIsAdmin } from "metabase/selectors/user"; import Database from "metabase-lib/v1/metadata/Database"; diff --git a/frontend/src/metabase/admin/databases/containers/DatabaseListApp.jsx b/frontend/src/metabase/admin/databases/containers/DatabaseListApp.jsx index f7ec9761f6e3fa112cb38c40f55ea65f5ad8c7b5..4c9a21c99cf03b802665ec999fc7f64e567a2412 100644 --- a/frontend/src/metabase/admin/databases/containers/DatabaseListApp.jsx +++ b/frontend/src/metabase/admin/databases/containers/DatabaseListApp.jsx @@ -1,8 +1,8 @@ -import { connect } from "react-redux"; import _ from "underscore"; import LoadingAndGenericErrorWrapper from "metabase/components/LoadingAndGenericErrorWrapper"; import Database from "metabase/entities/databases"; +import { connect } from "metabase/lib/redux"; import { isSyncInProgress } from "metabase/lib/syncing"; import { PLUGIN_FEATURE_LEVEL_PERMISSIONS } from "metabase/plugins"; import { getSetting } from "metabase/selectors/settings"; diff --git a/frontend/src/metabase/admin/datamodel/containers/DataModelApp/DataModelApp.jsx b/frontend/src/metabase/admin/datamodel/containers/DataModelApp/DataModelApp.jsx index a9dec95e4021d208dc56771264c1cf8877f19641..b406429fc2898031dd8bb7918c616805b5200e7a 100644 --- a/frontend/src/metabase/admin/datamodel/containers/DataModelApp/DataModelApp.jsx +++ b/frontend/src/metabase/admin/datamodel/containers/DataModelApp/DataModelApp.jsx @@ -1,11 +1,11 @@ import PropTypes from "prop-types"; import { Fragment, useMemo } from "react"; -import { connect } from "react-redux"; import { push } from "react-router-redux"; import { t } from "ttag"; import Radio from "metabase/core/components/Radio"; import { useToggle } from "metabase/hooks/use-toggle"; +import { connect } from "metabase/lib/redux"; import { getUserIsAdmin } from "metabase/selectors/user"; import { ModelEducationButton, NavBar } from "./DataModelApp.styled"; diff --git a/frontend/src/metabase/admin/datamodel/containers/RevisionHistoryApp.jsx b/frontend/src/metabase/admin/datamodel/containers/RevisionHistoryApp.jsx index 6e5a0aa5208368212cb26973b095e1d4a126b5c2..356c0276c7af260103112b6658b6901e77dee33a 100644 --- a/frontend/src/metabase/admin/datamodel/containers/RevisionHistoryApp.jsx +++ b/frontend/src/metabase/admin/datamodel/containers/RevisionHistoryApp.jsx @@ -1,10 +1,10 @@ /* eslint-disable react/prop-types */ import { Component } from "react"; -import { connect } from "react-redux"; import _ from "underscore"; import Segments from "metabase/entities/segments"; import Tables from "metabase/entities/tables"; +import { connect } from "metabase/lib/redux"; import RevisionHistory from "../components/revisions/RevisionHistory"; import { fetchSegmentRevisions } from "../datamodel"; diff --git a/frontend/src/metabase/admin/datamodel/containers/SegmentApp.jsx b/frontend/src/metabase/admin/datamodel/containers/SegmentApp.jsx index d423b295b1c676f71e8c0f172c1d3379977299ef..9c179c949be1520e713999b69575b4bb52fbd307 100644 --- a/frontend/src/metabase/admin/datamodel/containers/SegmentApp.jsx +++ b/frontend/src/metabase/admin/datamodel/containers/SegmentApp.jsx @@ -1,6 +1,5 @@ /* eslint-disable react/prop-types */ import { useCallback, useState } from "react"; -import { connect } from "react-redux"; import { push } from "react-router-redux"; import _ from "underscore"; @@ -8,6 +7,7 @@ import { LeaveConfirmationModal } from "metabase/components/LeaveConfirmationMod import Segments from "metabase/entities/segments"; import Tables from "metabase/entities/tables"; import { useCallbackEffect } from "metabase/hooks/use-callback-effect"; +import { connect } from "metabase/lib/redux"; import SegmentForm from "../components/SegmentForm"; import { updatePreviewSummary } from "../datamodel"; diff --git a/frontend/src/metabase/admin/datamodel/containers/SegmentListApp.jsx b/frontend/src/metabase/admin/datamodel/containers/SegmentListApp.jsx index 8bf23d5b3f029024dc39449bc9171793fa809f99..c42a0a7914d728e0744faee93db689f4613a6068 100644 --- a/frontend/src/metabase/admin/datamodel/containers/SegmentListApp.jsx +++ b/frontend/src/metabase/admin/datamodel/containers/SegmentListApp.jsx @@ -1,7 +1,6 @@ /* eslint-disable react/prop-types */ import cx from "classnames"; import { Component } from "react"; -import { connect } from "react-redux"; import { t } from "ttag"; import _ from "underscore"; @@ -12,6 +11,7 @@ import Link from "metabase/core/components/Link"; import AdminS from "metabase/css/admin.module.css"; import CS from "metabase/css/core/index.css"; import Segments from "metabase/entities/segments"; +import { connect } from "metabase/lib/redux"; class SegmentListAppInner extends Component { render() { diff --git a/frontend/src/metabase/admin/datamodel/hoc/FilteredToUrlTable.jsx b/frontend/src/metabase/admin/datamodel/hoc/FilteredToUrlTable.jsx index e355c8b8e6639f877e5547956f39e1969b0861f0..14b41028c62c7c6ad096b5a515b272dd05fad664 100644 --- a/frontend/src/metabase/admin/datamodel/hoc/FilteredToUrlTable.jsx +++ b/frontend/src/metabase/admin/datamodel/hoc/FilteredToUrlTable.jsx @@ -1,13 +1,13 @@ /* eslint-disable react/prop-types */ import cx from "classnames"; import { Component } from "react"; -import { connect } from "react-redux"; import { push } from "react-router-redux"; import { t } from "ttag"; import { FieldSet } from "metabase/components/FieldSet"; import CS from "metabase/css/core/index.css"; import Tables from "metabase/entities/tables"; +import { connect } from "metabase/lib/redux"; import { DatabaseSchemaAndTableDataSelector } from "metabase/query_builder/components/DataSelector"; import { Icon } from "metabase/ui"; diff --git a/frontend/src/metabase/admin/datamodel/metadata/components/FieldFormattingSettings/FieldFormattingSettings.tsx b/frontend/src/metabase/admin/datamodel/metadata/components/FieldFormattingSettings/FieldFormattingSettings.tsx index 649696dbc3ac6cbc0b58588051da1cbb3b8d1f0e..65b0d7ec5831db2b18a20384e83f1914ece67942 100644 --- a/frontend/src/metabase/admin/datamodel/metadata/components/FieldFormattingSettings/FieldFormattingSettings.tsx +++ b/frontend/src/metabase/admin/datamodel/metadata/components/FieldFormattingSettings/FieldFormattingSettings.tsx @@ -1,7 +1,7 @@ import { useCallback, useMemo } from "react"; -import { connect } from "react-redux"; import Fields from "metabase/entities/fields"; +import { connect } from "metabase/lib/redux"; import ColumnSettings from "metabase/visualizations/components/ColumnSettings"; import { getGlobalSettingsForColumn } from "metabase/visualizations/lib/settings/column"; import type Field from "metabase-lib/v1/metadata/Field"; diff --git a/frontend/src/metabase/admin/datamodel/metadata/components/FieldGeneralSettings/FieldGeneralSettings.tsx b/frontend/src/metabase/admin/datamodel/metadata/components/FieldGeneralSettings/FieldGeneralSettings.tsx index 61995bcdd4defcd2a345a4641533a2024b7b533a..3085c94c7f31e5e30f4632706e16c4ca4c9932f4 100644 --- a/frontend/src/metabase/admin/datamodel/metadata/components/FieldGeneralSettings/FieldGeneralSettings.tsx +++ b/frontend/src/metabase/admin/datamodel/metadata/components/FieldGeneralSettings/FieldGeneralSettings.tsx @@ -1,6 +1,5 @@ import cx from "classnames"; import { useCallback, useMemo } from "react"; -import { connect } from "react-redux"; import { t } from "ttag"; import { humanizeCoercionStrategy } from "metabase/admin/datamodel/utils/humanizeCoercionStrategy"; @@ -16,6 +15,7 @@ import ButtonsS from "metabase/css/components/buttons.module.css"; import CS from "metabase/css/core/index.css"; import Fields from "metabase/entities/fields"; import * as MetabaseCore from "metabase/lib/core"; +import { connect } from "metabase/lib/redux"; import type Field from "metabase-lib/v1/metadata/Field"; import type Table from "metabase-lib/v1/metadata/Table"; import type { FieldValuesType } from "metabase-types/api"; diff --git a/frontend/src/metabase/admin/datamodel/metadata/components/FieldRemappingSettings/FieldRemappingSettings.jsx b/frontend/src/metabase/admin/datamodel/metadata/components/FieldRemappingSettings/FieldRemappingSettings.jsx index 5bf4ba86f6ef6729a9a4e27f2313f3503293796c..49ff9c87f15def064079288a049453cf0cf388aa 100644 --- a/frontend/src/metabase/admin/datamodel/metadata/components/FieldRemappingSettings/FieldRemappingSettings.jsx +++ b/frontend/src/metabase/admin/datamodel/metadata/components/FieldRemappingSettings/FieldRemappingSettings.jsx @@ -1,7 +1,6 @@ /* eslint-disable react/prop-types */ import cx from "classnames"; import { Component, createRef } from "react"; -import { connect } from "react-redux"; import { t } from "ttag"; import _ from "underscore"; @@ -9,6 +8,7 @@ import ButtonWithStatus from "metabase/components/ButtonWithStatus"; import Select from "metabase/core/components/Select"; import CS from "metabase/css/core/index.css"; import Fields from "metabase/entities/fields"; +import { connect } from "metabase/lib/redux"; import { PLUGIN_FEATURE_LEVEL_PERMISSIONS } from "metabase/plugins"; import { FieldDataSelector } from "metabase/query_builder/components/DataSelector"; import { getMetadataUnfiltered } from "metabase/selectors/metadata"; diff --git a/frontend/src/metabase/admin/datamodel/metadata/components/MetadataFieldSettings/MetadataFieldSettings.tsx b/frontend/src/metabase/admin/datamodel/metadata/components/MetadataFieldSettings/MetadataFieldSettings.tsx index 797b16f3ddf7bfec1392f8251efe5186bfa518ef..b9d2fef2216501dab613e274de3dedee6432e750 100644 --- a/frontend/src/metabase/admin/datamodel/metadata/components/MetadataFieldSettings/MetadataFieldSettings.tsx +++ b/frontend/src/metabase/admin/datamodel/metadata/components/MetadataFieldSettings/MetadataFieldSettings.tsx @@ -1,5 +1,4 @@ import cx from "classnames"; -import { connect } from "react-redux"; import { t } from "ttag"; import _ from "underscore"; @@ -12,6 +11,7 @@ import Databases from "metabase/entities/databases"; import Fields from "metabase/entities/fields"; import Schemas from "metabase/entities/schemas"; import Tables from "metabase/entities/tables"; +import { connect } from "metabase/lib/redux"; import * as Urls from "metabase/lib/urls"; import { PLUGIN_FEATURE_LEVEL_PERMISSIONS } from "metabase/plugins"; import type Database from "metabase-lib/v1/metadata/Database"; diff --git a/frontend/src/metabase/admin/datamodel/metadata/components/MetadataHeader/MetadataHeader.tsx b/frontend/src/metabase/admin/datamodel/metadata/components/MetadataHeader/MetadataHeader.tsx index 4f197d68c7fa51d9d84026833c80c7e6f5d46297..b7e99b39ca28eae7d19017ca2b09ca16cb768da6 100644 --- a/frontend/src/metabase/admin/datamodel/metadata/components/MetadataHeader/MetadataHeader.tsx +++ b/frontend/src/metabase/admin/datamodel/metadata/components/MetadataHeader/MetadataHeader.tsx @@ -1,12 +1,12 @@ import cx from "classnames"; import { useLayoutEffect } from "react"; -import { connect } from "react-redux"; import { push, replace } from "react-router-redux"; import { t } from "ttag"; import _ from "underscore"; import CS from "metabase/css/core/index.css"; import Databases from "metabase/entities/databases"; +import { connect } from "metabase/lib/redux"; import * as Urls from "metabase/lib/urls"; import { PLUGIN_FEATURE_LEVEL_PERMISSIONS } from "metabase/plugins"; import { DatabaseDataSelector } from "metabase/query_builder/components/DataSelector"; diff --git a/frontend/src/metabase/admin/datamodel/metadata/components/MetadataSchemaList/MetadataSchemaList.tsx b/frontend/src/metabase/admin/datamodel/metadata/components/MetadataSchemaList/MetadataSchemaList.tsx index 20c6a462cb0001b5591fcf1ab865cea232301bae..3292504bb479723943aba05ce96519ab5d12e9c2 100644 --- a/frontend/src/metabase/admin/datamodel/metadata/components/MetadataSchemaList/MetadataSchemaList.tsx +++ b/frontend/src/metabase/admin/datamodel/metadata/components/MetadataSchemaList/MetadataSchemaList.tsx @@ -1,6 +1,5 @@ import cx from "classnames"; import { useCallback, useLayoutEffect, useMemo, useState } from "react"; -import { connect } from "react-redux"; import { push, replace } from "react-router-redux"; import { msgid, ngettext, t } from "ttag"; import _ from "underscore"; @@ -8,6 +7,7 @@ import _ from "underscore"; import AdminS from "metabase/css/admin.module.css"; import CS from "metabase/css/core/index.css"; import Schemas from "metabase/entities/schemas"; +import { connect } from "metabase/lib/redux"; import * as Urls from "metabase/lib/urls"; import { PLUGIN_FEATURE_LEVEL_PERMISSIONS } from "metabase/plugins"; import { Icon } from "metabase/ui"; diff --git a/frontend/src/metabase/admin/datamodel/metadata/components/MetadataTable/MetadataTable.tsx b/frontend/src/metabase/admin/datamodel/metadata/components/MetadataTable/MetadataTable.tsx index c4f402981147547c0c28be8a157e4c0d8ee3bb10..ef23b37b301f02f6e05eec20ace73ee1eb52dc6a 100644 --- a/frontend/src/metabase/admin/datamodel/metadata/components/MetadataTable/MetadataTable.tsx +++ b/frontend/src/metabase/admin/datamodel/metadata/components/MetadataTable/MetadataTable.tsx @@ -1,7 +1,6 @@ import cx from "classnames"; import type { ReactNode } from "react"; import { useCallback, useState } from "react"; -import { connect } from "react-redux"; import { t } from "ttag"; import _ from "underscore"; @@ -10,6 +9,7 @@ import AdminS from "metabase/css/admin.module.css"; import CS from "metabase/css/core/index.css"; import Databases from "metabase/entities/databases"; import Tables from "metabase/entities/tables"; +import { connect } from "metabase/lib/redux"; import { PLUGIN_FEATURE_LEVEL_PERMISSIONS } from "metabase/plugins"; import type Field from "metabase-lib/v1/metadata/Field"; import type Table from "metabase-lib/v1/metadata/Table"; diff --git a/frontend/src/metabase/admin/datamodel/metadata/components/MetadataTableColumn/MetadataTableColumn.tsx b/frontend/src/metabase/admin/datamodel/metadata/components/MetadataTableColumn/MetadataTableColumn.tsx index 8babf714a3a06ab78f587d57dcc2679f3f4e09ac..9be039ea968958c88fc4def13d741d87dad95f68 100644 --- a/frontend/src/metabase/admin/datamodel/metadata/components/MetadataTableColumn/MetadataTableColumn.tsx +++ b/frontend/src/metabase/admin/datamodel/metadata/components/MetadataTableColumn/MetadataTableColumn.tsx @@ -1,13 +1,13 @@ import cx from "classnames"; import type { ReactNode } from "react"; import { useCallback } from "react"; -import { connect } from "react-redux"; import { t } from "ttag"; import Button from "metabase/core/components/Button/Button"; import AdminS from "metabase/css/admin.module.css"; import CS from "metabase/css/core/index.css"; import Fields from "metabase/entities/fields"; +import { connect } from "metabase/lib/redux"; import * as Urls from "metabase/lib/urls"; import type Field from "metabase-lib/v1/metadata/Field"; import type { DatabaseId, SchemaId, TableId } from "metabase-types/api"; diff --git a/frontend/src/metabase/admin/datamodel/metadata/components/MetadataTableColumnList/MetadataTableColumnList.tsx b/frontend/src/metabase/admin/datamodel/metadata/components/MetadataTableColumnList/MetadataTableColumnList.tsx index bf138fa5b824087c058b4a38513e3fc0f529fda2..e25aaab5593199799dc0c159639af8db194387f7 100644 --- a/frontend/src/metabase/admin/datamodel/metadata/components/MetadataTableColumnList/MetadataTableColumnList.tsx +++ b/frontend/src/metabase/admin/datamodel/metadata/components/MetadataTableColumnList/MetadataTableColumnList.tsx @@ -4,7 +4,6 @@ import { useSortable } from "@dnd-kit/sortable"; import { CSS } from "@dnd-kit/utilities"; import cx from "classnames"; import { useCallback, useMemo } from "react"; -import { connect } from "react-redux"; import { t } from "ttag"; import _ from "underscore"; @@ -15,6 +14,7 @@ import type { DragEndEvent } from "metabase/core/components/Sortable"; import { SortableList } from "metabase/core/components/Sortable"; import CS from "metabase/css/core/index.css"; import Tables from "metabase/entities/tables"; +import { connect } from "metabase/lib/redux"; import { Icon } from "metabase/ui"; import type Field from "metabase-lib/v1/metadata/Field"; import type Table from "metabase-lib/v1/metadata/Table"; diff --git a/frontend/src/metabase/admin/datamodel/metadata/components/MetadataTableList/MetadataTableList.tsx b/frontend/src/metabase/admin/datamodel/metadata/components/MetadataTableList/MetadataTableList.tsx index 97f488771870dbe1dea37f20671032068f6aaf8d..75108872d6e738bfeb65377cfe3d5a9f61ab7d34 100644 --- a/frontend/src/metabase/admin/datamodel/metadata/components/MetadataTableList/MetadataTableList.tsx +++ b/frontend/src/metabase/admin/datamodel/metadata/components/MetadataTableList/MetadataTableList.tsx @@ -1,7 +1,6 @@ import cx from "classnames"; import type { ChangeEvent, MouseEvent } from "react"; import { useCallback, useMemo, useState } from "react"; -import { connect } from "react-redux"; import { push } from "react-router-redux"; import { useAsyncFn } from "react-use"; import { msgid, ngettext, t } from "ttag"; @@ -11,6 +10,7 @@ import Tooltip from "metabase/core/components/Tooltip"; import AdminS from "metabase/css/admin.module.css"; import CS from "metabase/css/core/index.css"; import Tables from "metabase/entities/tables"; +import { connect } from "metabase/lib/redux"; import { isSyncCompleted, isSyncInProgress } from "metabase/lib/syncing"; import * as Urls from "metabase/lib/urls"; import { PLUGIN_FEATURE_LEVEL_PERMISSIONS } from "metabase/plugins"; diff --git a/frontend/src/metabase/admin/people/components/GroupDetail.jsx b/frontend/src/metabase/admin/people/components/GroupDetail.jsx index 033013623983f06756c255034111fccb15efcfe0..916f1d5c63ba53cca697d779ba0fd593e05b6102 100644 --- a/frontend/src/metabase/admin/people/components/GroupDetail.jsx +++ b/frontend/src/metabase/admin/people/components/GroupDetail.jsx @@ -1,7 +1,6 @@ /* eslint-disable react/prop-types */ import cx from "classnames"; import { Fragment, useEffect, useState } from "react"; -import { connect } from "react-redux"; import { msgid, ngettext, t } from "ttag"; import { AdminPaneLayout } from "metabase/components/AdminPaneLayout"; @@ -14,6 +13,7 @@ import { isAdminGroup, isDefaultGroup, } from "metabase/lib/groups"; +import { connect } from "metabase/lib/redux"; import { PLUGIN_GROUP_MANAGERS } from "metabase/plugins"; import { getUser } from "metabase/selectors/user"; diff --git a/frontend/src/metabase/admin/people/components/PeopleList.jsx b/frontend/src/metabase/admin/people/components/PeopleList.jsx index c165f7f2e7cbd4e1d9dd9d37ed48b597427acbf1..2b04c9dabbb5330cab62da4c43b43d3c70fd683e 100644 --- a/frontend/src/metabase/admin/people/components/PeopleList.jsx +++ b/frontend/src/metabase/admin/people/components/PeopleList.jsx @@ -1,7 +1,6 @@ import cx from "classnames"; import PropTypes from "prop-types"; import { Fragment, useEffect } from "react"; -import { connect } from "react-redux"; import { usePrevious } from "react-use"; import { msgid, ngettext, t } from "ttag"; import _ from "underscore"; @@ -12,6 +11,7 @@ import CS from "metabase/css/core/index.css"; import Group from "metabase/entities/groups"; import Users from "metabase/entities/users"; import { useConfirmation } from "metabase/hooks/use-confirmation"; +import { connect } from "metabase/lib/redux"; import { PLUGIN_GROUP_MANAGERS } from "metabase/plugins"; import { getUser, getUserIsAdmin } from "metabase/selectors/user"; import { Icon } from "metabase/ui"; diff --git a/frontend/src/metabase/admin/people/containers/GroupsListingApp.jsx b/frontend/src/metabase/admin/people/containers/GroupsListingApp.jsx index 2a8f923bd6423012592519274e28d33b89447e63..d331091fb58d7fb9f98bde092c00f3ecc0db9bf5 100644 --- a/frontend/src/metabase/admin/people/containers/GroupsListingApp.jsx +++ b/frontend/src/metabase/admin/people/containers/GroupsListingApp.jsx @@ -1,8 +1,8 @@ import { Component } from "react"; -import { connect } from "react-redux"; import _ from "underscore"; import Group from "metabase/entities/groups"; +import { connect } from "metabase/lib/redux"; import { PLUGIN_GROUP_MANAGERS } from "metabase/plugins"; import { getUserIsAdmin } from "metabase/selectors/user"; diff --git a/frontend/src/metabase/admin/people/containers/PeopleListingApp.jsx b/frontend/src/metabase/admin/people/containers/PeopleListingApp.jsx index b88823efdb4aa4c9eaea8b3cdb41db7b532c2630..331bedab776d29433d20a8e903c947fa63042ca8 100644 --- a/frontend/src/metabase/admin/people/containers/PeopleListingApp.jsx +++ b/frontend/src/metabase/admin/people/containers/PeopleListingApp.jsx @@ -1,10 +1,10 @@ import cx from "classnames"; import PropTypes from "prop-types"; -import { connect } from "react-redux"; import { t } from "ttag"; import { AdminPaneLayout } from "metabase/components/AdminPaneLayout"; import CS from "metabase/css/core/index.css"; +import { connect } from "metabase/lib/redux"; import * as Urls from "metabase/lib/urls"; import { getUserIsAdmin } from "metabase/selectors/user"; import { Group, Radio } from "metabase/ui"; diff --git a/frontend/src/metabase/admin/people/containers/UserActivationModal.jsx b/frontend/src/metabase/admin/people/containers/UserActivationModal.jsx index 48fa9d693430a5d258325e6d691dbcbb420509cc..801211bafd90fae689bf95d5dab23073847ce583 100644 --- a/frontend/src/metabase/admin/people/containers/UserActivationModal.jsx +++ b/frontend/src/metabase/admin/people/containers/UserActivationModal.jsx @@ -1,6 +1,5 @@ /* eslint-disable react/prop-types */ import { Component } from "react"; -import { connect } from "react-redux"; import { t } from "ttag"; import _ from "underscore"; @@ -9,6 +8,7 @@ import Text from "metabase/components/type/Text"; import Button from "metabase/core/components/Button"; import CS from "metabase/css/core/index.css"; import Users from "metabase/entities/users"; +import { connect } from "metabase/lib/redux"; // NOTE: we have to load the list of users because /api/user/:id doesn't return deactivated users // but that's ok because it's probably already loaded through the people PeopleListingApp diff --git a/frontend/src/metabase/admin/people/containers/UserPasswordResetModal.jsx b/frontend/src/metabase/admin/people/containers/UserPasswordResetModal.jsx index a936f01067e91b97f0f23edc19b82499f328e9cd..b56223043c885382ff00ba7de59ba86d2519d7ff 100644 --- a/frontend/src/metabase/admin/people/containers/UserPasswordResetModal.jsx +++ b/frontend/src/metabase/admin/people/containers/UserPasswordResetModal.jsx @@ -1,7 +1,6 @@ /* eslint-disable react/prop-types */ import cx from "classnames"; import { Component } from "react"; -import { connect } from "react-redux"; import { goBack } from "react-router-redux"; import { t } from "ttag"; import _ from "underscore"; @@ -11,6 +10,7 @@ import PasswordReveal from "metabase/components/PasswordReveal"; import Button from "metabase/core/components/Button"; import CS from "metabase/css/core/index.css"; import Users from "metabase/entities/users"; +import { connect } from "metabase/lib/redux"; import MetabaseSettings from "metabase/lib/settings"; import { clearTemporaryPassword } from "../people"; diff --git a/frontend/src/metabase/admin/people/containers/UserSuccessModal.jsx b/frontend/src/metabase/admin/people/containers/UserSuccessModal.jsx index bad2bca70b11a18ab339a82d2b0492c17d9318c9..72989d520ebd6442f4c5b6b2a58f8c0cc4c7bff1 100644 --- a/frontend/src/metabase/admin/people/containers/UserSuccessModal.jsx +++ b/frontend/src/metabase/admin/people/containers/UserSuccessModal.jsx @@ -1,7 +1,6 @@ /* eslint-disable react/prop-types */ import cx from "classnames"; import { Component } from "react"; -import { connect } from "react-redux"; import { push } from "react-router-redux"; import { jt, t } from "ttag"; import _ from "underscore"; @@ -12,6 +11,7 @@ import Button from "metabase/core/components/Button"; import Link from "metabase/core/components/Link"; import CS from "metabase/css/core/index.css"; import Users from "metabase/entities/users"; +import { connect } from "metabase/lib/redux"; import { getSetting, isSsoEnabled } from "metabase/selectors/settings"; import { clearTemporaryPassword } from "../people"; diff --git a/frontend/src/metabase/admin/permissions/components/CollectionPermissionsModal/CollectionPermissionsModal.jsx b/frontend/src/metabase/admin/permissions/components/CollectionPermissionsModal/CollectionPermissionsModal.jsx index 36f6560cb3e4bf90de4a772b6084757292fdcb67..12f4382d640d077f3068d0a848bafacfb04d566d 100644 --- a/frontend/src/metabase/admin/permissions/components/CollectionPermissionsModal/CollectionPermissionsModal.jsx +++ b/frontend/src/metabase/admin/permissions/components/CollectionPermissionsModal/CollectionPermissionsModal.jsx @@ -1,6 +1,5 @@ import PropTypes from "prop-types"; import { useCallback, useEffect } from "react"; -import { connect } from "react-redux"; import { t } from "ttag"; import _ from "underscore"; @@ -11,6 +10,7 @@ import Link from "metabase/core/components/Link"; import CS from "metabase/css/core/index.css"; import Collections from "metabase/entities/collections"; import Groups from "metabase/entities/groups"; +import { connect } from "metabase/lib/redux"; import * as Urls from "metabase/lib/urls"; import { diff --git a/frontend/src/metabase/admin/permissions/components/ToolbarUpsell/ToolbarUpsell.tsx b/frontend/src/metabase/admin/permissions/components/ToolbarUpsell/ToolbarUpsell.tsx index a5cca4d3b1a1f61d0790271c8b5fb2bde360f4c3..bb72d74b673c776277b149e51e92b57a1e864dde 100644 --- a/frontend/src/metabase/admin/permissions/components/ToolbarUpsell/ToolbarUpsell.tsx +++ b/frontend/src/metabase/admin/permissions/components/ToolbarUpsell/ToolbarUpsell.tsx @@ -1,9 +1,9 @@ -import { connect } from "react-redux"; import { jt, t } from "ttag"; import { useDocsUrl } from "metabase/common/hooks"; import PopoverWithTrigger from "metabase/components/PopoverWithTrigger"; import ExternalLink from "metabase/core/components/ExternalLink"; +import { connect } from "metabase/lib/redux"; import { getUpgradeUrl } from "metabase/selectors/settings"; import type { State } from "metabase-types/store"; diff --git a/frontend/src/metabase/admin/permissions/pages/CollectionPermissionsPage/CollectionPermissionsPage.tsx b/frontend/src/metabase/admin/permissions/pages/CollectionPermissionsPage/CollectionPermissionsPage.tsx index 87fd5c269e2ad7a0282537a1892115436704916e..bb60541ca22d33daae4fc847fb77d75f837cdb3b 100644 --- a/frontend/src/metabase/admin/permissions/pages/CollectionPermissionsPage/CollectionPermissionsPage.tsx +++ b/frontend/src/metabase/admin/permissions/pages/CollectionPermissionsPage/CollectionPermissionsPage.tsx @@ -1,5 +1,4 @@ import { useCallback, useEffect } from "react"; -import { connect } from "react-redux"; import type { Route } from "react-router"; import { push } from "react-router-redux"; import { t } from "ttag"; @@ -8,6 +7,7 @@ import _ from "underscore"; import { CollectionPermissionsHelp } from "metabase/admin/permissions/components/CollectionPermissionsHelp"; import Collections from "metabase/entities/collections"; import Groups from "metabase/entities/groups"; +import { connect } from "metabase/lib/redux"; import type { Collection, CollectionId, GroupId } from "metabase-types/api"; import type { State } from "metabase-types/store"; diff --git a/frontend/src/metabase/admin/permissions/pages/DatabasePermissionsPage/DatabasesPermissionsPage.jsx b/frontend/src/metabase/admin/permissions/pages/DatabasePermissionsPage/DatabasesPermissionsPage.jsx index 35054b256e595c2f790295fd162fad823100588c..6c3b9d4778484db21dfb56adcd066213c2702cd2 100644 --- a/frontend/src/metabase/admin/permissions/pages/DatabasePermissionsPage/DatabasesPermissionsPage.jsx +++ b/frontend/src/metabase/admin/permissions/pages/DatabasePermissionsPage/DatabasesPermissionsPage.jsx @@ -1,14 +1,13 @@ import { bindActionCreators } from "@reduxjs/toolkit"; import PropTypes from "prop-types"; import { Fragment, useCallback } from "react"; -import { connect } from "react-redux"; import { push } from "react-router-redux"; import { useAsync } from "react-use"; import { t } from "ttag"; import _ from "underscore"; import { PermissionsEditorLegacyNoSelfServiceWarning } from "metabase/admin/permissions/components/PermissionsEditor/PermissionsEditorLegacyWarning"; -import { useDispatch, useSelector } from "metabase/lib/redux"; +import { connect, useDispatch, useSelector } from "metabase/lib/redux"; import { PLUGIN_ADVANCED_PERMISSIONS } from "metabase/plugins"; import { getSetting } from "metabase/selectors/settings"; import { PermissionsApi } from "metabase/services"; diff --git a/frontend/src/metabase/admin/permissions/pages/GroupDataPermissionsPage/GroupsPermissionsPage.jsx b/frontend/src/metabase/admin/permissions/pages/GroupDataPermissionsPage/GroupsPermissionsPage.jsx index 28a456118632229cd1de7eb0259cdfe1f258f08a..4737f8669cf958f52c1a8be48be8c279ddf2b735 100644 --- a/frontend/src/metabase/admin/permissions/pages/GroupDataPermissionsPage/GroupsPermissionsPage.jsx +++ b/frontend/src/metabase/admin/permissions/pages/GroupDataPermissionsPage/GroupsPermissionsPage.jsx @@ -1,14 +1,13 @@ import { bindActionCreators } from "@reduxjs/toolkit"; import PropTypes from "prop-types"; import { Fragment, useCallback } from "react"; -import { connect } from "react-redux"; import { push } from "react-router-redux"; import { useAsync } from "react-use"; import { t } from "ttag"; import _ from "underscore"; import { PermissionsEditorLegacyNoSelfServiceWarning } from "metabase/admin/permissions/components/PermissionsEditor/PermissionsEditorLegacyWarning"; -import { useDispatch, useSelector } from "metabase/lib/redux"; +import { connect, useDispatch, useSelector } from "metabase/lib/redux"; import { PLUGIN_ADVANCED_PERMISSIONS } from "metabase/plugins"; import { getSetting } from "metabase/selectors/settings"; import { PermissionsApi } from "metabase/services"; diff --git a/frontend/src/metabase/admin/settings/app/components/SettingsEditor/SettingsEditor.jsx b/frontend/src/metabase/admin/settings/app/components/SettingsEditor/SettingsEditor.jsx index bb7a94a42c9b3adc0af33d24ac6cab7b06124fee..3646a202d06a4ff97a27bcd6d04418298ce3193f 100644 --- a/frontend/src/metabase/admin/settings/app/components/SettingsEditor/SettingsEditor.jsx +++ b/frontend/src/metabase/admin/settings/app/components/SettingsEditor/SettingsEditor.jsx @@ -3,7 +3,6 @@ import { bindActionCreators } from "@reduxjs/toolkit"; import cx from "classnames"; import PropTypes from "prop-types"; import { Component, createRef } from "react"; -import { connect } from "react-redux"; import { Link } from "react-router"; import { t } from "ttag"; import _ from "underscore"; @@ -17,6 +16,7 @@ import SaveStatus from "metabase/components/SaveStatus"; import AdminS from "metabase/css/admin.module.css"; import CS from "metabase/css/core/index.css"; import title from "metabase/hoc/Title"; +import { connect } from "metabase/lib/redux"; import MetabaseSettings from "metabase/lib/settings"; import { Box } from "metabase/ui"; diff --git a/frontend/src/metabase/admin/settings/auth/containers/GoogleAuthCard/GoogleAuthCard.tsx b/frontend/src/metabase/admin/settings/auth/containers/GoogleAuthCard/GoogleAuthCard.tsx index a5833f4f93c9cbde6859ee5bd4e4e3e4473f92be..d9eb699e36b15200ba451c16a95ec00b749b44a5 100644 --- a/frontend/src/metabase/admin/settings/auth/containers/GoogleAuthCard/GoogleAuthCard.tsx +++ b/frontend/src/metabase/admin/settings/auth/containers/GoogleAuthCard/GoogleAuthCard.tsx @@ -1,7 +1,7 @@ -import { connect } from "react-redux"; import { t } from "ttag"; import { updateSettings } from "metabase/admin/settings/settings"; +import { connect } from "metabase/lib/redux"; import { getSetting } from "metabase/selectors/settings"; import type { Dispatch, State } from "metabase-types/store"; diff --git a/frontend/src/metabase/admin/settings/auth/containers/GoogleAuthForm/GoogleAuthForm.tsx b/frontend/src/metabase/admin/settings/auth/containers/GoogleAuthForm/GoogleAuthForm.tsx index 8299c408416288f8bb19dd85dcaf93fa1a93d0fe..d4260d263b09e89ccfdfc0458afbff29e5e44d4c 100644 --- a/frontend/src/metabase/admin/settings/auth/containers/GoogleAuthForm/GoogleAuthForm.tsx +++ b/frontend/src/metabase/admin/settings/auth/containers/GoogleAuthForm/GoogleAuthForm.tsx @@ -1,5 +1,4 @@ -import { connect } from "react-redux"; - +import { connect } from "metabase/lib/redux"; import { getSetting } from "metabase/selectors/settings"; import type { State } from "metabase-types/store"; diff --git a/frontend/src/metabase/admin/settings/auth/containers/LdapAuthCard/LdapAuthCard.tsx b/frontend/src/metabase/admin/settings/auth/containers/LdapAuthCard/LdapAuthCard.tsx index 4790d2fa00fa0867c6900640f9b96f1116a9c0c7..a51c970481e5b968cbe55d40ab381d03c55771b3 100644 --- a/frontend/src/metabase/admin/settings/auth/containers/LdapAuthCard/LdapAuthCard.tsx +++ b/frontend/src/metabase/admin/settings/auth/containers/LdapAuthCard/LdapAuthCard.tsx @@ -1,7 +1,7 @@ -import { connect } from "react-redux"; import { t } from "ttag"; import { updateSettings } from "metabase/admin/settings/settings"; +import { connect } from "metabase/lib/redux"; import { getSetting } from "metabase/selectors/settings"; import type { Dispatch, State } from "metabase-types/store"; diff --git a/frontend/src/metabase/admin/settings/components/SettingsLdapForm.tsx b/frontend/src/metabase/admin/settings/components/SettingsLdapForm.tsx index d731684709a934e61b2bd48fc8d9a96334bd7f51..bba80e845afc76e9c016d12144b5c5f2a0b01e2d 100644 --- a/frontend/src/metabase/admin/settings/components/SettingsLdapForm.tsx +++ b/frontend/src/metabase/admin/settings/components/SettingsLdapForm.tsx @@ -1,5 +1,4 @@ import { useCallback, useMemo } from "react"; -import { connect } from "react-redux"; import { t } from "ttag"; import _ from "underscore"; import type { TestConfig } from "yup"; @@ -20,6 +19,7 @@ import { FormSwitch, FormTextInput, } from "metabase/forms"; +import { connect } from "metabase/lib/redux"; import { PLUGIN_LDAP_FORM_FIELDS } from "metabase/plugins"; import { Group, Radio, Stack } from "metabase/ui"; import type { SettingKey, Settings } from "metabase-types/api"; diff --git a/frontend/src/metabase/admin/settings/components/SettingsLicense/SettingsLicense.tsx b/frontend/src/metabase/admin/settings/components/SettingsLicense/SettingsLicense.tsx index 6bdcd95eafecaf06109cfaccc4ac70c9833555ff..96122e29a0406e9da896b882a2de49fbfbeaaf28 100644 --- a/frontend/src/metabase/admin/settings/components/SettingsLicense/SettingsLicense.tsx +++ b/frontend/src/metabase/admin/settings/components/SettingsLicense/SettingsLicense.tsx @@ -1,8 +1,8 @@ -import { connect } from "react-redux"; import { t } from "ttag"; import Button from "metabase/core/components/Button"; import ExternalLink from "metabase/core/components/ExternalLink"; +import { connect } from "metabase/lib/redux"; import { getUpgradeUrl } from "metabase/selectors/settings"; import type { State } from "metabase-types/store"; diff --git a/frontend/src/metabase/admin/settings/components/UploadSettings/UploadSettingsForm.tsx b/frontend/src/metabase/admin/settings/components/UploadSettings/UploadSettingsForm.tsx index 35b19b0a1ecf40001cba15a8ee8eea0113be3510..0e6d546203036fd8f5322946a2b2963e732c6315 100644 --- a/frontend/src/metabase/admin/settings/components/UploadSettings/UploadSettingsForm.tsx +++ b/frontend/src/metabase/admin/settings/components/UploadSettings/UploadSettingsForm.tsx @@ -1,6 +1,5 @@ import type * as React from "react"; import { useRef, useState } from "react"; -import { connect } from "react-redux"; import { jt, t } from "ttag"; import _ from "underscore"; @@ -15,7 +14,7 @@ import Select from "metabase/core/components/Select"; import CS from "metabase/css/core/index.css"; import Databases from "metabase/entities/databases"; import Schemas from "metabase/entities/schemas"; -import { useDispatch } from "metabase/lib/redux"; +import { connect, useDispatch } from "metabase/lib/redux"; import { getSetting } from "metabase/selectors/settings"; import { Group, Stack, Text } from "metabase/ui"; import type Database from "metabase-lib/v1/metadata/Database"; diff --git a/frontend/src/metabase/admin/settings/components/widgets/RedirectWidget/RedirectWidget.tsx b/frontend/src/metabase/admin/settings/components/widgets/RedirectWidget/RedirectWidget.tsx index 807401778190ffca6cb1a73b4c4e14ea7f8575fc..d9a1acbb73102de48e98d5753d6c482dd761ee53 100644 --- a/frontend/src/metabase/admin/settings/components/widgets/RedirectWidget/RedirectWidget.tsx +++ b/frontend/src/metabase/admin/settings/components/widgets/RedirectWidget/RedirectWidget.tsx @@ -1,8 +1,9 @@ import { useEffect } from "react"; -import { connect } from "react-redux"; import type { LocationAction } from "react-router-redux"; import { replace } from "react-router-redux"; +import { connect } from "metabase/lib/redux"; + interface RedirectWidgetProps { to: string; replace: LocationAction; diff --git a/frontend/src/metabase/admin/settings/containers/GroupMappingsWidget.tsx b/frontend/src/metabase/admin/settings/containers/GroupMappingsWidget.tsx index c08f573d4598f737545609922b7dcfec03f0cb7d..e8600615ffc178a4bd06a1603b8f7cdf346d907e 100644 --- a/frontend/src/metabase/admin/settings/containers/GroupMappingsWidget.tsx +++ b/frontend/src/metabase/admin/settings/containers/GroupMappingsWidget.tsx @@ -1,9 +1,9 @@ -import { connect } from "react-redux"; import _ from "underscore"; import GroupMappingsWidget from "metabase/admin/settings/components/widgets/GroupMappingsWidget/GroupMappingsWidget"; import { updateSetting } from "metabase/admin/settings/settings"; import Group from "metabase/entities/groups"; +import { connect } from "metabase/lib/redux"; import { getSetting } from "metabase/selectors/settings"; import type { Settings } from "metabase-types/api/settings"; import type { State } from "metabase-types/store"; diff --git a/frontend/src/metabase/admin/settings/containers/RedirectToAllowedSettings.jsx b/frontend/src/metabase/admin/settings/containers/RedirectToAllowedSettings.jsx index a0085448c19d18ae88310719de01fd787ac4857a..b26edf5058fe791a4485dd7b5d8615517e8ad57f 100644 --- a/frontend/src/metabase/admin/settings/containers/RedirectToAllowedSettings.jsx +++ b/frontend/src/metabase/admin/settings/containers/RedirectToAllowedSettings.jsx @@ -1,8 +1,8 @@ /* eslint-disable react/prop-types */ -import { connect } from "react-redux"; import { push, replace } from "react-router-redux"; import { getAdminPaths } from "metabase/admin/app/selectors"; +import { connect } from "metabase/lib/redux"; const mapStateToProps = (state, props) => ({ adminItems: getAdminPaths(state), diff --git a/frontend/src/metabase/admin/settings/setup/components/SetupCheckList/SetupCheckList.jsx b/frontend/src/metabase/admin/settings/setup/components/SetupCheckList/SetupCheckList.jsx index e6d548ee0d868af4d1cb077011a3823bf432b53a..76140005453c89bfd18ea545c291ca07b454f2d1 100644 --- a/frontend/src/metabase/admin/settings/setup/components/SetupCheckList/SetupCheckList.jsx +++ b/frontend/src/metabase/admin/settings/setup/components/SetupCheckList/SetupCheckList.jsx @@ -1,7 +1,6 @@ /* eslint-disable react/prop-types */ import cx from "classnames"; import { Component } from "react"; -import { connect } from "react-redux"; import { t } from "ttag"; import { UpsellHosting } from "metabase/admin/upsells"; @@ -9,6 +8,7 @@ import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper"; import CS from "metabase/css/core/index.css"; import { color } from "metabase/lib/colors"; import { isSameOrSiteUrlOrigin } from "metabase/lib/dom"; +import { connect } from "metabase/lib/redux"; import { getIsPaidPlan } from "metabase/selectors/settings"; import { SetupApi } from "metabase/services"; import { Box, Flex, Icon } from "metabase/ui"; diff --git a/frontend/src/metabase/admin/settings/slack/containers/SlackSettings/SlackSettings.tsx b/frontend/src/metabase/admin/settings/slack/containers/SlackSettings/SlackSettings.tsx index c5ab240c36467ec2e4c120d548d3dd27851ab0fb..2416706ae5886c15b914a7cd349132e6b545e4a4 100644 --- a/frontend/src/metabase/admin/settings/slack/containers/SlackSettings/SlackSettings.tsx +++ b/frontend/src/metabase/admin/settings/slack/containers/SlackSettings/SlackSettings.tsx @@ -1,5 +1,4 @@ -import { connect } from "react-redux"; - +import { connect } from "metabase/lib/redux"; import type { State } from "metabase-types/store"; import { loadManifest } from "../../actions"; diff --git a/frontend/src/metabase/admin/settings/slack/containers/SlackSetup/SlackSetup.tsx b/frontend/src/metabase/admin/settings/slack/containers/SlackSetup/SlackSetup.tsx index 4b3d1219e916be60ebac1bb386fe58d1c0bcf31d..fa51547e57f27e22e2f1d94d5b79ffc3ba0927f2 100644 --- a/frontend/src/metabase/admin/settings/slack/containers/SlackSetup/SlackSetup.tsx +++ b/frontend/src/metabase/admin/settings/slack/containers/SlackSetup/SlackSetup.tsx @@ -1,6 +1,6 @@ import type { ComponentType } from "react"; -import { connect } from "react-redux"; +import { connect } from "metabase/lib/redux"; import type { State } from "metabase-types/store"; import SlackSetup from "../../components/SlackSetup"; diff --git a/frontend/src/metabase/admin/settings/slack/containers/SlackSetupForm/SlackSetupForm.tsx b/frontend/src/metabase/admin/settings/slack/containers/SlackSetupForm/SlackSetupForm.tsx index 05502880e1bf9b515b3f00e704402b84cc5deb86..74c083a9643cc2d5fe128551960a360dbe5dbf7f 100644 --- a/frontend/src/metabase/admin/settings/slack/containers/SlackSetupForm/SlackSetupForm.tsx +++ b/frontend/src/metabase/admin/settings/slack/containers/SlackSetupForm/SlackSetupForm.tsx @@ -1,4 +1,4 @@ -import { connect } from "react-redux"; +import { connect } from "metabase/lib/redux"; import { updateSettings } from "../../actions"; import SlackSetupForm from "../../components/SlackSetupForm"; diff --git a/frontend/src/metabase/admin/settings/slack/containers/SlackStatus/SlackStatus.tsx b/frontend/src/metabase/admin/settings/slack/containers/SlackStatus/SlackStatus.tsx index 7f68d5c0c8a67d9066fc6db81588e72f9cd872e8..5b82e8dbf40aef58705b09cf9128384bbb9f223a 100644 --- a/frontend/src/metabase/admin/settings/slack/containers/SlackStatus/SlackStatus.tsx +++ b/frontend/src/metabase/admin/settings/slack/containers/SlackStatus/SlackStatus.tsx @@ -1,5 +1,4 @@ -import { connect } from "react-redux"; - +import { connect } from "metabase/lib/redux"; import type { State } from "metabase-types/store"; import { updateSettings } from "../../actions"; diff --git a/frontend/src/metabase/admin/settings/slack/containers/SlackStatusForm/SlackStatusForm.tsx b/frontend/src/metabase/admin/settings/slack/containers/SlackStatusForm/SlackStatusForm.tsx index 5727cc60f87e4d160bc5fa2f9059a127ff5b5536..76d8a3b167a9c619dcc5ea79b206a5b3bce7156e 100644 --- a/frontend/src/metabase/admin/settings/slack/containers/SlackStatusForm/SlackStatusForm.tsx +++ b/frontend/src/metabase/admin/settings/slack/containers/SlackStatusForm/SlackStatusForm.tsx @@ -1,5 +1,4 @@ -import { connect } from "react-redux"; - +import { connect } from "metabase/lib/redux"; import type { State } from "metabase-types/store"; import SlackStatusForm from "../../components/SlackStatusForm"; diff --git a/frontend/src/metabase/admin/tasks/containers/ModelCacheRefreshJobs/ModelCacheRefreshJobModal.tsx b/frontend/src/metabase/admin/tasks/containers/ModelCacheRefreshJobs/ModelCacheRefreshJobModal.tsx index a4298bc5bcb556b3681a67bb5e49850b3f5d07cc..14106e60fe823892918cee6a132307602f3dd913 100644 --- a/frontend/src/metabase/admin/tasks/containers/ModelCacheRefreshJobs/ModelCacheRefreshJobModal.tsx +++ b/frontend/src/metabase/admin/tasks/containers/ModelCacheRefreshJobs/ModelCacheRefreshJobModal.tsx @@ -1,5 +1,4 @@ import { useEffect, useMemo } from "react"; -import { connect } from "react-redux"; import { usePrevious } from "react-use"; import { t } from "ttag"; import _ from "underscore"; @@ -9,6 +8,7 @@ import Button from "metabase/core/components/Button"; import Link from "metabase/core/components/Link"; import ButtonsS from "metabase/css/components/buttons.module.css"; import PersistedModels from "metabase/entities/persisted-models"; +import { connect } from "metabase/lib/redux"; import type { ModelCacheRefreshStatus } from "metabase-types/api"; import { ErrorBox } from "./ModelCacheRefreshJobs.styled"; diff --git a/frontend/src/metabase/admin/tasks/containers/ModelCacheRefreshJobs/ModelCacheRefreshJobs.tsx b/frontend/src/metabase/admin/tasks/containers/ModelCacheRefreshJobs/ModelCacheRefreshJobs.tsx index 6422b507faf959c7bc1cc3684604de47646c801d..8c70e90730a9ebf4b13dc31a09aaff079866a2ba 100644 --- a/frontend/src/metabase/admin/tasks/containers/ModelCacheRefreshJobs/ModelCacheRefreshJobs.tsx +++ b/frontend/src/metabase/admin/tasks/containers/ModelCacheRefreshJobs/ModelCacheRefreshJobs.tsx @@ -1,7 +1,6 @@ import cx from "classnames"; import moment from "moment-timezone"; // eslint-disable-line no-restricted-imports -- deprecated usage import { useCallback } from "react"; -import { connect } from "react-redux"; import { t } from "ttag"; import NoResults from "assets/img/no_results.svg"; @@ -15,6 +14,7 @@ import CS from "metabase/css/core/index.css"; import PersistedModels from "metabase/entities/persisted-models"; import { usePagination } from "metabase/hooks/use-pagination"; import { capitalize } from "metabase/lib/formatting"; +import { connect } from "metabase/lib/redux"; import * as Urls from "metabase/lib/urls"; import { Icon } from "metabase/ui"; import { checkCanRefreshModelCache } from "metabase-lib/v1/metadata/utils/models"; diff --git a/frontend/src/metabase/admin/tools/containers/Tools.tsx b/frontend/src/metabase/admin/tools/containers/Tools.tsx index 7dfad435f0ba977facc948f0e8d23b4201667e89..7e9dd78bd6793105ea58748e1786fa465a0f04f1 100644 --- a/frontend/src/metabase/admin/tools/containers/Tools.tsx +++ b/frontend/src/metabase/admin/tools/containers/Tools.tsx @@ -1,10 +1,10 @@ import type { Location } from "history"; import type * as React from "react"; -import { connect } from "react-redux"; import { push } from "react-router-redux"; import { t } from "ttag"; import Radio from "metabase/core/components/Radio"; +import { connect } from "metabase/lib/redux"; import { PLUGIN_ADMIN_TOOLS } from "metabase/plugins"; import { getSetting } from "metabase/selectors/settings"; import type { State } from "metabase-types/store"; diff --git a/frontend/src/metabase/admin/utils.js b/frontend/src/metabase/admin/utils.js index ef045a374080cbc9520c4bd821322be89ef4a32e..757febff1802f491fd4958f168ebc4878f5c0129 100644 --- a/frontend/src/metabase/admin/utils.js +++ b/frontend/src/metabase/admin/utils.js @@ -1,8 +1,8 @@ -import { connect } from "react-redux"; import { replace, routerActions } from "react-router-redux"; import { connectedReduxRedirect } from "redux-auth-wrapper/history3/redirect"; import { getAdminPaths } from "metabase/admin/app/selectors"; +import { connect } from "metabase/lib/redux"; import { getUser } from "metabase/selectors/user"; export const createAdminRouteGuard = (routeKey, Component) => { diff --git a/frontend/src/metabase/api/api.ts b/frontend/src/metabase/api/api.ts index a888f8004e358216c7e146e258d2253070ba735f..61d02831c09a0d211206e4569855166322dca357 100644 --- a/frontend/src/metabase/api/api.ts +++ b/frontend/src/metabase/api/api.ts @@ -1,12 +1,36 @@ -import { createApi, skipToken } from "@reduxjs/toolkit/query/react"; -export { skipToken }; +import { + buildCreateApi, + coreModule, + reactHooksModule, + skipToken, +} from "@reduxjs/toolkit/query/react"; +import { + createDispatchHook, + createSelectorHook, + createStoreHook, +} from "react-redux"; + +import { MetabaseReduxContext } from "metabase/lib/redux"; import { apiQuery } from "./query"; import { TAG_TYPES } from "./tags"; +const createApi = buildCreateApi( + coreModule(), + reactHooksModule({ + hooks: { + useDispatch: createDispatchHook(MetabaseReduxContext), + useSelector: createSelectorHook(MetabaseReduxContext), + useStore: createStoreHook(MetabaseReduxContext), + }, + }), +); + export const Api = createApi({ reducerPath: "metabase-api", tagTypes: TAG_TYPES, baseQuery: apiQuery, endpoints: () => ({}), }); + +export { skipToken }; diff --git a/frontend/src/metabase/app.js b/frontend/src/metabase/app.js index 568b378424556a0a16ceb87d1b9b2e89c075505c..f4d240af26b1253e86c4650de21dca604343743d 100644 --- a/frontend/src/metabase/app.js +++ b/frontend/src/metabase/app.js @@ -31,7 +31,6 @@ import { createHistory } from "history"; import { DragDropContextProvider } from "react-dnd"; import HTML5Backend from "react-dnd-html5-backend"; import { createRoot } from "react-dom/client"; -import { Provider } from "react-redux"; import { Router, useRouterHistory } from "react-router"; import { syncHistoryWithStore } from "react-router-redux"; @@ -39,6 +38,7 @@ import { createTracker } from "metabase/lib/analytics"; import api from "metabase/lib/api"; import { initializeEmbedding } from "metabase/lib/embed"; import { captureConsoleErrors } from "metabase/lib/errors"; +import { MetabaseReduxProvider } from "metabase/lib/redux/custom-context"; import MetabaseSettings from "metabase/lib/settings"; import { PLUGIN_APP_INIT_FUNCTIONS } from "metabase/plugins"; import { refreshSiteSettings } from "metabase/redux/settings"; @@ -71,7 +71,7 @@ function _init(reducers, getRoutes, callback) { const root = createRoot(document.getElementById("root")); root.render( - <Provider store={store}> + <MetabaseReduxProvider store={store}> <EmotionCacheProvider> <DragDropContextProvider backend={HTML5Backend} context={{ window }}> <ThemeProvider> @@ -80,7 +80,7 @@ function _init(reducers, getRoutes, callback) { </ThemeProvider> </DragDropContextProvider> </EmotionCacheProvider> - </Provider>, + </MetabaseReduxProvider>, ); registerVisualizations(); diff --git a/frontend/src/metabase/browse/containers/TableBrowser/TableBrowser.jsx b/frontend/src/metabase/browse/containers/TableBrowser/TableBrowser.jsx index 37ea6879b89cb6a413819e9be23b698c78556c31..fc1d24ae57fd375098c3691d12d93c4729bf2328 100644 --- a/frontend/src/metabase/browse/containers/TableBrowser/TableBrowser.jsx +++ b/frontend/src/metabase/browse/containers/TableBrowser/TableBrowser.jsx @@ -1,7 +1,7 @@ -import { connect } from "react-redux"; import _ from "underscore"; import Tables from "metabase/entities/tables"; +import { connect } from "metabase/lib/redux"; import { isSyncInProgress } from "metabase/lib/syncing"; import * as Urls from "metabase/lib/urls"; import { getMetadata } from "metabase/selectors/metadata"; diff --git a/frontend/src/metabase/collections/components/ActionMenu/ActionMenu.tsx b/frontend/src/metabase/collections/components/ActionMenu/ActionMenu.tsx index 67a206669437c2f1d7798e45d01e9adfdc18c813..4206bfd957fe890befed07e3decc7e83dc8dedb6 100644 --- a/frontend/src/metabase/collections/components/ActionMenu/ActionMenu.tsx +++ b/frontend/src/metabase/collections/components/ActionMenu/ActionMenu.tsx @@ -1,5 +1,4 @@ import { useCallback, useMemo, useState } from "react"; -import { connect } from "react-redux"; import { push } from "react-router-redux"; import { t } from "ttag"; @@ -21,7 +20,7 @@ import { } from "metabase/collections/utils"; import { ConfirmDeleteModal } from "metabase/components/ConfirmDeleteModal"; import { bookmarks as BookmarkEntity } from "metabase/entities"; -import { useDispatch } from "metabase/lib/redux"; +import { connect, useDispatch } from "metabase/lib/redux"; import { entityForObject } from "metabase/lib/schema"; import * as Urls from "metabase/lib/urls"; import { addUndo } from "metabase/redux/undo"; diff --git a/frontend/src/metabase/collections/components/CollectionCopyEntityModal.tsx b/frontend/src/metabase/collections/components/CollectionCopyEntityModal.tsx index ed999397e6e56af7ff157dfa86930de6acec84e6..6190592711842db426e04ff669e83d118276351f 100644 --- a/frontend/src/metabase/collections/components/CollectionCopyEntityModal.tsx +++ b/frontend/src/metabase/collections/components/CollectionCopyEntityModal.tsx @@ -1,11 +1,11 @@ import { dissoc } from "icepick"; import { useState } from "react"; -import { connect } from "react-redux"; import { t } from "ttag"; import Collections from "metabase/entities/collections"; import EntityCopyModal from "metabase/entities/containers/EntityCopyModal"; import withToast from "metabase/hoc/Toast"; +import { connect } from "metabase/lib/redux"; import { entityTypeForObject } from "metabase/lib/schema"; function mapStateToProps(state: any, props: any) { diff --git a/frontend/src/metabase/collections/components/CreateCollectionForm/CreateCollectionForm.tsx b/frontend/src/metabase/collections/components/CreateCollectionForm/CreateCollectionForm.tsx index 35dd389d02e33c319fdfa0d029bab4505c8f7289..3b1046f474f5a33171917d5dc94cb9ad95255ff9 100644 --- a/frontend/src/metabase/collections/components/CreateCollectionForm/CreateCollectionForm.tsx +++ b/frontend/src/metabase/collections/components/CreateCollectionForm/CreateCollectionForm.tsx @@ -1,5 +1,4 @@ import { useCallback, useMemo } from "react"; -import { connect } from "react-redux"; import { withRouter } from "react-router"; import { t } from "ttag"; import _ from "underscore"; @@ -19,6 +18,7 @@ import Collections, { import { Form, FormProvider } from "metabase/forms"; import { color } from "metabase/lib/colors"; import * as Errors from "metabase/lib/errors"; +import { connect } from "metabase/lib/redux"; import type { Collection } from "metabase-types/api"; import type { State } from "metabase-types/store"; diff --git a/frontend/src/metabase/collections/containers/CollectionHeader/CollectionHeader.tsx b/frontend/src/metabase/collections/containers/CollectionHeader/CollectionHeader.tsx index 4125269830f43f6a7388ea7847f792d1dcc3f5a6..d0a1ee19a443527f3ea3faff185388dec0f9a94c 100644 --- a/frontend/src/metabase/collections/containers/CollectionHeader/CollectionHeader.tsx +++ b/frontend/src/metabase/collections/containers/CollectionHeader/CollectionHeader.tsx @@ -1,6 +1,5 @@ -import { connect } from "react-redux"; - import Collections from "metabase/entities/collections"; +import { connect } from "metabase/lib/redux"; import { uploadFile } from "metabase/redux/uploads"; import type { Collection } from "metabase-types/api"; diff --git a/frontend/src/metabase/collections/containers/CreateCollectionModal.tsx b/frontend/src/metabase/collections/containers/CreateCollectionModal.tsx index bbffd11f3f2f626acef5513b2e791ea4caa6efd8..ca421d270c9b3b66441b4d7daf865f03c46d4952 100644 --- a/frontend/src/metabase/collections/containers/CreateCollectionModal.tsx +++ b/frontend/src/metabase/collections/containers/CreateCollectionModal.tsx @@ -1,9 +1,9 @@ import type { LocationDescriptor } from "history"; import { useCallback } from "react"; -import { connect } from "react-redux"; import { push } from "react-router-redux"; import { t } from "ttag"; +import { connect } from "metabase/lib/redux"; import * as Urls from "metabase/lib/urls"; import { Modal } from "metabase/ui"; import type { Collection } from "metabase-types/api"; diff --git a/frontend/src/metabase/components/AdminAwareEmptyState/AdminAwareEmptyState.jsx b/frontend/src/metabase/components/AdminAwareEmptyState/AdminAwareEmptyState.jsx index 131913f82843aefc2cf290e824b8f74bfba662f8..f11655f111a42f63d9df2ff5a63e303bfb91c4a0 100644 --- a/frontend/src/metabase/components/AdminAwareEmptyState/AdminAwareEmptyState.jsx +++ b/frontend/src/metabase/components/AdminAwareEmptyState/AdminAwareEmptyState.jsx @@ -1,8 +1,8 @@ /* eslint-disable react/prop-types */ import { Component } from "react"; -import { connect } from "react-redux"; import EmptyState from "metabase/components/EmptyState"; +import { connect } from "metabase/lib/redux"; import { getUser } from "metabase/selectors/user"; /* diff --git a/frontend/src/metabase/components/ArchiveCollectionModal/ArchiveCollectionModal.jsx b/frontend/src/metabase/components/ArchiveCollectionModal/ArchiveCollectionModal.jsx index f8a6738e10d1ba1259f5146f9f2bd5527503cce8..39fcfa36589d4e564dba919b1b3ce80169943ca4 100644 --- a/frontend/src/metabase/components/ArchiveCollectionModal/ArchiveCollectionModal.jsx +++ b/frontend/src/metabase/components/ArchiveCollectionModal/ArchiveCollectionModal.jsx @@ -1,6 +1,5 @@ /* eslint-disable react/prop-types */ import { Component } from "react"; -import { connect } from "react-redux"; import { withRouter } from "react-router"; import { push } from "react-router-redux"; import { t } from "ttag"; @@ -8,6 +7,7 @@ import _ from "underscore"; import { ArchiveModal } from "metabase/components/ArchiveModal"; import Collection from "metabase/entities/collections"; +import { connect } from "metabase/lib/redux"; import * as Urls from "metabase/lib/urls"; const mapDispatchToProps = { diff --git a/frontend/src/metabase/components/CollectionList/CollectionList.jsx b/frontend/src/metabase/components/CollectionList/CollectionList.jsx index 56be31c2d9fedd813d9eb44ff43a61495903d3e5..f1a1be51eb7f48d34a115d0d7a12624c8e8295a1 100644 --- a/frontend/src/metabase/components/CollectionList/CollectionList.jsx +++ b/frontend/src/metabase/components/CollectionList/CollectionList.jsx @@ -1,9 +1,9 @@ import PropTypes from "prop-types"; -import { connect } from "react-redux"; import CollectionItem from "metabase/components/CollectionItem"; import { CollectionGridItem } from "metabase/components/CollectionList/CollectionList.styled"; import { Grid } from "metabase/components/Grid"; +import { connect } from "metabase/lib/redux"; import { getUser } from "metabase/selectors/user"; const propTypes = { diff --git a/frontend/src/metabase/components/FieldValuesWidget/FieldValuesWidget.tsx b/frontend/src/metabase/components/FieldValuesWidget/FieldValuesWidget.tsx index cc6531989950b84c26ec23e5d7788987ace7f18a..5b616afc84b0950e87209259375a021a3acae403 100644 --- a/frontend/src/metabase/components/FieldValuesWidget/FieldValuesWidget.tsx +++ b/frontend/src/metabase/components/FieldValuesWidget/FieldValuesWidget.tsx @@ -9,7 +9,6 @@ import { useRef, useState, } from "react"; -import { connect } from "react-redux"; import { useMount, usePrevious, useThrottle, useUnmount } from "react-use"; import { jt, t } from "ttag"; import _ from "underscore"; @@ -26,7 +25,7 @@ import Fields from "metabase/entities/fields"; import { formatValue } from "metabase/lib/formatting"; import { parseNumberValue } from "metabase/lib/number"; import { defer } from "metabase/lib/promise"; -import { useDispatch } from "metabase/lib/redux"; +import { connect, useDispatch } from "metabase/lib/redux"; import { isNotNull } from "metabase/lib/types"; import { fetchCardParameterValues, diff --git a/frontend/src/metabase/components/LastEditInfoLabel/LastEditInfoLabel.tsx b/frontend/src/metabase/components/LastEditInfoLabel/LastEditInfoLabel.tsx index c141b62e206000f3640f142608014e3a0241f3d5..4346cfa2a0148d9ffd047eaf024cc967a111d842 100644 --- a/frontend/src/metabase/components/LastEditInfoLabel/LastEditInfoLabel.tsx +++ b/frontend/src/metabase/components/LastEditInfoLabel/LastEditInfoLabel.tsx @@ -1,10 +1,10 @@ import dayjs from "dayjs"; import type { MouseEventHandler } from "react"; -import { connect } from "react-redux"; import { t } from "ttag"; import { TextButton } from "metabase/components/Button.styled"; import DateTime from "metabase/components/DateTime"; +import { connect } from "metabase/lib/redux"; import type { NamedUser } from "metabase/lib/user"; import { getFullName } from "metabase/lib/user"; import { getUser } from "metabase/selectors/user"; diff --git a/frontend/src/metabase/components/MetadataInfo/ColumnFingerprintInfo/CategoryFingerprint.jsx b/frontend/src/metabase/components/MetadataInfo/ColumnFingerprintInfo/CategoryFingerprint.jsx index b4a832df686628c1decd9c17e29410bf16b4658b..ad4e2ead261d762bca539c70ba131710ac204ed0 100644 --- a/frontend/src/metabase/components/MetadataInfo/ColumnFingerprintInfo/CategoryFingerprint.jsx +++ b/frontend/src/metabase/components/MetadataInfo/ColumnFingerprintInfo/CategoryFingerprint.jsx @@ -1,9 +1,9 @@ import PropTypes from "prop-types"; -import { connect } from "react-redux"; import { msgid, ngettext, t } from "ttag"; import { useGetFieldValuesQuery } from "metabase/api"; import { formatNumber } from "metabase/lib/formatting"; +import { connect } from "metabase/lib/redux"; import { getMetadata } from "metabase/selectors/metadata"; import { diff --git a/frontend/src/metabase/components/MetadataInfo/TableInfo/TableInfo.tsx b/frontend/src/metabase/components/MetadataInfo/TableInfo/TableInfo.tsx index a9c6125813f874fe6c8dee66d80845f613b27f4f..e00b28984dc6d99c6da1d7346070b45a2dae3813 100644 --- a/frontend/src/metabase/components/MetadataInfo/TableInfo/TableInfo.tsx +++ b/frontend/src/metabase/components/MetadataInfo/TableInfo/TableInfo.tsx @@ -1,10 +1,10 @@ import { useEffect, useState } from "react"; -import { connect } from "react-redux"; import { t } from "ttag"; import _ from "underscore"; import Tables from "metabase/entities/tables"; import { useSafeAsyncFunction } from "metabase/hooks/use-safe-async-function"; +import { connect } from "metabase/lib/redux"; import type Table from "metabase-lib/v1/metadata/Table"; import { diff --git a/frontend/src/metabase/components/SaveStatus/SaveStatus.jsx b/frontend/src/metabase/components/SaveStatus/SaveStatus.jsx index b735569e59b2194a3db2b1d909b5ddd640c653b7..1a10dfae20ba776ffd702130e6c2ec12bfc1faaa 100644 --- a/frontend/src/metabase/components/SaveStatus/SaveStatus.jsx +++ b/frontend/src/metabase/components/SaveStatus/SaveStatus.jsx @@ -1,9 +1,9 @@ /* eslint-disable react/prop-types */ import { Component } from "react"; -import { connect } from "react-redux"; import { t } from "ttag"; import _ from "underscore"; +import { connect } from "metabase/lib/redux"; import { addUndo, dismissUndo } from "metabase/redux/undo"; class SaveStatus extends Component { diff --git a/frontend/src/metabase/containers/AdHocQuestionLoader.jsx b/frontend/src/metabase/containers/AdHocQuestionLoader.jsx index ba7d0fbb0638d9603eee936101576ff7f556b10c..faec8d37855f3a7819724f41bd469da00aa2fb1f 100644 --- a/frontend/src/metabase/containers/AdHocQuestionLoader.jsx +++ b/frontend/src/metabase/containers/AdHocQuestionLoader.jsx @@ -1,8 +1,8 @@ /* eslint-disable react/prop-types */ import { Component } from "react"; -import { connect } from "react-redux"; import { deserializeCardFromUrl } from "metabase/lib/card"; +import { connect } from "metabase/lib/redux"; import { loadMetadataForCard } from "metabase/questions/actions"; import { getMetadata } from "metabase/selectors/metadata"; import Question from "metabase-lib/v1/Question"; diff --git a/frontend/src/metabase/containers/NewItemMenu/NewItemMenu.tsx b/frontend/src/metabase/containers/NewItemMenu/NewItemMenu.tsx index 97b47689e575621623e77e2d2ae65e8b674673fe..3aa44ce2d8edc28b85318d2702a2f12988dbbb34 100644 --- a/frontend/src/metabase/containers/NewItemMenu/NewItemMenu.tsx +++ b/frontend/src/metabase/containers/NewItemMenu/NewItemMenu.tsx @@ -1,10 +1,10 @@ -import { connect } from "react-redux"; import { push } from "react-router-redux"; import _ from "underscore"; import NewItemMenu from "metabase/components/NewItemMenu"; import Databases from "metabase/entities/databases"; import Search from "metabase/entities/search"; +import { connect } from "metabase/lib/redux"; import { closeNavbar } from "metabase/redux/app"; import { getHasDataAccess, diff --git a/frontend/src/metabase/containers/NotFoundFallbackPage.tsx b/frontend/src/metabase/containers/NotFoundFallbackPage.tsx index 41e0a485ef01abc53a5f3bcc2effa68dc55b68be..a23e7562238978140d397fc7d0b9b1aa14bf0362 100644 --- a/frontend/src/metabase/containers/NotFoundFallbackPage.tsx +++ b/frontend/src/metabase/containers/NotFoundFallbackPage.tsx @@ -1,8 +1,8 @@ import type { LocationDescriptor } from "history"; -import { connect } from "react-redux"; import { replace } from "react-router-redux"; import { useMount } from "react-use"; +import { connect } from "metabase/lib/redux"; import { refreshCurrentUser } from "metabase/redux/user"; import { NotFound } from "../components/ErrorPages"; diff --git a/frontend/src/metabase/containers/SchedulePicker.tsx b/frontend/src/metabase/containers/SchedulePicker.tsx index 918d5c38532f8bc41b5aa5af097025d43864d124..320a8b878c038b3671b7cb7ba770be7dd6cc6b0d 100644 --- a/frontend/src/metabase/containers/SchedulePicker.tsx +++ b/frontend/src/metabase/containers/SchedulePicker.tsx @@ -1,7 +1,6 @@ -import { connect } from "react-redux"; - import type { SchedulePickerProps } from "metabase/components/SchedulePicker"; import SchedulePicker from "metabase/components/SchedulePicker"; +import { connect } from "metabase/lib/redux"; import { getSetting } from "metabase/selectors/settings"; import type { State } from "metabase-types/store"; diff --git a/frontend/src/metabase/dashboard/components/ActionSidebar/ActionSidebar.tsx b/frontend/src/metabase/dashboard/components/ActionSidebar/ActionSidebar.tsx index 170603bcf8351a766d07bb4f0282d97daf6d5ada..a58bdf18f41c9eb07266bebd600ee3d8e309c60e 100644 --- a/frontend/src/metabase/dashboard/components/ActionSidebar/ActionSidebar.tsx +++ b/frontend/src/metabase/dashboard/components/ActionSidebar/ActionSidebar.tsx @@ -1,5 +1,4 @@ import { useMemo, useRef } from "react"; -import { connect } from "react-redux"; import { t } from "ttag"; import ActionViz from "metabase/actions/components/ActionViz"; @@ -17,6 +16,7 @@ import FormSelect from "metabase/core/components/FormSelect"; import { closeSidebar } from "metabase/dashboard/actions"; import { Sidebar } from "metabase/dashboard/components/Sidebar"; import { Form, FormProvider } from "metabase/forms"; +import { connect } from "metabase/lib/redux"; import type { ActionDashboardCard, Dashboard, diff --git a/frontend/src/metabase/dashboard/components/ClickMappings.jsx b/frontend/src/metabase/dashboard/components/ClickMappings.jsx index 0d720a31d9eabe08e8c0c4215e9ab1b7b68557d2..a937284c25e2c2bb88cf84459abd3cb9d50a78c0 100644 --- a/frontend/src/metabase/dashboard/components/ClickMappings.jsx +++ b/frontend/src/metabase/dashboard/components/ClickMappings.jsx @@ -2,7 +2,6 @@ import cx from "classnames"; import { assocIn, dissocIn, getIn } from "icepick"; import { Component } from "react"; -import { connect } from "react-redux"; import { t } from "ttag"; import _ from "underscore"; @@ -10,6 +9,7 @@ import Select from "metabase/core/components/Select"; import CS from "metabase/css/core/index.css"; import { getParameters } from "metabase/dashboard/selectors"; import { isPivotGroupColumn } from "metabase/lib/data_grid"; +import { connect } from "metabase/lib/redux"; import MetabaseSettings from "metabase/lib/settings"; import { loadMetadataForCard } from "metabase/questions/actions"; import { getMetadata } from "metabase/selectors/metadata"; diff --git a/frontend/src/metabase/dashboard/components/DashCard/DashCardActionsPanel/ActionSettingsButton/ActionSettingsButton.tsx b/frontend/src/metabase/dashboard/components/DashCard/DashCardActionsPanel/ActionSettingsButton/ActionSettingsButton.tsx index c7039f2d38046304fdad79bfbeb3cf2f2a91cf61..554da217e394eaa85b8e6ce5e80e8278a2342b51 100644 --- a/frontend/src/metabase/dashboard/components/DashCard/DashCardActionsPanel/ActionSettingsButton/ActionSettingsButton.tsx +++ b/frontend/src/metabase/dashboard/components/DashCard/DashCardActionsPanel/ActionSettingsButton/ActionSettingsButton.tsx @@ -1,8 +1,8 @@ import { useEffect } from "react"; -import { connect } from "react-redux"; import { t } from "ttag"; import { setEditingDashcardId } from "metabase/dashboard/actions"; +import { connect } from "metabase/lib/redux"; import type { ActionDashboardCard, Dashboard } from "metabase-types/api"; import { DashCardActionButton } from "../DashCardActionButton/DashCardActionButton"; diff --git a/frontend/src/metabase/dashboard/components/DashCard/DashCardParameterMapper/DashCardCardParameterMapper.tsx b/frontend/src/metabase/dashboard/components/DashCard/DashCardParameterMapper/DashCardCardParameterMapper.tsx index 2d889e37ae0b4f597f1326d813f6b5b084072bd6..8dc7b490e1f214ed84040773371090fb20bec381 100644 --- a/frontend/src/metabase/dashboard/components/DashCard/DashCardParameterMapper/DashCardCardParameterMapper.tsx +++ b/frontend/src/metabase/dashboard/components/DashCard/DashCardParameterMapper/DashCardCardParameterMapper.tsx @@ -1,4 +1,3 @@ -import { connect } from "react-redux"; import { t } from "ttag"; import _ from "underscore"; @@ -10,6 +9,7 @@ import { getQuestionByCard, } from "metabase/dashboard/selectors"; import { isNativeDashCard, isQuestionDashCard } from "metabase/dashboard/utils"; +import { connect } from "metabase/lib/redux"; import type { ParameterMappingOption } from "metabase/parameters/utils/mapping-options"; import { getIsRecentlyAutoConnectedDashcard } from "metabase/redux/undo"; import { Flex, Icon, Text, Transition } from "metabase/ui"; diff --git a/frontend/src/metabase/dashboard/components/DashboardCopyModal.jsx b/frontend/src/metabase/dashboard/components/DashboardCopyModal.jsx index 0a2db19ce6444cf4fe80ca1b3230bd0aefc80187..0ff005aa5817ec846d5c85fece837f9e80349042 100644 --- a/frontend/src/metabase/dashboard/components/DashboardCopyModal.jsx +++ b/frontend/src/metabase/dashboard/components/DashboardCopyModal.jsx @@ -1,7 +1,6 @@ /* eslint-disable react/prop-types */ import { dissoc } from "icepick"; import { useState } from "react"; -import { connect } from "react-redux"; import { withRouter } from "react-router"; import { replace } from "react-router-redux"; import { t } from "ttag"; @@ -10,6 +9,7 @@ import _ from "underscore"; import Collections from "metabase/entities/collections"; import EntityCopyModal from "metabase/entities/containers/EntityCopyModal"; import Dashboards from "metabase/entities/dashboards"; +import { connect } from "metabase/lib/redux"; import * as Urls from "metabase/lib/urls"; import { getDashboardComplete } from "../selectors"; diff --git a/frontend/src/metabase/dashboard/components/DashboardGrid.tsx b/frontend/src/metabase/dashboard/components/DashboardGrid.tsx index ef76b7ab99407b72ec45077da9ac520e8fd048c1..afabf1294706b7527f5753768d8be8c434388942 100644 --- a/frontend/src/metabase/dashboard/components/DashboardGrid.tsx +++ b/frontend/src/metabase/dashboard/components/DashboardGrid.tsx @@ -2,7 +2,6 @@ import cx from "classnames"; import type { ComponentType } from "react"; import { Component } from "react"; import type { ConnectedProps } from "react-redux"; -import { connect } from "react-redux"; import { push } from "react-router-redux"; import { t } from "ttag"; import _ from "underscore"; @@ -30,6 +29,7 @@ import { GRID_WIDTH, MIN_ROW_HEIGHT, } from "metabase/lib/dashboard_grid"; +import { connect } from "metabase/lib/redux"; import EmbedFrameS from "metabase/public/components/EmbedFrame/EmbedFrame.module.css"; import { addUndo } from "metabase/redux/undo"; import { getVisualizationRaw } from "metabase/visualizations"; diff --git a/frontend/src/metabase/dashboard/components/DashboardMoveModal.tsx b/frontend/src/metabase/dashboard/components/DashboardMoveModal.tsx index 9b73e12e23432fc13620ba0a78c8112f07623fca..fc64dcfe46307e276c5cee6f8e465bb1d961cfa6 100644 --- a/frontend/src/metabase/dashboard/components/DashboardMoveModal.tsx +++ b/frontend/src/metabase/dashboard/components/DashboardMoveModal.tsx @@ -1,4 +1,3 @@ -import { connect } from "react-redux"; import { c, t } from "ttag"; import _ from "underscore"; @@ -6,6 +5,7 @@ import { MoveModal } from "metabase/containers/MoveModal"; import Collection, { ROOT_COLLECTION } from "metabase/entities/collections"; import Dashboards from "metabase/entities/dashboards"; import { color } from "metabase/lib/colors"; +import { connect } from "metabase/lib/redux"; import * as Urls from "metabase/lib/urls"; import { Icon } from "metabase/ui"; import type { CollectionId, Dashboard, DashboardId } from "metabase-types/api"; diff --git a/frontend/src/metabase/dashboard/components/QuestionPicker/QuestionPicker.jsx b/frontend/src/metabase/dashboard/components/QuestionPicker/QuestionPicker.jsx index 11fc712c4fbe92ac6d303f61340c1bfaef736189..1e2d1c995aed0a0fd0a4fdb1cb6d1c0c1b7997bc 100644 --- a/frontend/src/metabase/dashboard/components/QuestionPicker/QuestionPicker.jsx +++ b/frontend/src/metabase/dashboard/components/QuestionPicker/QuestionPicker.jsx @@ -1,6 +1,5 @@ import PropTypes from "prop-types"; import { useState } from "react"; -import { connect } from "react-redux"; import { t } from "ttag"; import _ from "underscore"; @@ -14,7 +13,7 @@ import { entityObjectLoader } from "metabase/entities/containers/EntityObjectLoa import { useDebouncedValue } from "metabase/hooks/use-debounced-value"; import { getCrumbs } from "metabase/lib/collections"; import { SEARCH_DEBOUNCE_DURATION } from "metabase/lib/constants"; -import { useSelector } from "metabase/lib/redux"; +import { connect, useSelector } from "metabase/lib/redux"; import { PLUGIN_COLLECTIONS } from "metabase/plugins"; import { Icon } from "metabase/ui"; diff --git a/frontend/src/metabase/dashboard/containers/ArchiveDashboardModal.jsx b/frontend/src/metabase/dashboard/containers/ArchiveDashboardModal.jsx index 20dd994ec5edf87cd6353105901c536f911bab2d..4d44add1e93d4b63577e669177909c450de956e4 100644 --- a/frontend/src/metabase/dashboard/containers/ArchiveDashboardModal.jsx +++ b/frontend/src/metabase/dashboard/containers/ArchiveDashboardModal.jsx @@ -1,7 +1,6 @@ /* eslint-disable react/prop-types */ import PropTypes from "prop-types"; import { Component } from "react"; -import { connect } from "react-redux"; import { withRouter } from "react-router"; import { push } from "react-router-redux"; import { t } from "ttag"; @@ -11,6 +10,7 @@ import { ArchiveModal } from "metabase/components/ArchiveModal"; import { setArchivedDashboard } from "metabase/dashboard/actions"; import Collection from "metabase/entities/collections"; import Dashboards from "metabase/entities/dashboards"; +import { connect } from "metabase/lib/redux"; import * as Urls from "metabase/lib/urls"; const mapDispatchToProps = dispatch => ({ diff --git a/frontend/src/metabase/dashboard/containers/AutomaticDashboardApp.jsx b/frontend/src/metabase/dashboard/containers/AutomaticDashboardApp.jsx index 2a9b8ee6122f2778d6d2224ad0bc5b2db9a405d0..34bc05c4338283f499fd6f77bf10edec478b13f5 100644 --- a/frontend/src/metabase/dashboard/containers/AutomaticDashboardApp.jsx +++ b/frontend/src/metabase/dashboard/containers/AutomaticDashboardApp.jsx @@ -2,7 +2,6 @@ import cx from "classnames"; import { dissoc } from "icepick"; import { Component } from "react"; -import { connect } from "react-redux"; import { t } from "ttag"; import _ from "underscore"; @@ -21,6 +20,7 @@ import Dashboards from "metabase/entities/dashboards"; import title from "metabase/hoc/Title"; import withToast from "metabase/hoc/Toast"; import { color } from "metabase/lib/colors"; +import { connect } from "metabase/lib/redux"; import * as Urls from "metabase/lib/urls"; import { ParametersList } from "metabase/parameters/components/ParametersList"; import { getMetadata } from "metabase/selectors/metadata"; diff --git a/frontend/src/metabase/dashboard/containers/CreateDashboardForm.tsx b/frontend/src/metabase/dashboard/containers/CreateDashboardForm.tsx index 72d11c6b7c209c2132eeb4afd95695b85cc49cff..5d128e393f9d51f122d8b8331fb0c77e8d73ce32 100644 --- a/frontend/src/metabase/dashboard/containers/CreateDashboardForm.tsx +++ b/frontend/src/metabase/dashboard/containers/CreateDashboardForm.tsx @@ -1,5 +1,4 @@ import { useCallback, useMemo } from "react"; -import { connect } from "react-redux"; import { t } from "ttag"; import _ from "underscore"; import * as Yup from "yup"; @@ -16,6 +15,7 @@ import Collections from "metabase/entities/collections"; import Dashboards from "metabase/entities/dashboards"; import { Form, FormProvider } from "metabase/forms"; import * as Errors from "metabase/lib/errors"; +import { connect } from "metabase/lib/redux"; import type { CollectionId, Dashboard } from "metabase-types/api"; import type { State } from "metabase-types/store"; diff --git a/frontend/src/metabase/dashboard/containers/CreateDashboardModal.tsx b/frontend/src/metabase/dashboard/containers/CreateDashboardModal.tsx index faf96939b200fca4f7d5f41d8bdd91b71dd5cdd8..624e326b9acf75c02d8ae0395850e8dfedb7c90c 100644 --- a/frontend/src/metabase/dashboard/containers/CreateDashboardModal.tsx +++ b/frontend/src/metabase/dashboard/containers/CreateDashboardModal.tsx @@ -1,10 +1,10 @@ import type { LocationDescriptor } from "history"; import { useCallback } from "react"; -import { connect } from "react-redux"; import { push } from "react-router-redux"; import { t } from "ttag"; import ModalContent from "metabase/components/ModalContent"; +import { connect } from "metabase/lib/redux"; import * as Urls from "metabase/lib/urls"; import type { Dashboard } from "metabase-types/api"; import type { State } from "metabase-types/store"; diff --git a/frontend/src/metabase/dashboard/containers/DashboardApp/DashboardApp.tsx b/frontend/src/metabase/dashboard/containers/DashboardApp/DashboardApp.tsx index bbd88211e90f78e7b621bcf74a2a383b6842b439..c0c069f2eb42baeb7612704543b0dcda92d2904b 100644 --- a/frontend/src/metabase/dashboard/containers/DashboardApp/DashboardApp.tsx +++ b/frontend/src/metabase/dashboard/containers/DashboardApp/DashboardApp.tsx @@ -2,7 +2,6 @@ import cx from "classnames"; import type { ReactNode } from "react"; import { useCallback, useEffect } from "react"; import type { ConnectedProps } from "react-redux"; -import { connect } from "react-redux"; import type { Route, WithRouterProps } from "react-router"; import { push } from "react-router-redux"; import { useUnmount } from "react-use"; @@ -24,7 +23,7 @@ import { useLoadingTimer } from "metabase/hooks/use-loading-timer"; import { useUniqueId } from "metabase/hooks/use-unique-id"; import { useWebNotification } from "metabase/hooks/use-web-notification"; import { parseHashOptions } from "metabase/lib/browser"; -import { useDispatch } from "metabase/lib/redux"; +import { connect, useDispatch } from "metabase/lib/redux"; import * as Urls from "metabase/lib/urls"; import { closeNavbar, setErrorPage } from "metabase/redux/app"; import { addUndo, dismissUndo } from "metabase/redux/undo"; diff --git a/frontend/src/metabase/dashboard/hoc/DashboardData.jsx b/frontend/src/metabase/dashboard/hoc/DashboardData.jsx index 427e8379db5733bada51fb80c4261fe75ab8dbe4..d372ca879fb695309074eadd9239d20bb6051b8d 100644 --- a/frontend/src/metabase/dashboard/hoc/DashboardData.jsx +++ b/frontend/src/metabase/dashboard/hoc/DashboardData.jsx @@ -1,6 +1,5 @@ /* eslint-disable react/prop-types */ import { Component } from "react"; -import { connect } from "react-redux"; import { push } from "react-router-redux"; import _ from "underscore"; @@ -14,6 +13,7 @@ import { getSelectedTabId, getSlowCards, } from "metabase/dashboard/selectors"; +import { connect } from "metabase/lib/redux"; import { setErrorPage } from "metabase/redux/app"; const mapStateToProps = (state, props) => { diff --git a/frontend/src/metabase/entities/containers/EntityListLoader.jsx b/frontend/src/metabase/entities/containers/EntityListLoader.jsx index 254d89e483601fc172372efeeb80bd2f03097b24..a437cf6fa410e4b5d01ee66420585b5947a448b1 100644 --- a/frontend/src/metabase/entities/containers/EntityListLoader.jsx +++ b/frontend/src/metabase/entities/containers/EntityListLoader.jsx @@ -2,12 +2,12 @@ import { createSelector } from "@reduxjs/toolkit"; import PropTypes from "prop-types"; import { Component } from "react"; -import { connect } from "react-redux"; import _ from "underscore"; import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper"; import paginationState from "metabase/hoc/PaginationState"; import { capitalize } from "metabase/lib/formatting"; +import { connect } from "metabase/lib/redux"; import entityType from "./EntityType"; diff --git a/frontend/src/metabase/entities/containers/EntityObjectLoader.jsx b/frontend/src/metabase/entities/containers/EntityObjectLoader.jsx index bb691eef0b8ed3bedd2fdbe7d1c08ab77a2f5c51..2be01b1342aa6b48dfc7412d63bc8f84a3e7e083 100644 --- a/frontend/src/metabase/entities/containers/EntityObjectLoader.jsx +++ b/frontend/src/metabase/entities/containers/EntityObjectLoader.jsx @@ -1,10 +1,10 @@ /* eslint-disable react/prop-types */ import { createSelector } from "@reduxjs/toolkit"; import { Component } from "react"; -import { connect } from "react-redux"; import _ from "underscore"; import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper"; +import { connect } from "metabase/lib/redux"; import entityType from "./EntityType"; diff --git a/frontend/src/metabase/entities/containers/EntityType.jsx b/frontend/src/metabase/entities/containers/EntityType.jsx index 400e888313665cda482c5a9983e5a559c44ed65e..b48b92926184adc1a01dd468fe746045263d547a 100644 --- a/frontend/src/metabase/entities/containers/EntityType.jsx +++ b/frontend/src/metabase/entities/containers/EntityType.jsx @@ -1,7 +1,8 @@ /* eslint-disable react/prop-types */ import { bindActionCreators } from "@reduxjs/toolkit"; import { Component } from "react"; -import { connect } from "react-redux"; + +import { connect } from "metabase/lib/redux"; /** * @deprecated HOCs are deprecated diff --git a/frontend/src/metabase/env.ts b/frontend/src/metabase/env.ts index 40ac3d501db42c73c07c21032217fd9c9132857f..304aeaa0754afa85aa9f36cea589c369e53c78c4 100644 --- a/frontend/src/metabase/env.ts +++ b/frontend/src/metabase/env.ts @@ -1,15 +1,45 @@ +const tryOrDefault = <T>(fn: () => T, defaultValue: T): T => { + try { + return fn(); + } catch (e) { + console.warn( + "Error while trying to get env", + e, + `returning default: ${defaultValue}`, + ); + return defaultValue; + } +}; + // @ts-expect-error window.Cypress is not typed -export const isCypressActive = !!window.Cypress; +export const isCypressActive = tryOrDefault(() => !!window.Cypress, false); -export const isStorybookActive = !!process.env.STORYBOOK; +export const isStorybookActive = tryOrDefault( + () => !!process.env.STORYBOOK, + false, +); -export const isProduction = process.env.WEBPACK_BUNDLE === "production"; +export const isProduction = tryOrDefault( + () => process.env.WEBPACK_BUNDLE === "production", + false, +); -export const isTest = process.env.NODE_ENV === "test"; +export const isTest = tryOrDefault( + () => process.env.NODE_ENV === "test", + false, +); -export const shouldLogAnalytics = process.env.MB_LOG_ANALYTICS === "true"; +export const shouldLogAnalytics = tryOrDefault( + () => process.env.MB_LOG_ANALYTICS === "true", + false, +); -export const isChartsDebugLoggingEnabled = - process.env.MB_LOG_CHARTS_DEBUG === "true"; +export const isChartsDebugLoggingEnabled = tryOrDefault( + () => process.env.MB_LOG_CHARTS_DEBUG === "true", + false, +); -export const isEmbeddingSdk = !!process.env.IS_EMBEDDING_SDK; +export const isEmbeddingSdk = tryOrDefault( + () => !!process.env.IS_EMBEDDING_SDK, + false, +); diff --git a/frontend/src/metabase/hoc/ModalRoute.tsx b/frontend/src/metabase/hoc/ModalRoute.tsx index 7c7e33b6c3e610821f1f69056071b328dddb66c4..185a5231200fce89b45a6ef3c07dcc89026ecd45 100644 --- a/frontend/src/metabase/hoc/ModalRoute.tsx +++ b/frontend/src/metabase/hoc/ModalRoute.tsx @@ -1,11 +1,11 @@ import type { LocationDescriptor } from "history"; import { Component } from "react"; import * as React from "react"; -import { connect } from "react-redux"; import { Route } from "react-router"; import { push } from "react-router-redux"; import Modal from "metabase/components/Modal"; +import { connect } from "metabase/lib/redux"; import MetabaseSettings from "metabase/lib/settings"; type IRoute = { diff --git a/frontend/src/metabase/hoc/Remapped.jsx b/frontend/src/metabase/hoc/Remapped.jsx index d63f8c22fdccaad22a26bed6416685791a9efdca..fd7b182e4323b2c74e22726b05c77040cb2a375a 100644 --- a/frontend/src/metabase/hoc/Remapped.jsx +++ b/frontend/src/metabase/hoc/Remapped.jsx @@ -1,7 +1,7 @@ /* eslint-disable react/prop-types */ import { Component } from "react"; -import { connect } from "react-redux"; +import { connect } from "metabase/lib/redux"; import { fetchRemapping } from "metabase/redux/metadata"; import { getMetadata } from "metabase/selectors/metadata"; diff --git a/frontend/src/metabase/hoc/Routeless.jsx b/frontend/src/metabase/hoc/Routeless.jsx index c2beb49ca72cfa81b13813bdb37f2d0093b6c1f3..128d0626e4384bba65e52db9cbaedfa5c8437259 100644 --- a/frontend/src/metabase/hoc/Routeless.jsx +++ b/frontend/src/metabase/hoc/Routeless.jsx @@ -1,9 +1,10 @@ /* eslint-disable react/prop-types */ import { Component } from "react"; -import { connect } from "react-redux"; import { goBack, push } from "react-router-redux"; import _ from "underscore"; +import { connect } from "metabase/lib/redux"; + // namespace under _routeless_ const mapStateToProps = (state, props) => ({ _routeless_location: state.routing.locationBeforeTransitions, diff --git a/frontend/src/metabase/hoc/Toast.jsx b/frontend/src/metabase/hoc/Toast.jsx index 9df49fddf5dc90de455d410468045d568ba7a7c0..39ae0441aca88881a6f1286c301b2a84a533323d 100644 --- a/frontend/src/metabase/hoc/Toast.jsx +++ b/frontend/src/metabase/hoc/Toast.jsx @@ -1,7 +1,7 @@ /* eslint-disable react/prop-types */ import { Component } from "react"; -import { connect } from "react-redux"; +import { connect } from "metabase/lib/redux"; import { addUndo } from "metabase/redux/undo"; const mapDispatchToProps = { diff --git a/frontend/src/metabase/lib/redux/custom-context.tsx b/frontend/src/metabase/lib/redux/custom-context.tsx new file mode 100644 index 0000000000000000000000000000000000000000..3c357f3ced9c4a8d9f8fb2363a525f8349ee7261 --- /dev/null +++ b/frontend/src/metabase/lib/redux/custom-context.tsx @@ -0,0 +1,34 @@ +import type { Store } from "@reduxjs/toolkit"; +import { createContext } from "react"; +import { Provider, ReactReduxContext } from "react-redux"; +// eslint-disable-next-line no-restricted-imports +import * as ReactRedux from "react-redux"; + +import { isEmbeddingSdk } from "metabase/env"; + +export const MetabaseReduxContext = isEmbeddingSdk + ? createContext<any>(null) + : ReactReduxContext; + +export const MetabaseReduxProvider = ({ + children, + store, +}: React.PropsWithChildren & { store: Store }) => { + return ( + <Provider store={store} context={MetabaseReduxContext}> + {children} + </Provider> + ); +}; + +export const connect: typeof ReactRedux.connect = ( + mapStateToProps?: any, + mapDispatchToProps?: any, + mergeProps?: any, + options?: any, +) => { + return ReactRedux.connect(mapStateToProps, mapDispatchToProps, mergeProps, { + context: MetabaseReduxContext, + ...options, + }); +}; diff --git a/frontend/src/metabase/lib/redux/hooks.ts b/frontend/src/metabase/lib/redux/hooks.ts index 10622e92acbfec4d7949cd8002184cac6a03a76c..dcb1d8604a61f3e939d0cb942091f863cade8632 100644 --- a/frontend/src/metabase/lib/redux/hooks.ts +++ b/frontend/src/metabase/lib/redux/hooks.ts @@ -1,16 +1,20 @@ import type { AnyAction, Store, ThunkDispatch } from "@reduxjs/toolkit"; import type { TypedUseSelectorHook } from "react-redux"; import { - useDispatch as useDispatchOriginal, - useSelector as useSelectorOriginal, - useStore as useStoreOriginal, + createDispatchHook, + createSelectorHook, + createStoreHook, } from "react-redux"; import type { State } from "metabase-types/store"; -export const useStore: () => Store<State, AnyAction> = useStoreOriginal; +import { MetabaseReduxContext } from "./custom-context"; + +export const useStore: () => Store<State, AnyAction> = + createStoreHook(MetabaseReduxContext); export const useDispatch: () => ThunkDispatch<State, void, AnyAction> = - useDispatchOriginal; -export const useSelector: TypedUseSelectorHook<State> = useSelectorOriginal; + createDispatchHook(MetabaseReduxContext); +export const useSelector: TypedUseSelectorHook<State> = + createSelectorHook(MetabaseReduxContext); export type DispatchFn = ReturnType<typeof useDispatch>; diff --git a/frontend/src/metabase/lib/redux/index.ts b/frontend/src/metabase/lib/redux/index.ts index 325110e8681af52c4b8d721608761032afba4fb9..260997d43d1b5b5e94ab497b2a550a9573988e52 100644 --- a/frontend/src/metabase/lib/redux/index.ts +++ b/frontend/src/metabase/lib/redux/index.ts @@ -1,3 +1,4 @@ export * from "./utils"; export * from "./typed-utils"; export * from "./hooks"; +export * from "./custom-context"; diff --git a/frontend/src/metabase/models/components/ModelDetailPage/ModelActionDetails/ModelActionDetails.tsx b/frontend/src/metabase/models/components/ModelDetailPage/ModelActionDetails/ModelActionDetails.tsx index 0e55c07d388a701b3027e97358ec22f148182cae..39e8b4227af54a96df52e3cb54fc55bb6fbdee7d 100644 --- a/frontend/src/metabase/models/components/ModelDetailPage/ModelActionDetails/ModelActionDetails.tsx +++ b/frontend/src/metabase/models/components/ModelDetailPage/ModelActionDetails/ModelActionDetails.tsx @@ -1,5 +1,4 @@ import { useCallback, useMemo } from "react"; -import { connect } from "react-redux"; import { t } from "ttag"; import _ from "underscore"; @@ -8,6 +7,7 @@ import Link from "metabase/core/components/Link"; import Actions from "metabase/entities/actions"; import Databases from "metabase/entities/databases"; import { useConfirmation } from "metabase/hooks/use-confirmation"; +import { connect } from "metabase/lib/redux"; import { parseTimestamp } from "metabase/lib/time"; import * as Urls from "metabase/lib/urls"; import type Question from "metabase-lib/v1/Question"; diff --git a/frontend/src/metabase/models/containers/ModelDetailPage/ModelDetailPage.tsx b/frontend/src/metabase/models/containers/ModelDetailPage/ModelDetailPage.tsx index 16a9d67ddd3d00e6dba32ec6659693ea79320fe6..0e3be191a4455d6d17b3d0cde2910d54db66ee13 100644 --- a/frontend/src/metabase/models/containers/ModelDetailPage/ModelDetailPage.tsx +++ b/frontend/src/metabase/models/containers/ModelDetailPage/ModelDetailPage.tsx @@ -1,7 +1,6 @@ import type { Location, LocationDescriptor } from "history"; import type * as React from "react"; import { useCallback, useEffect, useMemo, useState } from "react"; -import { connect } from "react-redux"; import { replace } from "react-router-redux"; import { useMount } from "react-use"; import _ from "underscore"; @@ -12,7 +11,7 @@ import Databases from "metabase/entities/databases"; import Questions from "metabase/entities/questions"; import Tables from "metabase/entities/tables"; import title from "metabase/hoc/Title"; -import { useSelector } from "metabase/lib/redux"; +import { connect, useSelector } from "metabase/lib/redux"; import * as Urls from "metabase/lib/urls"; import ModelDetailPageView from "metabase/models/components/ModelDetailPage"; import { loadMetadataForCard } from "metabase/questions/actions"; diff --git a/frontend/src/metabase/nav/components/ProfileLink/ProfileLink.jsx b/frontend/src/metabase/nav/components/ProfileLink/ProfileLink.jsx index 4f31e1157fb70b577ce0c974bc9bd35b59a35ead..512aefd4b362fd5b1b05432efffe12cb6a1de285 100644 --- a/frontend/src/metabase/nav/components/ProfileLink/ProfileLink.jsx +++ b/frontend/src/metabase/nav/components/ProfileLink/ProfileLink.jsx @@ -1,7 +1,6 @@ import cx from "classnames"; import PropTypes from "prop-types"; import { useState } from "react"; -import { connect } from "react-redux"; import { t } from "ttag"; import _ from "underscore"; @@ -22,7 +21,7 @@ import { } from "metabase/home/selectors"; import { color } from "metabase/lib/colors"; import { capitalize } from "metabase/lib/formatting"; -import { useSelector } from "metabase/lib/redux"; +import { connect, useSelector } from "metabase/lib/redux"; import * as Urls from "metabase/lib/urls"; import { openDiagnostics } from "metabase/redux/app"; import { @@ -199,7 +198,6 @@ function ProfileLink({ )} </Modal> ) : null} - {modalOpen === "diagnostic" && ( <ErrorDiagnosticModalWrapper isModalOpen={true} onClose={closeModal} /> )} diff --git a/frontend/src/metabase/nav/containers/AppBar/AppBar.tsx b/frontend/src/metabase/nav/containers/AppBar/AppBar.tsx index d8ac9a57c3f6e681dde14194b767396ea4284f42..0af5940965e54e7af3be9eaf1264ce3584300038 100644 --- a/frontend/src/metabase/nav/containers/AppBar/AppBar.tsx +++ b/frontend/src/metabase/nav/containers/AppBar/AppBar.tsx @@ -1,9 +1,9 @@ -import { connect } from "react-redux"; import { withRouter } from "react-router"; import _ from "underscore"; import { logout } from "metabase/auth/actions"; import Collections from "metabase/entities/collections"; +import { connect } from "metabase/lib/redux"; import { closeNavbar, toggleNavbar } from "metabase/redux/app"; import type { RouterProps } from "metabase/selectors/app"; import { diff --git a/frontend/src/metabase/nav/containers/MainNavbar/MainNavbar.tsx b/frontend/src/metabase/nav/containers/MainNavbar/MainNavbar.tsx index 6bb8ba6838e2b54b7f7a4458ac2cd1d309d47f8b..9941547c89f19c717443d04441cc2044bf11111b 100644 --- a/frontend/src/metabase/nav/containers/MainNavbar/MainNavbar.tsx +++ b/frontend/src/metabase/nav/containers/MainNavbar/MainNavbar.tsx @@ -1,12 +1,12 @@ import type { LocationDescriptor } from "history"; import { useEffect, useMemo } from "react"; -import { connect } from "react-redux"; import { push } from "react-router-redux"; import _ from "underscore"; import { skipToken, useGetCollectionQuery } from "metabase/api"; import { useQuestionQuery } from "metabase/common/hooks"; import { getDashboard } from "metabase/dashboard/selectors"; +import { connect } from "metabase/lib/redux"; import * as Urls from "metabase/lib/urls"; import { closeNavbar, openNavbar } from "metabase/redux/app"; import type Question from "metabase-lib/v1/Question"; diff --git a/frontend/src/metabase/nav/containers/MainNavbar/MainNavbarContainer/BookmarkList/BookmarkList.tsx b/frontend/src/metabase/nav/containers/MainNavbar/MainNavbarContainer/BookmarkList/BookmarkList.tsx index b6203199eb684a5b6c5a6f88461327d2547028c0..a16d0662aa59f02393e67012b3b104b01c7d0993 100644 --- a/frontend/src/metabase/nav/containers/MainNavbar/MainNavbarContainer/BookmarkList/BookmarkList.tsx +++ b/frontend/src/metabase/nav/containers/MainNavbar/MainNavbarContainer/BookmarkList/BookmarkList.tsx @@ -9,7 +9,6 @@ import { verticalListSortingStrategy, } from "@dnd-kit/sortable"; import { useCallback, useEffect, useState } from "react"; -import { connect } from "react-redux"; import { t } from "ttag"; import CollapseSection from "metabase/components/CollapseSection"; @@ -18,6 +17,7 @@ import Tooltip from "metabase/core/components/Tooltip"; import GrabberS from "metabase/css/components/grabber.module.css"; import CS from "metabase/css/core/index.css"; import Bookmarks from "metabase/entities/bookmarks"; +import { connect } from "metabase/lib/redux"; import * as Urls from "metabase/lib/urls"; import { PLUGIN_COLLECTIONS } from "metabase/plugins"; import { Icon } from "metabase/ui"; diff --git a/frontend/src/metabase/nav/containers/MainNavbar/MainNavbarContainer/MainNavbarContainer.tsx b/frontend/src/metabase/nav/containers/MainNavbar/MainNavbarContainer/MainNavbarContainer.tsx index 5ed0456608ffc9db13787dc4e27068456fbbae75..a58efe206e05b308164eb5ea46ce89e3aff2c642 100644 --- a/frontend/src/metabase/nav/containers/MainNavbar/MainNavbarContainer/MainNavbarContainer.tsx +++ b/frontend/src/metabase/nav/containers/MainNavbar/MainNavbarContainer/MainNavbarContainer.tsx @@ -1,6 +1,5 @@ import type { LocationDescriptor } from "history"; import { memo, useCallback, useMemo, useState } from "react"; -import { connect } from "react-redux"; import _ from "underscore"; import { @@ -22,6 +21,7 @@ import Collections, { getCollectionIcon, } from "metabase/entities/collections"; import Databases from "metabase/entities/databases"; +import { connect } from "metabase/lib/redux"; import * as Urls from "metabase/lib/urls"; import { getHasDataAccess } from "metabase/selectors/data"; import { getUser, getUserIsAdmin } from "metabase/selectors/user"; diff --git a/frontend/src/metabase/nav/containers/Navbar.tsx b/frontend/src/metabase/nav/containers/Navbar.tsx index e6dfaf3a000f4ade0f270b8370632c343ad401af..a6f349021bcfb0b8a767589a8653bb90c0e3b2e5 100644 --- a/frontend/src/metabase/nav/containers/Navbar.tsx +++ b/frontend/src/metabase/nav/containers/Navbar.tsx @@ -1,11 +1,11 @@ import type { Location } from "history"; import { useMemo } from "react"; -import { connect } from "react-redux"; import { withRouter } from "react-router"; import _ from "underscore"; import { getAdminPaths } from "metabase/admin/app/selectors"; import Database from "metabase/entities/databases"; +import { connect } from "metabase/lib/redux"; import { getIsNavbarOpen } from "metabase/selectors/app"; import { getUser } from "metabase/selectors/user"; import type { User } from "metabase-types/api"; diff --git a/frontend/src/metabase/nav/containers/QuestionLineage/QuestionLineage.tsx b/frontend/src/metabase/nav/containers/QuestionLineage/QuestionLineage.tsx index 69322fa599cee67f44343022f29d5f992c5d57f7..431355feeb563637c49c30fc0096cdb69a507d6d 100644 --- a/frontend/src/metabase/nav/containers/QuestionLineage/QuestionLineage.tsx +++ b/frontend/src/metabase/nav/containers/QuestionLineage/QuestionLineage.tsx @@ -1,5 +1,4 @@ -import { connect } from "react-redux"; - +import { connect } from "metabase/lib/redux"; import { getOriginalQuestion, getQuestion, diff --git a/frontend/src/metabase/parameters/components/ValuesSourceModal/ValuesSourceTypeModal.tsx b/frontend/src/metabase/parameters/components/ValuesSourceModal/ValuesSourceTypeModal.tsx index 9e30874c8a0176a9a334a0e6855d916ced6e6b13..290246a801386fa749710764bd7de296686f1b11 100644 --- a/frontend/src/metabase/parameters/components/ValuesSourceModal/ValuesSourceTypeModal.tsx +++ b/frontend/src/metabase/parameters/components/ValuesSourceModal/ValuesSourceTypeModal.tsx @@ -1,6 +1,5 @@ import type { ChangeEvent } from "react"; import { useCallback, useLayoutEffect, useMemo, useState } from "react"; -import { connect } from "react-redux"; import { jt, t } from "ttag"; import _ from "underscore"; @@ -15,7 +14,7 @@ import SelectButton from "metabase/core/components/SelectButton"; import Questions from "metabase/entities/questions"; import Tables from "metabase/entities/tables"; import { useSafeAsyncFunction } from "metabase/hooks/use-safe-async-function"; -import { useSelector } from "metabase/lib/redux"; +import { connect, useSelector } from "metabase/lib/redux"; import { getLearnUrl } from "metabase/selectors/settings"; import { getShowMetabaseLinks } from "metabase/selectors/whitelabel"; import { Box, Flex, Icon } from "metabase/ui"; diff --git a/frontend/src/metabase/public/containers/PublicAction/PublicActionLoader.tsx b/frontend/src/metabase/public/containers/PublicAction/PublicActionLoader.tsx index b2b89f1993ce3d4a9aac43b1e8e874c77e3854de..1513feeb05b1f44dc0ff94a2d6ed95253400502b 100644 --- a/frontend/src/metabase/public/containers/PublicAction/PublicActionLoader.tsx +++ b/frontend/src/metabase/public/containers/PublicAction/PublicActionLoader.tsx @@ -1,8 +1,8 @@ import { useCallback, useState } from "react"; -import { connect } from "react-redux"; import { useMount } from "react-use"; import { useSafeAsyncFunction } from "metabase/hooks/use-safe-async-function"; +import { connect } from "metabase/lib/redux"; import { SyncedEmbedFrame } from "metabase/public/components/EmbedFrame"; import { setErrorPage } from "metabase/redux/app"; import { PublicApi } from "metabase/services"; diff --git a/frontend/src/metabase/public/containers/PublicApp/PublicApp.tsx b/frontend/src/metabase/public/containers/PublicApp/PublicApp.tsx index 4dc0002792848f7704ae110c63a1e998fed6dc49..642697b97c8f0fdca94c91ffd86cf79908c44b34 100644 --- a/frontend/src/metabase/public/containers/PublicApp/PublicApp.tsx +++ b/frontend/src/metabase/public/containers/PublicApp/PublicApp.tsx @@ -1,5 +1,4 @@ -import { connect } from "react-redux"; - +import { connect } from "metabase/lib/redux"; import { PublicError } from "metabase/public/components/PublicError"; import { PublicNotFound } from "metabase/public/components/PublicNotFound"; import { getErrorPage } from "metabase/selectors/app"; diff --git a/frontend/src/metabase/public/containers/PublicOrEmbeddedDashboard/PublicOrEmbeddedDashboard.tsx b/frontend/src/metabase/public/containers/PublicOrEmbeddedDashboard/PublicOrEmbeddedDashboard.tsx index 706094a49640e076a713884e4cb6062265faabef..4a7694d2504c93eed5d60cd3e9934991f371e123 100644 --- a/frontend/src/metabase/public/containers/PublicOrEmbeddedDashboard/PublicOrEmbeddedDashboard.tsx +++ b/frontend/src/metabase/public/containers/PublicOrEmbeddedDashboard/PublicOrEmbeddedDashboard.tsx @@ -1,7 +1,6 @@ import type { Query } from "history"; import { useEffect, useRef } from "react"; import type { ConnectedProps } from "react-redux"; -import { connect } from "react-redux"; import { usePrevious, useUnmount } from "react-use"; import _ from "underscore"; @@ -29,6 +28,7 @@ import type { FetchDashboardResult, SuccessfulFetchDashboardResult, } from "metabase/dashboard/types"; +import { connect } from "metabase/lib/redux"; import { type DispatchFn, useDispatch } from "metabase/lib/redux"; import { LocaleProvider } from "metabase/public/LocaleProvider"; import type { PublicOrEmbeddedDashboardEventHandlersProps } from "metabase/public/containers/PublicOrEmbeddedDashboard/types"; diff --git a/frontend/src/metabase/public/containers/PublicOrEmbeddedDashboard/PublicOrEmbeddedDashboardView-filters.stories.tsx b/frontend/src/metabase/public/containers/PublicOrEmbeddedDashboard/PublicOrEmbeddedDashboardView-filters.stories.tsx index ecf7e84676ee164e4948d9c61e7696ed95fa1e04..f0150cb41b2f7919a09bbfc7773dfb3ab5a1b5e9 100644 --- a/frontend/src/metabase/public/containers/PublicOrEmbeddedDashboard/PublicOrEmbeddedDashboardView-filters.stories.tsx +++ b/frontend/src/metabase/public/containers/PublicOrEmbeddedDashboard/PublicOrEmbeddedDashboardView-filters.stories.tsx @@ -3,12 +3,12 @@ import createAsyncCallback from "@loki/create-async-callback"; import type { StoryContext, StoryFn } from "@storybook/react"; import { userEvent, within } from "@storybook/testing-library"; import { type ComponentProps, useEffect } from "react"; -import { Provider } from "react-redux"; import { getStore } from "__support__/entities-store"; import { createMockMetadata } from "__support__/metadata"; import { getNextId } from "__support__/utils"; import { NumberColumn, StringColumn } from "__support__/visualizations"; +import { MetabaseReduxProvider } from "metabase/lib/redux/custom-context"; import { getDashboardUiParameters } from "metabase/parameters/utils/dashboards"; import { publicReducers } from "metabase/reducers-public"; import TABLE_RAW_SERIES from "metabase/visualizations/components/TableSimple/stories-data/table-simple-orders-with-people.json"; @@ -101,9 +101,9 @@ function ReduxDecorator(Story: StoryFn, context: StoryContext) { const store = getStore(publicReducers, initialState); return ( - <Provider store={store}> + <MetabaseReduxProvider store={store}> <Story /> - </Provider> + </MetabaseReduxProvider> ); } diff --git a/frontend/src/metabase/public/containers/PublicOrEmbeddedDashboard/PublicOrEmbeddedDashboardView.stories.tsx b/frontend/src/metabase/public/containers/PublicOrEmbeddedDashboard/PublicOrEmbeddedDashboardView.stories.tsx index 1eb763c6668977fb84342cd03056ee05a1f422fd..3a219f6715f330dac150ac7620862de4098edc6b 100644 --- a/frontend/src/metabase/public/containers/PublicOrEmbeddedDashboard/PublicOrEmbeddedDashboardView.stories.tsx +++ b/frontend/src/metabase/public/containers/PublicOrEmbeddedDashboard/PublicOrEmbeddedDashboardView.stories.tsx @@ -2,7 +2,6 @@ import createAsyncCallback from "@loki/create-async-callback"; import type { StoryFn } from "@storybook/react"; import { type ComponentProps, useEffect } from "react"; -import { Provider } from "react-redux"; import { getStore } from "__support__/entities-store"; import { getNextId } from "__support__/utils"; @@ -10,6 +9,7 @@ import { NumberColumn, StringColumn } from "__support__/visualizations"; import PopoverWithTrigger from "metabase/components/PopoverWithTrigger"; import TippyPopoverWithTrigger from "metabase/components/PopoverWithTrigger/TippyPopoverWithTrigger"; import LegacyTooltip from "metabase/core/components/Tooltip"; +import { MetabaseReduxProvider } from "metabase/lib/redux"; import { publicReducers } from "metabase/reducers-public"; import { Box, Card, Popover, Text, Tooltip } from "metabase/ui"; import { registerVisualization } from "metabase/visualizations"; @@ -51,9 +51,9 @@ export default { function ReduxDecorator(Story: StoryFn) { return ( - <Provider store={store}> + <MetabaseReduxProvider store={store}> <Story /> - </Provider> + </MetabaseReduxProvider> ); } diff --git a/frontend/src/metabase/public/containers/PublicOrEmbeddedQuestion/PublicOrEmbeddedQuestionView.stories.tsx b/frontend/src/metabase/public/containers/PublicOrEmbeddedQuestion/PublicOrEmbeddedQuestionView.stories.tsx index 4eb11bfcf0e976271769d5cf1b14190e917d4e94..808bf9f384344bf254d7de2b19aa7cb2d5d42119 100644 --- a/frontend/src/metabase/public/containers/PublicOrEmbeddedQuestion/PublicOrEmbeddedQuestionView.stories.tsx +++ b/frontend/src/metabase/public/containers/PublicOrEmbeddedQuestion/PublicOrEmbeddedQuestionView.stories.tsx @@ -3,7 +3,6 @@ import createAsyncCallback from "@loki/create-async-callback"; import type { StoryFn } from "@storybook/react"; import { userEvent, within } from "@storybook/testing-library"; import { type ComponentProps, useEffect } from "react"; -import { Provider } from "react-redux"; import { getStore } from "__support__/entities-store"; import { createMockMetadata } from "__support__/metadata"; @@ -13,6 +12,7 @@ import { NumberColumn, StringColumn, } from "__support__/visualizations"; +import { MetabaseReduxProvider } from "metabase/lib/redux"; import { publicReducers } from "metabase/reducers-public"; import { Box } from "metabase/ui"; import { registerVisualization } from "metabase/visualizations"; @@ -52,9 +52,9 @@ export default { function ReduxDecorator(Story: StoryFn) { return ( - <Provider store={store}> + <MetabaseReduxProvider store={store}> <Story /> - </Provider> + </MetabaseReduxProvider> ); } diff --git a/frontend/src/metabase/query_builder/components/AlertModals/AlertEditChannels.jsx b/frontend/src/metabase/query_builder/components/AlertModals/AlertEditChannels.jsx index d0ff379b91a1557c65c0da31e805ca92bbf562aa..f25227acc0cd63b2a19cca1636dc48d333e9e55a 100644 --- a/frontend/src/metabase/query_builder/components/AlertModals/AlertEditChannels.jsx +++ b/frontend/src/metabase/query_builder/components/AlertModals/AlertEditChannels.jsx @@ -1,12 +1,12 @@ /* eslint-disable react/prop-types */ import cx from "classnames"; import { Component } from "react"; -import { connect } from "react-redux"; import { jt, t } from "ttag"; import _ from "underscore"; import CS from "metabase/css/core/index.css"; import Users from "metabase/entities/users"; +import { connect } from "metabase/lib/redux"; import { fetchPulseFormInput } from "metabase/pulse/actions"; import { PulseEditChannels } from "metabase/pulse/components/PulseEditChannels"; import { getPulseFormInput } from "metabase/pulse/selectors"; diff --git a/frontend/src/metabase/query_builder/components/AlertModals/AlertEditForm.jsx b/frontend/src/metabase/query_builder/components/AlertModals/AlertEditForm.jsx index 2bd9ea213fdfe816fff2fc3bf5aa1db564502fc0..a5ff24160cc244f62b21bfe2c0bdb9706d8fd4d8 100644 --- a/frontend/src/metabase/query_builder/components/AlertModals/AlertEditForm.jsx +++ b/frontend/src/metabase/query_builder/components/AlertModals/AlertEditForm.jsx @@ -1,7 +1,7 @@ /* eslint-disable react/prop-types */ import { Component } from "react"; -import { connect } from "react-redux"; +import { connect } from "metabase/lib/redux"; import { getUserIsAdmin } from "metabase/selectors/user"; import { AlertEditChannels } from "./AlertEditChannels"; diff --git a/frontend/src/metabase/query_builder/components/AlertModals/RawDataAlertTip.jsx b/frontend/src/metabase/query_builder/components/AlertModals/RawDataAlertTip.jsx index 1b783fe41e75d5b5582bdddab3a74d5fb688439a..cab6c5e59764b07b39f555b902268e97812077f6 100644 --- a/frontend/src/metabase/query_builder/components/AlertModals/RawDataAlertTip.jsx +++ b/frontend/src/metabase/query_builder/components/AlertModals/RawDataAlertTip.jsx @@ -1,8 +1,8 @@ /* eslint-disable react/prop-types */ import cx from "classnames"; -import { connect } from "react-redux"; import CS from "metabase/css/core/index.css"; +import { connect } from "metabase/lib/redux"; import { getQuestion, getVisualizationSettings, diff --git a/frontend/src/metabase/query_builder/components/DataSelector/DataSelector.jsx b/frontend/src/metabase/query_builder/components/DataSelector/DataSelector.jsx index 6ed0ae8039a44dd376474fb07176d71bee9956e2..c60ec747daa03563424d8a1e84928f9989e2d38b 100644 --- a/frontend/src/metabase/query_builder/components/DataSelector/DataSelector.jsx +++ b/frontend/src/metabase/query_builder/components/DataSelector/DataSelector.jsx @@ -2,7 +2,6 @@ import cx from "classnames"; import PropTypes from "prop-types"; import { Component, createRef } from "react"; -import { connect } from "react-redux"; import { t } from "ttag"; import _ from "underscore"; @@ -16,6 +15,7 @@ import Questions from "metabase/entities/questions"; import Schemas from "metabase/entities/schemas"; import Search from "metabase/entities/search"; import Tables from "metabase/entities/tables"; +import { connect } from "metabase/lib/redux"; import { getHasDataAccess } from "metabase/selectors/data"; import { getMetadata } from "metabase/selectors/metadata"; import { getSetting } from "metabase/selectors/settings"; diff --git a/frontend/src/metabase/query_builder/components/DataSelector/saved-entity-picker/SavedEntityPicker.jsx b/frontend/src/metabase/query_builder/components/DataSelector/saved-entity-picker/SavedEntityPicker.jsx index ebb7401480dc6c770c8bc93c161e88a9ec660804..2944d867c89e016682798878a84db6b10fcfc012 100644 --- a/frontend/src/metabase/query_builder/components/DataSelector/saved-entity-picker/SavedEntityPicker.jsx +++ b/frontend/src/metabase/query_builder/components/DataSelector/saved-entity-picker/SavedEntityPicker.jsx @@ -1,6 +1,5 @@ import PropTypes from "prop-types"; import { useCallback, useMemo, useState } from "react"; -import { connect } from "react-redux"; import _ from "underscore"; import { @@ -14,6 +13,7 @@ import Collection, { PERSONAL_COLLECTIONS, buildCollectionTree, } from "metabase/entities/collections"; +import { connect } from "metabase/lib/redux"; import { Icon } from "metabase/ui"; import SavedEntityList from "./SavedEntityList"; diff --git a/frontend/src/metabase/query_builder/components/DatasetEditor/DatasetEditor.jsx b/frontend/src/metabase/query_builder/components/DatasetEditor/DatasetEditor.jsx index 8a6ad03d2abfcb7f04d57a83bfe1b0e2ac520155..e89c56354f26ba9f3d7988aeb83f5ec82e58b4fa 100644 --- a/frontend/src/metabase/query_builder/components/DatasetEditor/DatasetEditor.jsx +++ b/frontend/src/metabase/query_builder/components/DatasetEditor/DatasetEditor.jsx @@ -2,7 +2,6 @@ import cx from "classnames"; import { merge } from "icepick"; import PropTypes from "prop-types"; import { useCallback, useEffect, useMemo, useState } from "react"; -import { connect } from "react-redux"; import { usePrevious } from "react-use"; import { t } from "ttag"; @@ -15,6 +14,7 @@ import Button from "metabase/core/components/Button"; import ButtonsS from "metabase/css/components/buttons.module.css"; import CS from "metabase/css/core/index.css"; import { useToggle } from "metabase/hooks/use-toggle"; +import { connect } from "metabase/lib/redux"; import { getSemanticTypeIcon } from "metabase/lib/schema_metadata"; import { setDatasetEditorTab } from "metabase/query_builder/actions"; import { calcInitialEditorHeight } from "metabase/query_builder/components/NativeQueryEditor/utils"; diff --git a/frontend/src/metabase/query_builder/components/DatasetEditor/DatasetFieldMetadataSidebar/SemanticTypePicker/FKTargetPicker.tsx b/frontend/src/metabase/query_builder/components/DatasetEditor/DatasetFieldMetadataSidebar/SemanticTypePicker/FKTargetPicker.tsx index 8f1612b923708fb174d1b0ffb61b991ed81aee74..a7c98e4a9596f82ddf123ae06a34e48be81610b5 100644 --- a/frontend/src/metabase/query_builder/components/DatasetEditor/DatasetFieldMetadataSidebar/SemanticTypePicker/FKTargetPicker.tsx +++ b/frontend/src/metabase/query_builder/components/DatasetEditor/DatasetFieldMetadataSidebar/SemanticTypePicker/FKTargetPicker.tsx @@ -1,11 +1,11 @@ import { useField } from "formik"; import { useEffect, useMemo } from "react"; -import { connect } from "react-redux"; import { t } from "ttag"; import _ from "underscore"; import Select from "metabase/core/components/Select"; import Databases from "metabase/entities/databases"; +import { connect } from "metabase/lib/redux"; import type Field from "metabase-lib/v1/metadata/Field"; import type { DatabaseId } from "metabase-types/api"; diff --git a/frontend/src/metabase/query_builder/components/NativeQueryEditor/NativeQueryEditor.tsx b/frontend/src/metabase/query_builder/components/NativeQueryEditor/NativeQueryEditor.tsx index 7007337925bd95e7c1d0b91ecac21098bc64cd24..4f69899c8190a57a4fc64bfd398cc0b181fa5466 100644 --- a/frontend/src/metabase/query_builder/components/NativeQueryEditor/NativeQueryEditor.tsx +++ b/frontend/src/metabase/query_builder/components/NativeQueryEditor/NativeQueryEditor.tsx @@ -1,7 +1,6 @@ import type { Ace } from "ace-builds"; import * as ace from "ace-builds/src-noconflict/ace"; import { Component, createRef } from "react"; -import { connect } from "react-redux"; import type { ResizableBox, ResizableBoxProps } from "react-resizable"; import slugg from "slugg"; import { t } from "ttag"; @@ -25,6 +24,7 @@ import Snippets from "metabase/entities/snippets"; import { SQLBehaviour } from "metabase/lib/ace/sql_behaviour"; import { isEventOverElement } from "metabase/lib/dom"; import { getEngineNativeAceMode } from "metabase/lib/engine"; +import { connect } from "metabase/lib/redux"; import { checkNotNull } from "metabase/lib/types"; import SnippetFormModal from "metabase/query_builder/components/template_tags/SnippetFormModal"; import type { QueryModalType } from "metabase/query_builder/constants"; diff --git a/frontend/src/metabase/query_builder/components/NewDatasetModal/NewDatasetModal.jsx b/frontend/src/metabase/query_builder/components/NewDatasetModal/NewDatasetModal.jsx index 81a34bc7a88777f9fcf365e271249026e05f5d44..d2b71b22fbc4ab1a3a04943322dd8da8d2ca38c1 100644 --- a/frontend/src/metabase/query_builder/components/NewDatasetModal/NewDatasetModal.jsx +++ b/frontend/src/metabase/query_builder/components/NewDatasetModal/NewDatasetModal.jsx @@ -1,11 +1,11 @@ import PropTypes from "prop-types"; -import { connect } from "react-redux"; import { t } from "ttag"; import ModalContent from "metabase/components/ModalContent"; import Button from "metabase/core/components/Button"; import Link from "metabase/core/components/Link"; import CS from "metabase/css/core/index.css"; +import { connect } from "metabase/lib/redux"; import { turnQuestionIntoModel } from "metabase/query_builder/actions"; import { diff --git a/frontend/src/metabase/query_builder/components/dataref/TableInfoLoader.tsx b/frontend/src/metabase/query_builder/components/dataref/TableInfoLoader.tsx index c07df2bef517dd0ad3aa20dac7946e149db8a39f..851ccdb3e32c9b74a94fd4d5e3ea4284d4fac983 100644 --- a/frontend/src/metabase/query_builder/components/dataref/TableInfoLoader.tsx +++ b/frontend/src/metabase/query_builder/components/dataref/TableInfoLoader.tsx @@ -1,9 +1,9 @@ import { useEffect, useState } from "react"; -import { connect } from "react-redux"; import _ from "underscore"; import Tables from "metabase/entities/tables"; import { useSafeAsyncFunction } from "metabase/hooks/use-safe-async-function"; +import { connect } from "metabase/lib/redux"; import type Table from "metabase-lib/v1/metadata/Table"; type OwnProps = { diff --git a/frontend/src/metabase/query_builder/components/dataref/TablePane.tsx b/frontend/src/metabase/query_builder/components/dataref/TablePane.tsx index 55bd55c136a2a7419af077d1bde1f233fc5a1b95..5d85419b44f79feaa3a5daebbb8cf5a042f60f22 100644 --- a/frontend/src/metabase/query_builder/components/dataref/TablePane.tsx +++ b/frontend/src/metabase/query_builder/components/dataref/TablePane.tsx @@ -1,4 +1,3 @@ -import { connect } from "react-redux"; import { msgid, ngettext, t } from "ttag"; import _ from "underscore"; @@ -8,6 +7,7 @@ import { } from "metabase/components/MetadataInfo/MetadataInfo.styled"; import CS from "metabase/css/core/index.css"; import Tables from "metabase/entities/tables"; +import { connect } from "metabase/lib/redux"; import SidebarContent from "metabase/query_builder/components/SidebarContent"; import ConnectedTableList from "metabase/query_builder/components/dataref/ConnectedTableList"; import type Table from "metabase-lib/v1/metadata/Table"; diff --git a/frontend/src/metabase/query_builder/components/expressions/ExpressionEditorTextfield/ExpressionEditorTextfield.tsx b/frontend/src/metabase/query_builder/components/expressions/ExpressionEditorTextfield/ExpressionEditorTextfield.tsx index 3ee32b96f228de75e201562915fd268dcf653bea..71ba78efb307cdaa13bee2d01a6efcc135b43eab 100644 --- a/frontend/src/metabase/query_builder/components/expressions/ExpressionEditorTextfield/ExpressionEditorTextfield.tsx +++ b/frontend/src/metabase/query_builder/components/expressions/ExpressionEditorTextfield/ExpressionEditorTextfield.tsx @@ -3,12 +3,12 @@ import * as ace from "ace-builds/src-noconflict/ace"; import * as React from "react"; import type { ICommand, IMarker } from "react-ace"; import AceEditor from "react-ace"; -import { connect } from "react-redux"; import { t } from "ttag"; import _ from "underscore"; import { getColumnIcon } from "metabase/common/utils/columns"; import ExplicitSize from "metabase/components/ExplicitSize"; +import { connect } from "metabase/lib/redux"; import { getMetadata } from "metabase/selectors/metadata"; import { getShowMetabaseLinks } from "metabase/selectors/whitelabel"; import type { IconName } from "metabase/ui"; diff --git a/frontend/src/metabase/query_builder/components/template_tags/SnippetForm/SnippetForm.tsx b/frontend/src/metabase/query_builder/components/template_tags/SnippetForm/SnippetForm.tsx index 5f48d252283b0f3ef4e5b810651f93ebd3ec2f97..1efa539a8986587f6d92bc338c7da105b594049d 100644 --- a/frontend/src/metabase/query_builder/components/template_tags/SnippetForm/SnippetForm.tsx +++ b/frontend/src/metabase/query_builder/components/template_tags/SnippetForm/SnippetForm.tsx @@ -1,5 +1,4 @@ import { useCallback, useMemo } from "react"; -import { connect } from "react-redux"; import { t } from "ttag"; import _ from "underscore"; import * as Yup from "yup"; @@ -14,6 +13,7 @@ import SnippetCollections from "metabase/entities/snippet-collections"; import Snippets from "metabase/entities/snippets"; import { Form, FormProvider } from "metabase/forms"; import * as Errors from "metabase/lib/errors"; +import { connect } from "metabase/lib/redux"; import type { Collection, NativeQuerySnippet, diff --git a/frontend/src/metabase/query_builder/components/template_tags/SnippetSidebar/SnippetSidebar.jsx b/frontend/src/metabase/query_builder/components/template_tags/SnippetSidebar/SnippetSidebar.jsx index 5a32e91b131534c9ba54771cb368b5f99fbdc2b5..17f23dabf7373ad860f6cca84bf5ba9fc6052ad3 100644 --- a/frontend/src/metabase/query_builder/components/template_tags/SnippetSidebar/SnippetSidebar.jsx +++ b/frontend/src/metabase/query_builder/components/template_tags/SnippetSidebar/SnippetSidebar.jsx @@ -2,7 +2,6 @@ import cx from "classnames"; import PropTypes from "prop-types"; import * as React from "react"; -import { connect } from "react-redux"; import { t } from "ttag"; import _ from "underscore"; @@ -14,6 +13,7 @@ import Search from "metabase/entities/search"; import SnippetCollections from "metabase/entities/snippet-collections"; import Snippets from "metabase/entities/snippets"; import { color } from "metabase/lib/colors"; +import { connect } from "metabase/lib/redux"; import { PLUGIN_SNIPPET_SIDEBAR_HEADER_BUTTONS, PLUGIN_SNIPPET_SIDEBAR_MODALS, diff --git a/frontend/src/metabase/query_builder/components/template_tags/TagEditorParam.tsx b/frontend/src/metabase/query_builder/components/template_tags/TagEditorParam.tsx index a708641c87108ba72e41ce4f7bc5d7b0c10b752c..800e33c7b03fcffeb84d2bf2635f5597e7e3996d 100644 --- a/frontend/src/metabase/query_builder/components/template_tags/TagEditorParam.tsx +++ b/frontend/src/metabase/query_builder/components/template_tags/TagEditorParam.tsx @@ -1,8 +1,8 @@ import { Component } from "react"; -import { connect } from "react-redux"; import { t } from "ttag"; import _ from "underscore"; +import { connect } from "metabase/lib/redux"; import { ValuesSourceSettings } from "metabase/parameters/components/ValuesSourceSettings"; import type { EmbeddingParameterVisibility } from "metabase/public/lib/types"; import { getOriginalQuestion } from "metabase/query_builder/selectors"; diff --git a/frontend/src/metabase/query_builder/components/view/QuestionRowCount/QuestionRowCount.tsx b/frontend/src/metabase/query_builder/components/view/QuestionRowCount/QuestionRowCount.tsx index 21685518fe8de543e9df019659864c0d33703a72..48e5c2f05e3e617333de79fec5a7b90f1e49bdfe 100644 --- a/frontend/src/metabase/query_builder/components/view/QuestionRowCount/QuestionRowCount.tsx +++ b/frontend/src/metabase/query_builder/components/view/QuestionRowCount/QuestionRowCount.tsx @@ -1,5 +1,4 @@ import { useMemo } from "react"; -import { connect } from "react-redux"; import { msgid, ngettext, t } from "ttag"; import _ from "underscore"; @@ -7,6 +6,7 @@ import PopoverWithTrigger from "metabase/components/PopoverWithTrigger"; import CS from "metabase/css/core/index.css"; import Database from "metabase/entities/databases"; import { formatNumber } from "metabase/lib/formatting"; +import { connect } from "metabase/lib/redux"; import { setLimit } from "metabase/query_builder/actions"; import LimitPopover from "metabase/query_builder/components/LimitPopover"; import { diff --git a/frontend/src/metabase/query_builder/components/view/View/View/View.jsx b/frontend/src/metabase/query_builder/components/view/View/View/View.jsx index 221f398bc9b6c544c1adc0a0972c75a1536a414f..1e12a889daa56353eabebab13725d52b68bfee29 100644 --- a/frontend/src/metabase/query_builder/components/view/View/View/View.jsx +++ b/frontend/src/metabase/query_builder/components/view/View/View/View.jsx @@ -1,6 +1,5 @@ /* eslint-disable react/prop-types */ -import { connect } from "react-redux"; import { match } from "ts-pattern"; import { t } from "ttag"; import _ from "underscore"; @@ -13,6 +12,7 @@ import CS from "metabase/css/core/index.css"; import QueryBuilderS from "metabase/css/query_builder.module.css"; import Bookmarks from "metabase/entities/bookmarks"; import Questions from "metabase/entities/questions"; +import { connect } from "metabase/lib/redux"; import { rememberLastUsedDatabase, setArchivedQuestion, diff --git a/frontend/src/metabase/query_builder/components/view/sidebars/DatasetManagementSection/DatasetManagementSection.jsx b/frontend/src/metabase/query_builder/components/view/sidebars/DatasetManagementSection/DatasetManagementSection.jsx index cfbf9fecaa67a65805bc1d80b41c3aeb98a6630d..84d30e098c5d090b157c7d7675513bd5a79c64fa 100644 --- a/frontend/src/metabase/query_builder/components/view/sidebars/DatasetManagementSection/DatasetManagementSection.jsx +++ b/frontend/src/metabase/query_builder/components/view/sidebars/DatasetManagementSection/DatasetManagementSection.jsx @@ -1,8 +1,8 @@ import PropTypes from "prop-types"; -import { connect } from "react-redux"; import { t } from "ttag"; import CS from "metabase/css/core/index.css"; +import { connect } from "metabase/lib/redux"; import { PLUGIN_MODERATION } from "metabase/plugins"; import { setQueryBuilderMode, diff --git a/frontend/src/metabase/query_builder/containers/QueryBuilder.tsx b/frontend/src/metabase/query_builder/containers/QueryBuilder.tsx index a2318c62fe7b66857b81c29df085119d508a7680..40aa47f8f3773dad183265cfdd21763e28387bba 100644 --- a/frontend/src/metabase/query_builder/containers/QueryBuilder.tsx +++ b/frontend/src/metabase/query_builder/containers/QueryBuilder.tsx @@ -1,6 +1,6 @@ import type { Location } from "history"; import { useCallback, useEffect, useMemo, useRef, useState } from "react"; -import { type ConnectedProps, connect } from "react-redux"; +import type { ConnectedProps } from "react-redux"; import type { Route, WithRouterProps } from "react-router"; import { push } from "react-router-redux"; import { useMount, usePrevious, useUnmount } from "react-use"; @@ -17,7 +17,7 @@ import { useFavicon } from "metabase/hooks/use-favicon"; import { useForceUpdate } from "metabase/hooks/use-force-update"; import { useLoadingTimer } from "metabase/hooks/use-loading-timer"; import { useWebNotification } from "metabase/hooks/use-web-notification"; -import { useSelector } from "metabase/lib/redux"; +import { connect, useSelector } from "metabase/lib/redux"; import { closeNavbar } from "metabase/redux/app"; import { getIsNavbarOpen } from "metabase/selectors/app"; import { getMetadata } from "metabase/selectors/metadata"; diff --git a/frontend/src/metabase/questions/containers/ArchiveQuestionModal.jsx b/frontend/src/metabase/questions/containers/ArchiveQuestionModal.jsx index 77e93c0e8f2c20fc573b8ac939e4bcd3299c79c6..0a0065deb1bf291c6b5ba721164a4f43c4a42400 100644 --- a/frontend/src/metabase/questions/containers/ArchiveQuestionModal.jsx +++ b/frontend/src/metabase/questions/containers/ArchiveQuestionModal.jsx @@ -1,9 +1,9 @@ /* eslint-disable react/prop-types */ import { Component } from "react"; -import { connect } from "react-redux"; import { msgid, ngettext, t } from "ttag"; import { ArchiveModal } from "metabase/components/ArchiveModal"; +import { connect } from "metabase/lib/redux"; import { setArchivedQuestion } from "metabase/query_builder/actions"; const mapDispatchToProps = dispatch => ({ diff --git a/frontend/src/metabase/reference/components/FieldsToGroupBy.jsx b/frontend/src/metabase/reference/components/FieldsToGroupBy.jsx index 215633a4a1638b9b8efb51d0013940d09b68a0e4..b8146e6422a1e7cb4ca412b936d796c15ba29001 100644 --- a/frontend/src/metabase/reference/components/FieldsToGroupBy.jsx +++ b/frontend/src/metabase/reference/components/FieldsToGroupBy.jsx @@ -1,10 +1,10 @@ /* eslint-disable react/prop-types */ import cx from "classnames"; import { Component } from "react"; -import { connect } from "react-redux"; import L from "metabase/components/List/List.module.css"; import CS from "metabase/css/core/index.css"; +import { connect } from "metabase/lib/redux"; import { fetchTableMetadata } from "metabase/redux/metadata"; import D from "metabase/reference/components/Detail.module.css"; import FieldToGroupBy from "metabase/reference/components/FieldToGroupBy"; diff --git a/frontend/src/metabase/reference/databases/DatabaseDetail.jsx b/frontend/src/metabase/reference/databases/DatabaseDetail.jsx index 42fc4f612c40a95e8dac3323743016505a929eb8..d3137af089922007587f66c61949b83b1a85c045 100644 --- a/frontend/src/metabase/reference/databases/DatabaseDetail.jsx +++ b/frontend/src/metabase/reference/databases/DatabaseDetail.jsx @@ -2,13 +2,13 @@ import cx from "classnames"; import { useFormik } from "formik"; import PropTypes from "prop-types"; -import { connect } from "react-redux"; import { push } from "react-router-redux"; import { t } from "ttag"; import List from "metabase/components/List"; import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper"; import CS from "metabase/css/core/index.css"; +import { connect } from "metabase/lib/redux"; import * as metadataActions from "metabase/redux/metadata"; import Detail from "metabase/reference/components/Detail"; import EditHeader from "metabase/reference/components/EditHeader"; diff --git a/frontend/src/metabase/reference/databases/DatabaseDetailContainer.jsx b/frontend/src/metabase/reference/databases/DatabaseDetailContainer.jsx index 78a01d269e96611d71b1d462b70ea14db2a63cfd..4626e22f33e8f7212ee51ef707ff5d9aa8965e20 100644 --- a/frontend/src/metabase/reference/databases/DatabaseDetailContainer.jsx +++ b/frontend/src/metabase/reference/databases/DatabaseDetailContainer.jsx @@ -2,10 +2,10 @@ import cx from "classnames"; import PropTypes from "prop-types"; import { Component } from "react"; -import { connect } from "react-redux"; import SidebarLayout from "metabase/components/SidebarLayout"; import CS from "metabase/css/core/index.css"; +import { connect } from "metabase/lib/redux"; import * as metadataActions from "metabase/redux/metadata"; import DatabaseDetail from "metabase/reference/databases/DatabaseDetail"; import * as actions from "metabase/reference/reference"; diff --git a/frontend/src/metabase/reference/databases/DatabaseList.jsx b/frontend/src/metabase/reference/databases/DatabaseList.jsx index 76def9d187da800ef363ae6ca9d5906eb7f248a2..b02f2966f612edece486d432714f862f1ac533d1 100644 --- a/frontend/src/metabase/reference/databases/DatabaseList.jsx +++ b/frontend/src/metabase/reference/databases/DatabaseList.jsx @@ -1,7 +1,6 @@ /* eslint "react/prop-types": "warn" */ import PropTypes from "prop-types"; import { Component } from "react"; -import { connect } from "react-redux"; import { t } from "ttag"; import List from "metabase/components/List"; @@ -9,6 +8,7 @@ import S from "metabase/components/List/List.module.css"; import ListItem from "metabase/components/ListItem"; import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper"; import CS from "metabase/css/core/index.css"; +import { connect } from "metabase/lib/redux"; import * as metadataActions from "metabase/redux/metadata"; import { NoDatabasesEmptyState } from "metabase/reference/databases/NoDatabasesEmptyState"; diff --git a/frontend/src/metabase/reference/databases/DatabaseListContainer.jsx b/frontend/src/metabase/reference/databases/DatabaseListContainer.jsx index cbf960c5dc066e4fbed670c0c8b500b60a68ab3d..cb04525b5ac314b847f1002915bdd7ba96f46719 100644 --- a/frontend/src/metabase/reference/databases/DatabaseListContainer.jsx +++ b/frontend/src/metabase/reference/databases/DatabaseListContainer.jsx @@ -2,10 +2,10 @@ import cx from "classnames"; import PropTypes from "prop-types"; import { Component } from "react"; -import { connect } from "react-redux"; import SidebarLayout from "metabase/components/SidebarLayout"; import CS from "metabase/css/core/index.css"; +import { connect } from "metabase/lib/redux"; import * as metadataActions from "metabase/redux/metadata"; import DatabaseList from "metabase/reference/databases/DatabaseList"; import BaseSidebar from "metabase/reference/guide/BaseSidebar"; diff --git a/frontend/src/metabase/reference/databases/FieldDetail.jsx b/frontend/src/metabase/reference/databases/FieldDetail.jsx index 0760bbc07355012b39c1efa4febf7d2d916e5989..2fc056262d2be38f96b5fb678a43f81243771d1e 100644 --- a/frontend/src/metabase/reference/databases/FieldDetail.jsx +++ b/frontend/src/metabase/reference/databases/FieldDetail.jsx @@ -2,13 +2,13 @@ import cx from "classnames"; import { useFormik } from "formik"; import PropTypes from "prop-types"; -import { connect } from "react-redux"; import { push } from "react-router-redux"; import { t } from "ttag"; import List from "metabase/components/List"; import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper"; import CS from "metabase/css/core/index.css"; +import { connect } from "metabase/lib/redux"; import * as metadataActions from "metabase/redux/metadata"; import S from "metabase/reference/Reference.module.css"; import Detail from "metabase/reference/components/Detail"; diff --git a/frontend/src/metabase/reference/databases/FieldDetailContainer.jsx b/frontend/src/metabase/reference/databases/FieldDetailContainer.jsx index 7251e9ee3561dca8b64bfd779b31c573e23033ad..88ec64dc8f6861501ca464eb0699c959437dbaa7 100644 --- a/frontend/src/metabase/reference/databases/FieldDetailContainer.jsx +++ b/frontend/src/metabase/reference/databases/FieldDetailContainer.jsx @@ -2,10 +2,10 @@ import cx from "classnames"; import PropTypes from "prop-types"; import { Component } from "react"; -import { connect } from "react-redux"; import SidebarLayout from "metabase/components/SidebarLayout"; import CS from "metabase/css/core/index.css"; +import { connect } from "metabase/lib/redux"; import * as metadataActions from "metabase/redux/metadata"; import FieldDetail from "metabase/reference/databases/FieldDetail"; import * as actions from "metabase/reference/reference"; diff --git a/frontend/src/metabase/reference/databases/FieldList.jsx b/frontend/src/metabase/reference/databases/FieldList.jsx index 5cb38352dd57ef6f588f2c5dcc7c4b71a69b9bf5..f69ccf7821718fdd016593ffb196fbe1a1d49969 100644 --- a/frontend/src/metabase/reference/databases/FieldList.jsx +++ b/frontend/src/metabase/reference/databases/FieldList.jsx @@ -3,7 +3,6 @@ import cx from "classnames"; import { useFormik } from "formik"; import PropTypes from "prop-types"; -import { connect } from "react-redux"; import { t } from "ttag"; import EmptyState from "metabase/components/EmptyState"; @@ -11,6 +10,7 @@ import List from "metabase/components/List"; import S from "metabase/components/List/List.module.css"; import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper"; import CS from "metabase/css/core/index.css"; +import { connect } from "metabase/lib/redux"; import * as metadataActions from "metabase/redux/metadata"; import R from "metabase/reference/Reference.module.css"; import EditHeader from "metabase/reference/components/EditHeader"; diff --git a/frontend/src/metabase/reference/databases/FieldListContainer.jsx b/frontend/src/metabase/reference/databases/FieldListContainer.jsx index 8526b4ca1b3de43c58ff484eb95eccad1c3bb13e..4e4f99953b41bf6b7214ba4ab83336951f3b4cae 100644 --- a/frontend/src/metabase/reference/databases/FieldListContainer.jsx +++ b/frontend/src/metabase/reference/databases/FieldListContainer.jsx @@ -2,10 +2,10 @@ import cx from "classnames"; import PropTypes from "prop-types"; import { Component } from "react"; -import { connect } from "react-redux"; import SidebarLayout from "metabase/components/SidebarLayout"; import CS from "metabase/css/core/index.css"; +import { connect } from "metabase/lib/redux"; import * as metadataActions from "metabase/redux/metadata"; import FieldList from "metabase/reference/databases/FieldList"; import * as actions from "metabase/reference/reference"; diff --git a/frontend/src/metabase/reference/databases/TableDetail.jsx b/frontend/src/metabase/reference/databases/TableDetail.jsx index 737708c88fd785b13bebf74cb69c19f262af578b..b9048c34f3f29cd39d0aa553294cbc4061211059 100644 --- a/frontend/src/metabase/reference/databases/TableDetail.jsx +++ b/frontend/src/metabase/reference/databases/TableDetail.jsx @@ -2,13 +2,13 @@ import cx from "classnames"; import { useFormik } from "formik"; import PropTypes from "prop-types"; -import { connect } from "react-redux"; import { push } from "react-router-redux"; import { t } from "ttag"; import List from "metabase/components/List"; import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper"; import CS from "metabase/css/core/index.css"; +import { connect } from "metabase/lib/redux"; import * as metadataActions from "metabase/redux/metadata"; import S from "metabase/reference/Reference.module.css"; import Detail from "metabase/reference/components/Detail"; diff --git a/frontend/src/metabase/reference/databases/TableDetailContainer.jsx b/frontend/src/metabase/reference/databases/TableDetailContainer.jsx index f4fe5c16e39df1202453e00e2b98fb839b076be3..817124cc7393dbb7a46aaedd2e5bd73fe9d54cdc 100644 --- a/frontend/src/metabase/reference/databases/TableDetailContainer.jsx +++ b/frontend/src/metabase/reference/databases/TableDetailContainer.jsx @@ -2,10 +2,10 @@ import cx from "classnames"; import PropTypes from "prop-types"; import { Component } from "react"; -import { connect } from "react-redux"; import SidebarLayout from "metabase/components/SidebarLayout"; import CS from "metabase/css/core/index.css"; +import { connect } from "metabase/lib/redux"; import * as metadataActions from "metabase/redux/metadata"; import TableDetail from "metabase/reference/databases/TableDetail"; import * as actions from "metabase/reference/reference"; diff --git a/frontend/src/metabase/reference/databases/TableList.jsx b/frontend/src/metabase/reference/databases/TableList.jsx index a196e5233590cd9e15b0c60bbfb17f9e62b88c96..65fc9c9fd4f3caa17d7ca0af39af92f9aa570832 100644 --- a/frontend/src/metabase/reference/databases/TableList.jsx +++ b/frontend/src/metabase/reference/databases/TableList.jsx @@ -2,7 +2,6 @@ import cx from "classnames"; import PropTypes from "prop-types"; import { Component } from "react"; -import { connect } from "react-redux"; import { t } from "ttag"; import _ from "underscore"; @@ -12,6 +11,7 @@ import S from "metabase/components/List/List.module.css"; import ListItem from "metabase/components/ListItem"; import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper"; import CS from "metabase/css/core/index.css"; +import { connect } from "metabase/lib/redux"; import * as metadataActions from "metabase/redux/metadata"; import R from "metabase/reference/Reference.module.css"; diff --git a/frontend/src/metabase/reference/databases/TableListContainer.jsx b/frontend/src/metabase/reference/databases/TableListContainer.jsx index 640d16151dd6d742d38383e335551e3c6d501c6e..190072b63540c68fecd894c70bf8bf2a74cf6738 100644 --- a/frontend/src/metabase/reference/databases/TableListContainer.jsx +++ b/frontend/src/metabase/reference/databases/TableListContainer.jsx @@ -2,10 +2,10 @@ import cx from "classnames"; import PropTypes from "prop-types"; import { Component } from "react"; -import { connect } from "react-redux"; import SidebarLayout from "metabase/components/SidebarLayout"; import CS from "metabase/css/core/index.css"; +import { connect } from "metabase/lib/redux"; import * as metadataActions from "metabase/redux/metadata"; import TableList from "metabase/reference/databases/TableList"; import * as actions from "metabase/reference/reference"; diff --git a/frontend/src/metabase/reference/databases/TableQuestions.jsx b/frontend/src/metabase/reference/databases/TableQuestions.jsx index 72c76311ffe9f1eb04af25e79a612f09c063b5f7..2aadfad1489f38e90301ca4dfe172e6dd5401087 100644 --- a/frontend/src/metabase/reference/databases/TableQuestions.jsx +++ b/frontend/src/metabase/reference/databases/TableQuestions.jsx @@ -3,7 +3,6 @@ import cx from "classnames"; import moment from "moment-timezone"; // eslint-disable-line no-restricted-imports -- deprecated usage import PropTypes from "prop-types"; import { Component } from "react"; -import { connect } from "react-redux"; import { t } from "ttag"; import AdminAwareEmptyState from "metabase/components/AdminAwareEmptyState"; @@ -12,6 +11,7 @@ import S from "metabase/components/List/List.module.css"; import ListItem from "metabase/components/ListItem"; import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper"; import CS from "metabase/css/core/index.css"; +import { connect } from "metabase/lib/redux"; import * as Urls from "metabase/lib/urls"; import * as metadataActions from "metabase/redux/metadata"; import { getMetadata } from "metabase/selectors/metadata"; diff --git a/frontend/src/metabase/reference/databases/TableQuestionsContainer.jsx b/frontend/src/metabase/reference/databases/TableQuestionsContainer.jsx index 21bc8e28301ad43231036c81fdd13e2214a90aa5..495d93e2160bc2cba106aeccdebc5916a2dd8dbf 100644 --- a/frontend/src/metabase/reference/databases/TableQuestionsContainer.jsx +++ b/frontend/src/metabase/reference/databases/TableQuestionsContainer.jsx @@ -2,11 +2,11 @@ import cx from "classnames"; import PropTypes from "prop-types"; import { Component } from "react"; -import { connect } from "react-redux"; import SidebarLayout from "metabase/components/SidebarLayout"; import CS from "metabase/css/core/index.css"; import Questions from "metabase/entities/questions"; +import { connect } from "metabase/lib/redux"; import * as metadataActions from "metabase/redux/metadata"; import TableQuestions from "metabase/reference/databases/TableQuestions"; import * as actions from "metabase/reference/reference"; diff --git a/frontend/src/metabase/reference/segments/SegmentDetail.jsx b/frontend/src/metabase/reference/segments/SegmentDetail.jsx index bd9b85bd0d93b48853bd9553e868d5ddb02eedf8..84e0e2ef63b42719415e440c732a6c706287dc9d 100644 --- a/frontend/src/metabase/reference/segments/SegmentDetail.jsx +++ b/frontend/src/metabase/reference/segments/SegmentDetail.jsx @@ -2,13 +2,13 @@ import cx from "classnames"; import { useFormik } from "formik"; import PropTypes from "prop-types"; -import { connect } from "react-redux"; import { t } from "ttag"; import List from "metabase/components/List"; import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper"; import Link from "metabase/core/components/Link"; import CS from "metabase/css/core/index.css"; +import { connect } from "metabase/lib/redux"; import * as metadataActions from "metabase/redux/metadata"; import Detail from "metabase/reference/components/Detail"; import EditHeader from "metabase/reference/components/EditHeader"; diff --git a/frontend/src/metabase/reference/segments/SegmentDetailContainer.jsx b/frontend/src/metabase/reference/segments/SegmentDetailContainer.jsx index 62852c3bc1557bb59b6e861ee46ca08208ee80c2..89d89fa386743b4e98004205844f4a2b938cc113 100644 --- a/frontend/src/metabase/reference/segments/SegmentDetailContainer.jsx +++ b/frontend/src/metabase/reference/segments/SegmentDetailContainer.jsx @@ -2,10 +2,10 @@ import cx from "classnames"; import PropTypes from "prop-types"; import { Component } from "react"; -import { connect } from "react-redux"; import SidebarLayout from "metabase/components/SidebarLayout"; import CS from "metabase/css/core/index.css"; +import { connect } from "metabase/lib/redux"; import * as metadataActions from "metabase/redux/metadata"; import * as actions from "metabase/reference/reference"; import SegmentDetail from "metabase/reference/segments/SegmentDetail"; diff --git a/frontend/src/metabase/reference/segments/SegmentFieldDetail.jsx b/frontend/src/metabase/reference/segments/SegmentFieldDetail.jsx index 7baf315c42a97c6a654191bef831c85db38559a0..16d3ac987b4d5d9278a2347aef110f82422fbc08 100644 --- a/frontend/src/metabase/reference/segments/SegmentFieldDetail.jsx +++ b/frontend/src/metabase/reference/segments/SegmentFieldDetail.jsx @@ -2,12 +2,12 @@ import cx from "classnames"; import { useFormik } from "formik"; import PropTypes from "prop-types"; -import { connect } from "react-redux"; import { t } from "ttag"; import List from "metabase/components/List"; import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper"; import CS from "metabase/css/core/index.css"; +import { connect } from "metabase/lib/redux"; import * as metadataActions from "metabase/redux/metadata"; import S from "metabase/reference/Reference.module.css"; import Detail from "metabase/reference/components/Detail"; diff --git a/frontend/src/metabase/reference/segments/SegmentFieldDetailContainer.jsx b/frontend/src/metabase/reference/segments/SegmentFieldDetailContainer.jsx index c92bc7736c26dc5a75915c2852fc5ec6c2e56269..79ef8608c977596cc1d0a0ac9b3265637db480c5 100644 --- a/frontend/src/metabase/reference/segments/SegmentFieldDetailContainer.jsx +++ b/frontend/src/metabase/reference/segments/SegmentFieldDetailContainer.jsx @@ -2,10 +2,10 @@ import cx from "classnames"; import PropTypes from "prop-types"; import { Component } from "react"; -import { connect } from "react-redux"; import SidebarLayout from "metabase/components/SidebarLayout"; import CS from "metabase/css/core/index.css"; +import { connect } from "metabase/lib/redux"; import * as metadataActions from "metabase/redux/metadata"; import * as actions from "metabase/reference/reference"; import SegmentFieldDetail from "metabase/reference/segments/SegmentFieldDetail"; diff --git a/frontend/src/metabase/reference/segments/SegmentFieldList.jsx b/frontend/src/metabase/reference/segments/SegmentFieldList.jsx index f5f08dc062af68918731df2276e08766e20571d9..1fc5810a82bfbe5fdb12adb44a0bff1d2e8daa53 100644 --- a/frontend/src/metabase/reference/segments/SegmentFieldList.jsx +++ b/frontend/src/metabase/reference/segments/SegmentFieldList.jsx @@ -2,7 +2,6 @@ import cx from "classnames"; import { useFormik } from "formik"; import PropTypes from "prop-types"; -import { connect } from "react-redux"; import { t } from "ttag"; import EmptyState from "metabase/components/EmptyState"; @@ -10,6 +9,7 @@ import List from "metabase/components/List"; import S from "metabase/components/List/List.module.css"; import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper"; import CS from "metabase/css/core/index.css"; +import { connect } from "metabase/lib/redux"; import * as metadataActions from "metabase/redux/metadata"; import R from "metabase/reference/Reference.module.css"; import EditHeader from "metabase/reference/components/EditHeader"; diff --git a/frontend/src/metabase/reference/segments/SegmentFieldListContainer.jsx b/frontend/src/metabase/reference/segments/SegmentFieldListContainer.jsx index 52b2da5781ad2bbebfd79412d37fbe0e270ebb01..ddce9191b7d6a915e34a8e18ff12a69510e421c4 100644 --- a/frontend/src/metabase/reference/segments/SegmentFieldListContainer.jsx +++ b/frontend/src/metabase/reference/segments/SegmentFieldListContainer.jsx @@ -2,10 +2,10 @@ import cx from "classnames"; import PropTypes from "prop-types"; import { Component } from "react"; -import { connect } from "react-redux"; import SidebarLayout from "metabase/components/SidebarLayout"; import CS from "metabase/css/core/index.css"; +import { connect } from "metabase/lib/redux"; import * as metadataActions from "metabase/redux/metadata"; import * as actions from "metabase/reference/reference"; import SegmentFieldList from "metabase/reference/segments/SegmentFieldList"; diff --git a/frontend/src/metabase/reference/segments/SegmentListContainer.jsx b/frontend/src/metabase/reference/segments/SegmentListContainer.jsx index 3a3a16998d27cb74c2378b0dadfc86f52b20a375..903ba066b1e8a355a5c99f87ba430a2e9564c913 100644 --- a/frontend/src/metabase/reference/segments/SegmentListContainer.jsx +++ b/frontend/src/metabase/reference/segments/SegmentListContainer.jsx @@ -2,10 +2,10 @@ import cx from "classnames"; import PropTypes from "prop-types"; import { Component } from "react"; -import { connect } from "react-redux"; import SidebarLayout from "metabase/components/SidebarLayout"; import CS from "metabase/css/core/index.css"; +import { connect } from "metabase/lib/redux"; import * as metadataActions from "metabase/redux/metadata"; import BaseSidebar from "metabase/reference/guide/BaseSidebar"; import * as actions from "metabase/reference/reference"; diff --git a/frontend/src/metabase/reference/segments/SegmentQuestions.jsx b/frontend/src/metabase/reference/segments/SegmentQuestions.jsx index 6d5ca70e3c9d2f11b122543f5701f3e2767118c4..6609a8e1810eb43785dd4da3d03689cdd5c2f72c 100644 --- a/frontend/src/metabase/reference/segments/SegmentQuestions.jsx +++ b/frontend/src/metabase/reference/segments/SegmentQuestions.jsx @@ -1,7 +1,6 @@ /* eslint "react/prop-types": "warn" */ import cx from "classnames"; import PropTypes from "prop-types"; -import { connect } from "react-redux"; import { t } from "ttag"; import { useQuestionListQuery } from "metabase/common/hooks"; @@ -11,6 +10,7 @@ import S from "metabase/components/List/List.module.css"; import ListItem from "metabase/components/ListItem"; import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper"; import CS from "metabase/css/core/index.css"; +import { connect } from "metabase/lib/redux"; import * as Urls from "metabase/lib/urls"; import * as metadataActions from "metabase/redux/metadata"; import { getMetadata } from "metabase/selectors/metadata"; diff --git a/frontend/src/metabase/reference/segments/SegmentQuestionsContainer.jsx b/frontend/src/metabase/reference/segments/SegmentQuestionsContainer.jsx index 1bff43bc79b36675937f2653b9ba2de0649ae288..0b29595b18d283417c6cd0f40c9f0c0924ab3cdf 100644 --- a/frontend/src/metabase/reference/segments/SegmentQuestionsContainer.jsx +++ b/frontend/src/metabase/reference/segments/SegmentQuestionsContainer.jsx @@ -2,11 +2,11 @@ import cx from "classnames"; import PropTypes from "prop-types"; import { Component } from "react"; -import { connect } from "react-redux"; import SidebarLayout from "metabase/components/SidebarLayout"; import CS from "metabase/css/core/index.css"; import Questions from "metabase/entities/questions"; +import { connect } from "metabase/lib/redux"; import * as metadataActions from "metabase/redux/metadata"; import * as actions from "metabase/reference/reference"; import SegmentQuestions from "metabase/reference/segments/SegmentQuestions"; diff --git a/frontend/src/metabase/reference/segments/SegmentRevisions.jsx b/frontend/src/metabase/reference/segments/SegmentRevisions.jsx index 2f77733a551415db50e5f51b2a78ec2fb6c3b7dc..235cb06db5c84c7560f18be7c94426269e57b1fa 100644 --- a/frontend/src/metabase/reference/segments/SegmentRevisions.jsx +++ b/frontend/src/metabase/reference/segments/SegmentRevisions.jsx @@ -2,7 +2,6 @@ import cx from "classnames"; import { getIn } from "icepick"; import PropTypes from "prop-types"; import { Component } from "react"; -import { connect } from "react-redux"; import { t } from "ttag"; import Revision from "metabase/admin/datamodel/components/revisions/Revision"; @@ -11,6 +10,7 @@ import S from "metabase/components/List/List.module.css"; import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper"; import CS from "metabase/css/core/index.css"; import { assignUserColors } from "metabase/lib/formatting"; +import { connect } from "metabase/lib/redux"; import * as metadataActions from "metabase/redux/metadata"; import ReferenceHeader from "../components/ReferenceHeader"; diff --git a/frontend/src/metabase/reference/segments/SegmentRevisionsContainer.jsx b/frontend/src/metabase/reference/segments/SegmentRevisionsContainer.jsx index b89c9a6df44195b271d1b19d199e9abd6f997d31..712c758373e810a1ed8e4860279a128415868973 100644 --- a/frontend/src/metabase/reference/segments/SegmentRevisionsContainer.jsx +++ b/frontend/src/metabase/reference/segments/SegmentRevisionsContainer.jsx @@ -2,10 +2,10 @@ import cx from "classnames"; import PropTypes from "prop-types"; import { Component } from "react"; -import { connect } from "react-redux"; import SidebarLayout from "metabase/components/SidebarLayout"; import CS from "metabase/css/core/index.css"; +import { connect } from "metabase/lib/redux"; import * as metadataActions from "metabase/redux/metadata"; import * as actions from "metabase/reference/reference"; import SegmentRevisions from "metabase/reference/segments/SegmentRevisions"; diff --git a/frontend/src/metabase/sharing/components/AddEditSidebar/AddEditSidebar.jsx b/frontend/src/metabase/sharing/components/AddEditSidebar/AddEditSidebar.jsx index 4c3a1fff8fa3c58669563cae0058721fa2751c56..710c0a7b70b54311efb7ab4c18f889cdcd9f2c9a 100644 --- a/frontend/src/metabase/sharing/components/AddEditSidebar/AddEditSidebar.jsx +++ b/frontend/src/metabase/sharing/components/AddEditSidebar/AddEditSidebar.jsx @@ -1,6 +1,5 @@ -import { connect } from "react-redux"; - import { getParameters } from "metabase/dashboard/selectors"; +import { connect } from "metabase/lib/redux"; import _AddEditEmailSidebar from "./AddEditEmailSidebar"; import _AddEditSlackSidebar from "./AddEditSlackSidebar"; diff --git a/frontend/src/metabase/sharing/components/PulsesListSidebar.jsx b/frontend/src/metabase/sharing/components/PulsesListSidebar.jsx index 858e5d2654ff09525f157640e0e333f5f01fdfd3..556347839399c31d2502d00dcd38de1609781d5e 100644 --- a/frontend/src/metabase/sharing/components/PulsesListSidebar.jsx +++ b/frontend/src/metabase/sharing/components/PulsesListSidebar.jsx @@ -2,7 +2,6 @@ import cx from "classnames"; import PropTypes from "prop-types"; -import { connect } from "react-redux"; import { msgid, ngettext, t } from "ttag"; import _ from "underscore"; @@ -17,6 +16,7 @@ import { formatTimeWithUnit, } from "metabase/lib/formatting"; import { getActivePulseParameters } from "metabase/lib/pulse"; +import { connect } from "metabase/lib/redux"; import { formatFrame } from "metabase/lib/time"; import { Icon } from "metabase/ui"; diff --git a/frontend/src/metabase/sharing/components/SharingSidebar/SharingSidebar.jsx b/frontend/src/metabase/sharing/components/SharingSidebar/SharingSidebar.jsx index c9db06a96f131a9d04d7d26d4b8f1f7d3ec878cb..2338be884edc9e9b956ae7a3992f1806ebe2edd8 100644 --- a/frontend/src/metabase/sharing/components/SharingSidebar/SharingSidebar.jsx +++ b/frontend/src/metabase/sharing/components/SharingSidebar/SharingSidebar.jsx @@ -2,7 +2,6 @@ import PropTypes from "prop-types"; import { Component } from "react"; -import { connect } from "react-redux"; import _ from "underscore"; import LoadingAndErrorWrapper from "metabase/components/LoadingAndErrorWrapper"; @@ -13,6 +12,7 @@ import { cleanPulse, createChannel, } from "metabase/lib/pulse"; +import { connect } from "metabase/lib/redux"; import { cancelEditingPulse, fetchPulseFormInput, diff --git a/frontend/src/metabase/status/containers/DatabaseStatus/DatabaseStatus.tsx b/frontend/src/metabase/status/containers/DatabaseStatus/DatabaseStatus.tsx index 5c6cc434986a6826cf9ebaed21612b0203bbc64f..9f97af717fbc3190eca6bc81d5107f8506ad89b6 100644 --- a/frontend/src/metabase/status/containers/DatabaseStatus/DatabaseStatus.tsx +++ b/frontend/src/metabase/status/containers/DatabaseStatus/DatabaseStatus.tsx @@ -1,7 +1,7 @@ -import { connect } from "react-redux"; import _ from "underscore"; import Databases from "metabase/entities/databases"; +import { connect } from "metabase/lib/redux"; import { isSyncInProgress } from "metabase/lib/syncing"; import { getUser } from "metabase/selectors/user"; import type Database from "metabase-lib/v1/metadata/Database"; diff --git a/frontend/src/metabase/timelines/collections/containers/DeleteEventModal/DeleteEventModal.tsx b/frontend/src/metabase/timelines/collections/containers/DeleteEventModal/DeleteEventModal.tsx index 7daf64e32c4990d858594f5bc584611dc432f4e3..34511976ea576bbb8960319ace5cc7f980691408 100644 --- a/frontend/src/metabase/timelines/collections/containers/DeleteEventModal/DeleteEventModal.tsx +++ b/frontend/src/metabase/timelines/collections/containers/DeleteEventModal/DeleteEventModal.tsx @@ -1,9 +1,9 @@ -import { connect } from "react-redux"; import { goBack, push } from "react-router-redux"; import _ from "underscore"; import TimelineEvents from "metabase/entities/timeline-events"; import Timelines from "metabase/entities/timelines"; +import { connect } from "metabase/lib/redux"; import * as Urls from "metabase/lib/urls"; import DeleteEventModal from "metabase/timelines/common/components/DeleteEventModal"; import type { Timeline, TimelineEvent } from "metabase-types/api"; diff --git a/frontend/src/metabase/timelines/collections/containers/DeleteTimelineModal/DeleteTimelineModal.tsx b/frontend/src/metabase/timelines/collections/containers/DeleteTimelineModal/DeleteTimelineModal.tsx index 012dbde6ee970d8e17132e869c615fd95401a12f..9215b6c4767df15cbd28a2858d8fa18267360bbb 100644 --- a/frontend/src/metabase/timelines/collections/containers/DeleteTimelineModal/DeleteTimelineModal.tsx +++ b/frontend/src/metabase/timelines/collections/containers/DeleteTimelineModal/DeleteTimelineModal.tsx @@ -1,8 +1,8 @@ -import { connect } from "react-redux"; import { goBack, push } from "react-router-redux"; import _ from "underscore"; import Timelines from "metabase/entities/timelines"; +import { connect } from "metabase/lib/redux"; import * as Urls from "metabase/lib/urls"; import DeleteTimelineModal from "metabase/timelines/common/components/DeleteTimelineModal"; import type { Timeline } from "metabase-types/api"; diff --git a/frontend/src/metabase/timelines/collections/containers/EditEventModal/EditEventModal.tsx b/frontend/src/metabase/timelines/collections/containers/EditEventModal/EditEventModal.tsx index 75d7abd1b2b58a44f8e39266fd4ca9a75f119811..384977289094356cd0cd4063c37b1b335e8125a6 100644 --- a/frontend/src/metabase/timelines/collections/containers/EditEventModal/EditEventModal.tsx +++ b/frontend/src/metabase/timelines/collections/containers/EditEventModal/EditEventModal.tsx @@ -1,9 +1,9 @@ -import { connect } from "react-redux"; import { goBack, push } from "react-router-redux"; import _ from "underscore"; import TimelineEvents from "metabase/entities/timeline-events"; import Timelines from "metabase/entities/timelines"; +import { connect } from "metabase/lib/redux"; import * as Urls from "metabase/lib/urls"; import EditEventModal from "metabase/timelines/common/components/EditEventModal"; import type { Timeline, TimelineEvent } from "metabase-types/api"; diff --git a/frontend/src/metabase/timelines/collections/containers/EditTimelineModal/EditTimelineModal.tsx b/frontend/src/metabase/timelines/collections/containers/EditTimelineModal/EditTimelineModal.tsx index 25e10d66349bc7e13a96bbe1284a14bb1ffce64d..117d600931269185868f53fbe4b6362d3751ea6d 100644 --- a/frontend/src/metabase/timelines/collections/containers/EditTimelineModal/EditTimelineModal.tsx +++ b/frontend/src/metabase/timelines/collections/containers/EditTimelineModal/EditTimelineModal.tsx @@ -1,8 +1,8 @@ -import { connect } from "react-redux"; import { goBack, push } from "react-router-redux"; import _ from "underscore"; import Timelines from "metabase/entities/timelines"; +import { connect } from "metabase/lib/redux"; import * as Urls from "metabase/lib/urls"; import EditTimelineModal from "metabase/timelines/common/components/EditTimelineModal"; import type { Timeline } from "metabase-types/api"; diff --git a/frontend/src/metabase/timelines/collections/containers/MoveEventModal/MoveEventModal.tsx b/frontend/src/metabase/timelines/collections/containers/MoveEventModal/MoveEventModal.tsx index d4059f89ac665437f5451b297b93faeb81507d12..2bdc8d748eccb695cc0acc1e3007114409738785 100644 --- a/frontend/src/metabase/timelines/collections/containers/MoveEventModal/MoveEventModal.tsx +++ b/frontend/src/metabase/timelines/collections/containers/MoveEventModal/MoveEventModal.tsx @@ -1,10 +1,10 @@ -import { connect } from "react-redux"; import { goBack, push } from "react-router-redux"; import _ from "underscore"; import Collections from "metabase/entities/collections"; import TimelineEvents from "metabase/entities/timeline-events"; import Timelines from "metabase/entities/timelines"; +import { connect } from "metabase/lib/redux"; import * as Urls from "metabase/lib/urls"; import MoveEventModal from "metabase/timelines/common/components/MoveEventModal"; import type { Timeline, TimelineEvent } from "metabase-types/api"; diff --git a/frontend/src/metabase/timelines/collections/containers/MoveTimelineModal/MoveTimelineModal.tsx b/frontend/src/metabase/timelines/collections/containers/MoveTimelineModal/MoveTimelineModal.tsx index 5338b38157b7681b56407951455fec4a98b6d454..d3f7ff5329fa8b0512a5e0de2867333b16653c3c 100644 --- a/frontend/src/metabase/timelines/collections/containers/MoveTimelineModal/MoveTimelineModal.tsx +++ b/frontend/src/metabase/timelines/collections/containers/MoveTimelineModal/MoveTimelineModal.tsx @@ -1,8 +1,8 @@ -import { connect } from "react-redux"; import { goBack } from "react-router-redux"; import _ from "underscore"; import Timelines from "metabase/entities/timelines"; +import { connect } from "metabase/lib/redux"; import * as Urls from "metabase/lib/urls"; import MoveTimelineModal from "metabase/timelines/common/components/MoveTimelineModal"; import type { Timeline } from "metabase-types/api"; diff --git a/frontend/src/metabase/timelines/collections/containers/NewEventModal/NewEventModal.tsx b/frontend/src/metabase/timelines/collections/containers/NewEventModal/NewEventModal.tsx index fb67f1ef7ac1827ee24cc20c1c9f53e030c16777..a43d8cdea113ca34f859839c859e680762cd6830 100644 --- a/frontend/src/metabase/timelines/collections/containers/NewEventModal/NewEventModal.tsx +++ b/frontend/src/metabase/timelines/collections/containers/NewEventModal/NewEventModal.tsx @@ -1,9 +1,9 @@ -import { connect } from "react-redux"; import { goBack, push } from "react-router-redux"; import _ from "underscore"; import TimelineEvents from "metabase/entities/timeline-events"; import Timelines from "metabase/entities/timelines"; +import { connect } from "metabase/lib/redux"; import * as Urls from "metabase/lib/urls"; import NewEventModal from "metabase/timelines/common/components/NewEventModal"; import type { Collection, Timeline, TimelineEvent } from "metabase-types/api"; diff --git a/frontend/src/metabase/timelines/collections/containers/NewEventWithTimelineModal/NewEventWithTimelineModal.tsx b/frontend/src/metabase/timelines/collections/containers/NewEventWithTimelineModal/NewEventWithTimelineModal.tsx index 7d0ee9f67a7fd00c96ed1527aef77d349e98bb6f..62d258803372758a4b5bd85de57ce11b84f67c2e 100644 --- a/frontend/src/metabase/timelines/collections/containers/NewEventWithTimelineModal/NewEventWithTimelineModal.tsx +++ b/frontend/src/metabase/timelines/collections/containers/NewEventWithTimelineModal/NewEventWithTimelineModal.tsx @@ -1,9 +1,9 @@ -import { connect } from "react-redux"; import { goBack, push } from "react-router-redux"; import _ from "underscore"; import Collections from "metabase/entities/collections"; import Timelines from "metabase/entities/timelines"; +import { connect } from "metabase/lib/redux"; import * as Urls from "metabase/lib/urls"; import NewEventModal from "metabase/timelines/common/components/NewEventModal"; import type { Collection, TimelineEvent } from "metabase-types/api"; diff --git a/frontend/src/metabase/timelines/collections/containers/NewTimelineModal/NewTimelineModal.tsx b/frontend/src/metabase/timelines/collections/containers/NewTimelineModal/NewTimelineModal.tsx index 8084a6d844a761fb8bf8193e550cfec8bafc22d0..ab81754706fa78c5ccbca2855db085b87ffc2bbb 100644 --- a/frontend/src/metabase/timelines/collections/containers/NewTimelineModal/NewTimelineModal.tsx +++ b/frontend/src/metabase/timelines/collections/containers/NewTimelineModal/NewTimelineModal.tsx @@ -1,9 +1,9 @@ -import { connect } from "react-redux"; import { goBack, push } from "react-router-redux"; import _ from "underscore"; import Collections from "metabase/entities/collections"; import Timelines from "metabase/entities/timelines"; +import { connect } from "metabase/lib/redux"; import * as Urls from "metabase/lib/urls"; import NewTimelineModal from "metabase/timelines/common/components/NewTimelineModal"; import type { Timeline } from "metabase-types/api"; diff --git a/frontend/src/metabase/timelines/collections/containers/TimelineArchiveModal/TimelineArchiveModal.tsx b/frontend/src/metabase/timelines/collections/containers/TimelineArchiveModal/TimelineArchiveModal.tsx index 0ea891ce8519bf266181805ec48101f7c6dc65c1..df37d3effb5c4655c04aeecd8bda86962971e7fc 100644 --- a/frontend/src/metabase/timelines/collections/containers/TimelineArchiveModal/TimelineArchiveModal.tsx +++ b/frontend/src/metabase/timelines/collections/containers/TimelineArchiveModal/TimelineArchiveModal.tsx @@ -1,9 +1,9 @@ -import { connect } from "react-redux"; import { push } from "react-router-redux"; import _ from "underscore"; import TimelineEvents from "metabase/entities/timeline-events"; import Timelines from "metabase/entities/timelines"; +import { connect } from "metabase/lib/redux"; import * as Urls from "metabase/lib/urls"; import type { Timeline, TimelineEvent } from "metabase-types/api"; import type { State } from "metabase-types/store"; diff --git a/frontend/src/metabase/timelines/collections/containers/TimelineDetailsModal/TimelineDetailsModal.tsx b/frontend/src/metabase/timelines/collections/containers/TimelineDetailsModal/TimelineDetailsModal.tsx index 3d74da52a103f1749f878933bcaf31ae15ccc960..8b600ffb67070a801659eeef7bf87294f1792bfc 100644 --- a/frontend/src/metabase/timelines/collections/containers/TimelineDetailsModal/TimelineDetailsModal.tsx +++ b/frontend/src/metabase/timelines/collections/containers/TimelineDetailsModal/TimelineDetailsModal.tsx @@ -1,9 +1,9 @@ -import { connect } from "react-redux"; import { push } from "react-router-redux"; import _ from "underscore"; import TimelineEvents from "metabase/entities/timeline-events"; import Timelines from "metabase/entities/timelines"; +import { connect } from "metabase/lib/redux"; import * as Urls from "metabase/lib/urls"; import type { Timeline, TimelineEvent } from "metabase-types/api"; import type { State } from "metabase-types/store"; diff --git a/frontend/src/metabase/timelines/collections/containers/TimelineListArchiveModal/TimelineListArchiveModal.tsx b/frontend/src/metabase/timelines/collections/containers/TimelineListArchiveModal/TimelineListArchiveModal.tsx index 8efd721d3273acfa945764a32846e20fb2c3e34f..673ac3c7289cad7f9c14124859bd6c674333bce6 100644 --- a/frontend/src/metabase/timelines/collections/containers/TimelineListArchiveModal/TimelineListArchiveModal.tsx +++ b/frontend/src/metabase/timelines/collections/containers/TimelineListArchiveModal/TimelineListArchiveModal.tsx @@ -1,9 +1,9 @@ -import { connect } from "react-redux"; import { push } from "react-router-redux"; import _ from "underscore"; import Collections from "metabase/entities/collections"; import Timelines from "metabase/entities/timelines"; +import { connect } from "metabase/lib/redux"; import * as Urls from "metabase/lib/urls"; import type { Collection, TimelineEvent } from "metabase-types/api"; import type { State } from "metabase-types/store"; diff --git a/frontend/src/metabase/timelines/common/containers/EventForm/EventForm.tsx b/frontend/src/metabase/timelines/common/containers/EventForm/EventForm.tsx index eddd58ff663c762afd2c224ebc659b17a04d2ff5..5740655f85ab7d4260da71d428b73e652ae50e69 100644 --- a/frontend/src/metabase/timelines/common/containers/EventForm/EventForm.tsx +++ b/frontend/src/metabase/timelines/common/containers/EventForm/EventForm.tsx @@ -1,5 +1,4 @@ -import { connect } from "react-redux"; - +import { connect } from "metabase/lib/redux"; import { getSetting } from "metabase/selectors/settings"; import type { State } from "metabase-types/store"; diff --git a/frontend/src/metabase/timelines/questions/containers/EditEventModal/EditEventModal.tsx b/frontend/src/metabase/timelines/questions/containers/EditEventModal/EditEventModal.tsx index d0e8180a68441b16db42b4476e6aba9df9d86ea6..1197c9df9ffd10e4f0e026b0908ae322db335826 100644 --- a/frontend/src/metabase/timelines/questions/containers/EditEventModal/EditEventModal.tsx +++ b/frontend/src/metabase/timelines/questions/containers/EditEventModal/EditEventModal.tsx @@ -1,8 +1,8 @@ -import { connect } from "react-redux"; import { t } from "ttag"; import _ from "underscore"; import TimelineEvents from "metabase/entities/timeline-events"; +import { connect } from "metabase/lib/redux"; import { addUndo } from "metabase/redux/undo"; import EditEventModal from "metabase/timelines/common/components/EditEventModal"; import type { TimelineEvent } from "metabase-types/api"; diff --git a/frontend/src/metabase/timelines/questions/containers/MoveEventModal/MoveEventModal.tsx b/frontend/src/metabase/timelines/questions/containers/MoveEventModal/MoveEventModal.tsx index 235b05717efcb2f13a9f9d026435e6990c718631..3c962d9049098d0f267bb89e5f7cd73ebe5d6963 100644 --- a/frontend/src/metabase/timelines/questions/containers/MoveEventModal/MoveEventModal.tsx +++ b/frontend/src/metabase/timelines/questions/containers/MoveEventModal/MoveEventModal.tsx @@ -1,9 +1,9 @@ -import { connect } from "react-redux"; import _ from "underscore"; import Collections, { ROOT_COLLECTION } from "metabase/entities/collections"; import TimelineEvents from "metabase/entities/timeline-events"; import Timelines from "metabase/entities/timelines"; +import { connect } from "metabase/lib/redux"; import MoveEventModal from "metabase/timelines/common/components/MoveEventModal"; import type { Timeline, TimelineEvent } from "metabase-types/api"; import type { State } from "metabase-types/store"; diff --git a/frontend/src/metabase/timelines/questions/containers/NewEventModal/NewEventModal.tsx b/frontend/src/metabase/timelines/questions/containers/NewEventModal/NewEventModal.tsx index dcf8d1ad8f78ff367f2420ce9898e2e36aca3714..dcb36f53583ef93371c82cd975ee4212f4061deb 100644 --- a/frontend/src/metabase/timelines/questions/containers/NewEventModal/NewEventModal.tsx +++ b/frontend/src/metabase/timelines/questions/containers/NewEventModal/NewEventModal.tsx @@ -1,10 +1,10 @@ -import { connect } from "react-redux"; import { t } from "ttag"; import _ from "underscore"; import Collections, { ROOT_COLLECTION } from "metabase/entities/collections"; import TimelineEvents from "metabase/entities/timeline-events"; import Timelines from "metabase/entities/timelines"; +import { connect } from "metabase/lib/redux"; import { addUndo } from "metabase/redux/undo"; import NewEventModal from "metabase/timelines/common/components/NewEventModal"; import type { Collection, TimelineEvent } from "metabase-types/api"; diff --git a/frontend/src/metabase/timelines/questions/containers/TimelinePanel/TimelinePanel.tsx b/frontend/src/metabase/timelines/questions/containers/TimelinePanel/TimelinePanel.tsx index 9ab97692b761934083826b29e9546d2133939378..240e1b75907bd92ab68e0cfb980c72104599b595 100644 --- a/frontend/src/metabase/timelines/questions/containers/TimelinePanel/TimelinePanel.tsx +++ b/frontend/src/metabase/timelines/questions/containers/TimelinePanel/TimelinePanel.tsx @@ -1,8 +1,8 @@ -import { connect } from "react-redux"; import _ from "underscore"; import Collections, { ROOT_COLLECTION } from "metabase/entities/collections"; import TimelineEvents from "metabase/entities/timeline-events"; +import { connect } from "metabase/lib/redux"; import type { TimelineEvent } from "metabase-types/api"; import type { State } from "metabase-types/store"; diff --git a/frontend/src/metabase/visualizations/components/ChoroplethMap.jsx b/frontend/src/metabase/visualizations/components/ChoroplethMap.jsx index 145baf4d6e9efd04b491fc5b867f4faf0086298a..7f3987dc0a36de22ff3ce2ef30e1a9e6f9eb6b3f 100644 --- a/frontend/src/metabase/visualizations/components/ChoroplethMap.jsx +++ b/frontend/src/metabase/visualizations/components/ChoroplethMap.jsx @@ -3,7 +3,6 @@ import cx from "classnames"; import Color from "color"; import * as d3 from "d3"; import { Component } from "react"; -import { connect } from "react-redux"; import ss from "simple-statistics"; import { t } from "ttag"; import _ from "underscore"; @@ -12,6 +11,7 @@ import { getMetabaseInstanceUrl } from "embedding-sdk/store/selectors"; import LoadingSpinner from "metabase/components/LoadingSpinner"; import CS from "metabase/css/core/index.css"; import { formatValue } from "metabase/lib/formatting"; +import { connect } from "metabase/lib/redux"; import MetabaseSettings from "metabase/lib/settings"; import { getIsEmbeddingSdk } from "metabase/selectors/embed"; import { MinColumnsError } from "metabase/visualizations/lib/errors"; diff --git a/frontend/src/metabase/visualizations/components/ClickActions/ClickActionsPopover.tsx b/frontend/src/metabase/visualizations/components/ClickActions/ClickActionsPopover.tsx index 15efac9bfde33a0ac1073a8456a774aa5f38a1c2..66140352df0cc69a9fea21f425a59d7bfde92c3a 100644 --- a/frontend/src/metabase/visualizations/components/ClickActions/ClickActionsPopover.tsx +++ b/frontend/src/metabase/visualizations/components/ClickActions/ClickActionsPopover.tsx @@ -1,8 +1,8 @@ import { Component } from "react"; -import { connect } from "react-redux"; import type * as tippy from "tippy.js"; import { getEventTarget } from "metabase/lib/dom"; +import { connect } from "metabase/lib/redux"; import { performAction } from "metabase/visualizations/lib/action"; import type { ClickObject, diff --git a/frontend/src/metabase/visualizations/components/ObjectDetail/ObjectDetail.tsx b/frontend/src/metabase/visualizations/components/ObjectDetail/ObjectDetail.tsx index fcbdf440798a72effb83dcb7264ac2a63dd20e55..ba12f3afbf2259f2b7d577b09b7de231ba93ff01 100644 --- a/frontend/src/metabase/visualizations/components/ObjectDetail/ObjectDetail.tsx +++ b/frontend/src/metabase/visualizations/components/ObjectDetail/ObjectDetail.tsx @@ -1,6 +1,5 @@ -import { connect } from "react-redux"; - import Tables from "metabase/entities/tables"; +import { connect } from "metabase/lib/redux"; import { closeObjectDetail, followForeignKey, diff --git a/frontend/src/metabase/visualizations/components/TableInteractive/TableInteractive.jsx b/frontend/src/metabase/visualizations/components/TableInteractive/TableInteractive.jsx index f256660b536d467727deca8619e4e080e63998f7..e2a975af8e38e6f70ce7cec7490af0ca260b0390 100644 --- a/frontend/src/metabase/visualizations/components/TableInteractive/TableInteractive.jsx +++ b/frontend/src/metabase/visualizations/components/TableInteractive/TableInteractive.jsx @@ -2,7 +2,6 @@ import cx from "classnames"; import PropTypes from "prop-types"; import { Component, createRef, forwardRef } from "react"; -import { connect } from "react-redux"; import { Grid, ScrollSync } from "react-virtualized"; import { t } from "ttag"; import _ from "underscore"; @@ -20,6 +19,7 @@ import { withMantineTheme } from "metabase/hoc/MantineTheme"; import { getScrollBarSize } from "metabase/lib/dom"; import { formatValue } from "metabase/lib/formatting"; import { renderRoot, unmountRoot } from "metabase/lib/react-compat"; +import { connect } from "metabase/lib/redux"; import { setUIControls, zoomInRow } from "metabase/query_builder/actions"; import { getIsShowingRawTable, diff --git a/frontend/src/metabase/visualizations/components/Visualization/Visualization.jsx b/frontend/src/metabase/visualizations/components/Visualization/Visualization.jsx index d0868e0cb0dfedd47a4abb032d8c879e3b2c437f..7bfab7fd96f19b9f338ff6bb0e91d14474d625a1 100644 --- a/frontend/src/metabase/visualizations/components/Visualization/Visualization.jsx +++ b/frontend/src/metabase/visualizations/components/Visualization/Visualization.jsx @@ -1,7 +1,6 @@ /* eslint-disable react/prop-types */ import cx from "classnames"; import { PureComponent } from "react"; -import { connect } from "react-redux"; import { t } from "ttag"; import _ from "underscore"; @@ -11,6 +10,7 @@ import ExplicitSize from "metabase/components/ExplicitSize"; import CS from "metabase/css/core/index.css"; import DashboardS from "metabase/css/dashboard.module.css"; import { formatNumber } from "metabase/lib/formatting"; +import { connect } from "metabase/lib/redux"; import { equals } from "metabase/lib/utils"; import { getIsShowingRawTable } from "metabase/query_builder/selectors"; import { getIsEmbeddingSdk } from "metabase/selectors/embed"; diff --git a/frontend/src/metabase/visualizations/visualizations/PivotTable/PivotTable.tsx b/frontend/src/metabase/visualizations/visualizations/PivotTable/PivotTable.tsx index 1e1d6b1ec2c0cff42caa0f1658dbfdf630af42a1..7b54b40dab4104f1222bf6cc982dceb9b32b3034 100644 --- a/frontend/src/metabase/visualizations/visualizations/PivotTable/PivotTable.tsx +++ b/frontend/src/metabase/visualizations/visualizations/PivotTable/PivotTable.tsx @@ -2,7 +2,6 @@ import cx from "classnames"; import type * as React from "react"; import { useCallback, useEffect, useMemo, useRef, useState } from "react"; import { findDOMNode } from "react-dom"; -import { connect } from "react-redux"; import { useMount, usePrevious } from "react-use"; import type { OnScrollParams } from "react-virtualized"; import { AutoSizer, Collection, Grid, ScrollSync } from "react-virtualized"; @@ -18,6 +17,7 @@ import { multiLevelPivot, } from "metabase/lib/data_grid"; import { getScrollBarSize } from "metabase/lib/dom"; +import { connect } from "metabase/lib/redux"; import { getSetting } from "metabase/selectors/settings"; import { useMantineTheme } from "metabase/ui"; import { diff --git a/frontend/test/__support__/storybook.tsx b/frontend/test/__support__/storybook.tsx index 2a11a258f56e42cbc1afa54a526f744a99e2670b..cbb27f80c190cded666ad9b92a2818700a92ff3e 100644 --- a/frontend/test/__support__/storybook.tsx +++ b/frontend/test/__support__/storybook.tsx @@ -1,8 +1,8 @@ // Storybook helpers -import { Provider } from "react-redux"; import type { MetabaseTheme } from "embedding-sdk"; import { SdkThemeProvider } from "embedding-sdk/components/private/SdkThemeProvider"; +import { MetabaseReduxProvider } from "metabase/lib/redux"; import { mainReducers } from "metabase/reducers-main"; import { StaticVisualization } from "metabase/static-viz/components/StaticVisualization"; import { createStaticRenderingContext } from "metabase/static-viz/lib/rendering-context"; @@ -22,9 +22,9 @@ export const ReduxProvider = ({ children: React.ReactNode; storeInitialState?: Record<string, any>; }) => ( - <Provider store={getStore(mainReducers, storeInitialState)}> + <MetabaseReduxProvider store={getStore(mainReducers, storeInitialState)}> {children} - </Provider> + </MetabaseReduxProvider> ); export const VisualizationWrapper = ({ diff --git a/frontend/test/__support__/ui.tsx b/frontend/test/__support__/ui.tsx index 31fa8a9ffc5093723167c6414ac31b1d7b7b749a..547cb266aa6b30b5433ca44872b902ad2e7b5c96 100644 --- a/frontend/test/__support__/ui.tsx +++ b/frontend/test/__support__/ui.tsx @@ -10,7 +10,6 @@ import { KBarProvider } from "kbar"; import type * as React from "react"; import { DragDropContextProvider } from "react-dnd"; import HTML5Backend from "react-dnd-html5-backend"; -import { Provider } from "react-redux"; import { Router, useRouterHistory } from "react-router"; import { routerMiddleware, routerReducer } from "react-router-redux"; import _ from "underscore"; @@ -25,6 +24,7 @@ import { createMockSdkState } from "embedding-sdk/test/mocks/state"; import { Api } from "metabase/api"; import { UndoListing } from "metabase/containers/UndoListing"; import { baseStyle } from "metabase/css/core/base.styled"; +import { MetabaseReduxProvider } from "metabase/lib/redux"; import { mainReducers } from "metabase/reducers-main"; import { publicReducers } from "metabase/reducers-public"; import { ThemeProvider } from "metabase/ui"; @@ -141,13 +141,13 @@ export function renderWithProviders( const wrapper = (props: any) => { if (mode === "sdk") { return ( - <Provider store={store}> + <MetabaseReduxProvider store={store}> <MetabaseProviderInternal {...props} {...sdkProviderProps} store={store} /> - </Provider> + </MetabaseReduxProvider> ); } @@ -203,7 +203,7 @@ export function TestWrapper({ theme?: MantineThemeOverride; }): JSX.Element { return ( - <Provider store={store}> + <MetabaseReduxProvider store={store}> <MaybeDNDProvider hasDND={withDND}> <ThemeProvider theme={theme}> <GlobalStylesForTest /> @@ -216,7 +216,7 @@ export function TestWrapper({ {withUndos && <UndoListing />} </ThemeProvider> </MaybeDNDProvider> - </Provider> + </MetabaseReduxProvider> ); }