diff --git a/front/src/effect-components/PageChangeEffect.tsx b/front/src/effect-components/PageChangeEffect.tsx
index 244109a4e..f0ffd6e14 100644
--- a/front/src/effect-components/PageChangeEffect.tsx
+++ b/front/src/effect-components/PageChangeEffect.tsx
@@ -12,7 +12,7 @@ import { AppPath } from '@/types/AppPath';
import { PageHotkeyScope } from '@/types/PageHotkeyScope';
import { SettingsPath } from '@/types/SettingsPath';
import { IconCheckbox } from '@/ui/display/icon';
-import { useSnackBar } from '@/ui/feedback/snack-bar/hooks/useSnackBar';
+import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar';
import { TableHotkeyScope } from '@/ui/object/record-table/types/TableHotkeyScope';
import { useSetHotkeyScope } from '@/ui/utilities/hotkey/hooks/useSetHotkeyScope';
import { useGetWorkspaceFromInviteHashLazyQuery } from '~/generated/graphql';
diff --git a/front/src/index.tsx b/front/src/index.tsx
index 50c8202e4..4080957a6 100644
--- a/front/src/index.tsx
+++ b/front/src/index.tsx
@@ -11,7 +11,8 @@ import { ApolloMetadataClientProvider } from '@/object-metadata/components/Apoll
import { ObjectMetadataItemsProvider } from '@/object-metadata/components/ObjectMetadataItemsProvider';
import { DialogManager } from '@/ui/feedback/dialog-manager/components/DialogManager';
import { DialogManagerScope } from '@/ui/feedback/dialog-manager/scopes/DialogManagerScope';
-import { SnackBarProvider } from '@/ui/feedback/snack-bar/components/SnackBarProvider';
+import { SnackBarProvider } from '@/ui/feedback/snack-bar-manager/components/SnackBarProvider';
+import { SnackBarProviderScope } from '@/ui/feedback/snack-bar-manager/scopes/SnackBarProviderScope';
import { AppThemeProvider } from '@/ui/theme/components/AppThemeProvider';
import { ThemeType } from '@/ui/theme/constants/theme';
import { UserProvider } from '@/users/components/UserProvider';
@@ -37,20 +38,22 @@ root.render(
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/front/src/modules/auth/sign-in-up/hooks/useSignInUp.tsx b/front/src/modules/auth/sign-in-up/hooks/useSignInUp.tsx
index 70ce84b18..d3e77fbf2 100644
--- a/front/src/modules/auth/sign-in-up/hooks/useSignInUp.tsx
+++ b/front/src/modules/auth/sign-in-up/hooks/useSignInUp.tsx
@@ -9,7 +9,7 @@ import { authProvidersState } from '@/client-config/states/authProvidersState';
import { isSignInPrefilledState } from '@/client-config/states/isSignInPrefilledState';
import { AppPath } from '@/types/AppPath';
import { PageHotkeyScope } from '@/types/PageHotkeyScope';
-import { useSnackBar } from '@/ui/feedback/snack-bar/hooks/useSnackBar';
+import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar';
import { useScopedHotkeys } from '@/ui/utilities/hotkey/hooks/useScopedHotkeys';
import { useGetWorkspaceFromInviteHashQuery } from '~/generated/graphql';
import { useIsMatchingLocation } from '~/hooks/useIsMatchingLocation';
diff --git a/front/src/modules/companies/components/NewCompanyProgressButton.tsx b/front/src/modules/companies/components/NewCompanyProgressButton.tsx
index 2d69f0c2e..50fb8717a 100644
--- a/front/src/modules/companies/components/NewCompanyProgressButton.tsx
+++ b/front/src/modules/companies/components/NewCompanyProgressButton.tsx
@@ -1,6 +1,6 @@
import { useCallback, useContext, useState } from 'react';
-import { useSnackBar } from '@/ui/feedback/snack-bar/hooks/useSnackBar';
+import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar';
import { relationPickerSearchFilterScopedState } from '@/ui/input/relation-picker/states/relationPickerSearchFilterScopedState';
import { RelationPickerHotkeyScope } from '@/ui/input/relation-picker/types/RelationPickerHotkeyScope';
import { NewButton } from '@/ui/layout/board/components/NewButton';
diff --git a/front/src/modules/object-metadata/hooks/useFindManyObjectMetadataItems.ts b/front/src/modules/object-metadata/hooks/useFindManyObjectMetadataItems.ts
index a78c13c79..7622af7c7 100644
--- a/front/src/modules/object-metadata/hooks/useFindManyObjectMetadataItems.ts
+++ b/front/src/modules/object-metadata/hooks/useFindManyObjectMetadataItems.ts
@@ -3,7 +3,7 @@ import { useQuery } from '@apollo/client';
import { useRecoilCallback } from 'recoil';
import { objectMetadataItemsState } from '@/object-metadata/states/objectMetadataItemsState';
-import { useSnackBar } from '@/ui/feedback/snack-bar/hooks/useSnackBar';
+import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar';
import {
FieldFilter,
ObjectFilter,
diff --git a/front/src/modules/object-metadata/hooks/useFindManyRelationMetadataItems.ts b/front/src/modules/object-metadata/hooks/useFindManyRelationMetadataItems.ts
new file mode 100644
index 000000000..692fd13db
--- /dev/null
+++ b/front/src/modules/object-metadata/hooks/useFindManyRelationMetadataItems.ts
@@ -0,0 +1,74 @@
+import { useMemo } from 'react';
+import { useQuery } from '@apollo/client';
+
+import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar';
+import {
+ ObjectFilter,
+ ObjectMetadataItemsQuery,
+ ObjectMetadataItemsQueryVariables,
+} from '~/generated-metadata/graphql';
+import { logError } from '~/utils/logError';
+
+import { FIND_MANY_METADATA_OBJECTS } from '../graphql/queries';
+import { mapPaginatedObjectMetadataItemsToObjectMetadataItems } from '../utils/mapPaginatedObjectMetadataItemsToObjectMetadataItems';
+
+import { useApolloMetadataClient } from './useApolloMetadataClient';
+
+// TODO: test fetchMore
+export const useFindManyObjectMetadataItems = ({
+ skip,
+ filter,
+}: { skip?: boolean; filter?: ObjectFilter } = {}) => {
+ const apolloMetadataClient = useApolloMetadataClient();
+
+ const { enqueueSnackBar } = useSnackBar();
+
+ const {
+ data,
+ fetchMore: fetchMoreInternal,
+ loading,
+ error,
+ } = useQuery(
+ FIND_MANY_METADATA_OBJECTS,
+ {
+ variables: {
+ objectFilter: filter,
+ },
+ client: apolloMetadataClient ?? undefined,
+ skip: skip || !apolloMetadataClient,
+ onError: (error) => {
+ logError('useFindManyObjectMetadataItems error : ' + error);
+ enqueueSnackBar(
+ `Error during useFindManyObjectMetadataItems, ${error.message}`,
+ {
+ variant: 'error',
+ },
+ );
+ },
+ onCompleted: () => {},
+ },
+ );
+
+ const hasMore = data?.objects?.pageInfo?.hasNextPage;
+
+ const fetchMore = () =>
+ fetchMoreInternal({
+ variables: {
+ afterCursor: data?.objects?.pageInfo?.endCursor,
+ },
+ });
+
+ const objectMetadataItems = useMemo(() => {
+ return mapPaginatedObjectMetadataItemsToObjectMetadataItems({
+ pagedObjectMetadataItems: data,
+ });
+ }, [data]);
+
+ return {
+ objectMetadataItems,
+ hasMore,
+ fetchMore,
+ loading,
+ error,
+ };
+};
diff --git a/front/src/modules/object-record/hooks/useFindManyObjectRecords.ts b/front/src/modules/object-record/hooks/useFindManyObjectRecords.ts
index ee94ba5e5..276c883e7 100644
--- a/front/src/modules/object-record/hooks/useFindManyObjectRecords.ts
+++ b/front/src/modules/object-record/hooks/useFindManyObjectRecords.ts
@@ -6,7 +6,7 @@ import { useRecoilState } from 'recoil';
import { useObjectMetadataItem } from '@/object-metadata/hooks/useObjectMetadataItem';
import { ObjectMetadataItemIdentifier } from '@/object-metadata/types/ObjectMetadataItemIdentifier';
-import { useSnackBar } from '@/ui/feedback/snack-bar/hooks/useSnackBar';
+import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar';
import { logError } from '~/utils/logError';
import { capitalize } from '~/utils/string/capitalize';
diff --git a/front/src/modules/pipeline/components/PipelineAddButton.tsx b/front/src/modules/pipeline/components/PipelineAddButton.tsx
index 4334230b6..4a0697ece 100644
--- a/front/src/modules/pipeline/components/PipelineAddButton.tsx
+++ b/front/src/modules/pipeline/components/PipelineAddButton.tsx
@@ -1,7 +1,7 @@
import { CompanyProgressPicker } from '@/companies/components/CompanyProgressPicker';
import { PageHotkeyScope } from '@/types/PageHotkeyScope';
import { IconPlus } from '@/ui/display/icon/index';
-import { useSnackBar } from '@/ui/feedback/snack-bar/hooks/useSnackBar';
+import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar';
import { IconButton } from '@/ui/input/button/components/IconButton';
import { EntityForSelect } from '@/ui/input/relation-picker/types/EntityForSelect';
import { RelationPickerHotkeyScope } from '@/ui/input/relation-picker/types/RelationPickerHotkeyScope';
diff --git a/front/src/modules/settings/developers/components/ApiKeyInput.tsx b/front/src/modules/settings/developers/components/ApiKeyInput.tsx
index e727c055b..3969992d7 100644
--- a/front/src/modules/settings/developers/components/ApiKeyInput.tsx
+++ b/front/src/modules/settings/developers/components/ApiKeyInput.tsx
@@ -2,7 +2,7 @@ import { useTheme } from '@emotion/react';
import styled from '@emotion/styled';
import { IconCopy } from '@/ui/display/icon';
-import { useSnackBar } from '@/ui/feedback/snack-bar/hooks/useSnackBar';
+import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar';
import { Button } from '@/ui/input/button/components/Button';
import { TextInput } from '@/ui/input/components/TextInput';
diff --git a/front/src/modules/settings/profile/components/ToggleField.tsx b/front/src/modules/settings/profile/components/ToggleField.tsx
index 7188b615a..8f0813978 100644
--- a/front/src/modules/settings/profile/components/ToggleField.tsx
+++ b/front/src/modules/settings/profile/components/ToggleField.tsx
@@ -2,7 +2,7 @@ import { useRecoilState } from 'recoil';
import { currentWorkspaceMemberState } from '@/auth/states/currentWorkspaceMemberState';
import { useUpdateOneObjectRecord } from '@/object-record/hooks/useUpdateOneObjectRecord';
-import { useSnackBar } from '@/ui/feedback/snack-bar/hooks/useSnackBar';
+import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar';
import { Toggle } from '@/ui/input/components/Toggle';
export const ToggleField = () => {
diff --git a/front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/MatchColumnsStep.tsx b/front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/MatchColumnsStep.tsx
index 55f962f08..8bd9a0538 100644
--- a/front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/MatchColumnsStep.tsx
+++ b/front/src/modules/spreadsheet-import/steps/components/MatchColumnsStep/MatchColumnsStep.tsx
@@ -12,7 +12,7 @@ import { setColumn } from '@/spreadsheet-import/utils/setColumn';
import { setIgnoreColumn } from '@/spreadsheet-import/utils/setIgnoreColumn';
import { setSubColumn } from '@/spreadsheet-import/utils/setSubColumn';
import { useDialogManager } from '@/ui/feedback/dialog-manager/hooks/useDialogManager';
-import { useSnackBar } from '@/ui/feedback/snack-bar/hooks/useSnackBar';
+import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar';
import { Modal } from '@/ui/layout/modal/components/Modal';
import { ColumnGrid } from './components/ColumnGrid';
diff --git a/front/src/modules/spreadsheet-import/steps/components/UploadFlow.tsx b/front/src/modules/spreadsheet-import/steps/components/UploadFlow.tsx
index a627c14da..e9bd1f8fd 100644
--- a/front/src/modules/spreadsheet-import/steps/components/UploadFlow.tsx
+++ b/front/src/modules/spreadsheet-import/steps/components/UploadFlow.tsx
@@ -8,7 +8,7 @@ import { RawData } from '@/spreadsheet-import/types';
import { exceedsMaxRecords } from '@/spreadsheet-import/utils/exceedsMaxRecords';
import { mapWorkbook } from '@/spreadsheet-import/utils/mapWorkbook';
import { CircularProgressBar } from '@/ui/feedback/progress-bar/components/CircularProgressBar';
-import { useSnackBar } from '@/ui/feedback/snack-bar/hooks/useSnackBar';
+import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar';
import { Modal } from '@/ui/layout/modal/components/Modal';
import { MatchColumnsStep } from './MatchColumnsStep/MatchColumnsStep';
diff --git a/front/src/modules/spreadsheet-import/steps/components/UploadStep/components/DropZone.tsx b/front/src/modules/spreadsheet-import/steps/components/UploadStep/components/DropZone.tsx
index aa0811471..ab0bf6069 100644
--- a/front/src/modules/spreadsheet-import/steps/components/UploadStep/components/DropZone.tsx
+++ b/front/src/modules/spreadsheet-import/steps/components/UploadStep/components/DropZone.tsx
@@ -5,7 +5,7 @@ import * as XLSX from 'xlsx-ugnis';
import { useSpreadsheetImportInternal } from '@/spreadsheet-import/hooks/useSpreadsheetImportInternal';
import { readFileAsync } from '@/spreadsheet-import/utils/readFilesAsync';
-import { useSnackBar } from '@/ui/feedback/snack-bar/hooks/useSnackBar';
+import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar';
import { MainButton } from '@/ui/input/button/components/MainButton';
const StyledContainer = styled.div`
diff --git a/front/src/modules/ui/feedback/snack-bar/components/SnackBar.tsx b/front/src/modules/ui/feedback/snack-bar-manager/components/SnackBar.tsx
similarity index 100%
rename from front/src/modules/ui/feedback/snack-bar/components/SnackBar.tsx
rename to front/src/modules/ui/feedback/snack-bar-manager/components/SnackBar.tsx
diff --git a/front/src/modules/ui/feedback/snack-bar/components/SnackBarProvider.tsx b/front/src/modules/ui/feedback/snack-bar-manager/components/SnackBarProvider.tsx
similarity index 79%
rename from front/src/modules/ui/feedback/snack-bar/components/SnackBarProvider.tsx
rename to front/src/modules/ui/feedback/snack-bar-manager/components/SnackBarProvider.tsx
index 69764ab0f..9e7e769e9 100644
--- a/front/src/modules/ui/feedback/snack-bar/components/SnackBarProvider.tsx
+++ b/front/src/modules/ui/feedback/snack-bar-manager/components/SnackBarProvider.tsx
@@ -1,11 +1,10 @@
import styled from '@emotion/styled';
import { motion, useReducedMotion } from 'framer-motion';
-import { useRecoilState } from 'recoil';
-import { snackBarInternalState } from '../states/snackBarState';
+import { useSnackBarManagerScopedStates } from '@/ui/feedback/snack-bar-manager/hooks/internal/useSnackBarManagerScopedStates';
+import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar';
import { SnackBar } from './SnackBar';
-
const StyledSnackBarContainer = styled.div`
display: flex;
flex-direction: column;
@@ -53,17 +52,8 @@ const reducedVariants = {
export const SnackBarProvider = ({ children }: React.PropsWithChildren) => {
const reducedMotion = useReducedMotion();
- const [snackBarInternal, setSnackBarInternal] = useRecoilState(
- snackBarInternalState,
- );
-
- // Handle snackbar close event
- const handleSnackBarClose = (id: string) => {
- setSnackBarInternal((prevState) => ({
- ...prevState,
- queue: prevState.queue.filter((snackBar) => snackBar.id !== id),
- }));
- };
+ const { snackBarInternal } = useSnackBarManagerScopedStates();
+ const { handleSnackBarClose } = useSnackBar();
return (
<>
diff --git a/front/src/modules/ui/feedback/snack-bar-manager/hooks/internal/useSnackBarManagerScopedStates.ts b/front/src/modules/ui/feedback/snack-bar-manager/hooks/internal/useSnackBarManagerScopedStates.ts
new file mode 100644
index 000000000..ae58104cc
--- /dev/null
+++ b/front/src/modules/ui/feedback/snack-bar-manager/hooks/internal/useSnackBarManagerScopedStates.ts
@@ -0,0 +1,24 @@
+import { SnackBarManagerScopeInternalContext } from '@/ui/feedback/snack-bar-manager/scopes/scope-internal-context/SnackBarManagerScopeInternalContext';
+import { snackBarInternalScopedState } from '@/ui/feedback/snack-bar-manager/states/snackBarInternalScopedState';
+import { useRecoilScopedStateV2 } from '@/ui/utilities/recoil-scope/hooks/useRecoilScopedStateV2';
+import { useAvailableScopeIdOrThrow } from '@/ui/utilities/recoil-scope/scopes-internal/hooks/useAvailableScopeId';
+
+type useSnackBarManagerScopedStatesProps = {
+ snackBarManagerScopeId?: string;
+};
+
+export const useSnackBarManagerScopedStates = (
+ props?: useSnackBarManagerScopedStatesProps,
+) => {
+ const scopeId = useAvailableScopeIdOrThrow(
+ SnackBarManagerScopeInternalContext,
+ props?.snackBarManagerScopeId,
+ );
+
+ const [snackBarInternal, setSnackBarInternal] = useRecoilScopedStateV2(
+ snackBarInternalScopedState,
+ scopeId,
+ );
+
+ return { snackBarInternal, setSnackBarInternal };
+};
diff --git a/front/src/modules/ui/feedback/snack-bar/hooks/usePausableTimeout.ts b/front/src/modules/ui/feedback/snack-bar-manager/hooks/usePausableTimeout.ts
similarity index 100%
rename from front/src/modules/ui/feedback/snack-bar/hooks/usePausableTimeout.ts
rename to front/src/modules/ui/feedback/snack-bar-manager/hooks/usePausableTimeout.ts
diff --git a/front/src/modules/ui/feedback/snack-bar-manager/hooks/useSnackBar.tsx b/front/src/modules/ui/feedback/snack-bar-manager/hooks/useSnackBar.tsx
new file mode 100644
index 000000000..39002ca54
--- /dev/null
+++ b/front/src/modules/ui/feedback/snack-bar-manager/hooks/useSnackBar.tsx
@@ -0,0 +1,53 @@
+import { useRecoilCallback } from 'recoil';
+import { v4 as uuidv4 } from 'uuid';
+
+import { SnackBarManagerScopeInternalContext } from '@/ui/feedback/snack-bar-manager/scopes/scope-internal-context/SnackBarManagerScopeInternalContext';
+import {
+ snackBarInternalScopedState,
+ SnackBarOptions,
+} from '@/ui/feedback/snack-bar-manager/states/snackBarInternalScopedState';
+import { useAvailableScopeIdOrThrow } from '@/ui/utilities/recoil-scope/scopes-internal/hooks/useAvailableScopeId';
+
+export const useSnackBar = () => {
+ const scopeId = useAvailableScopeIdOrThrow(
+ SnackBarManagerScopeInternalContext,
+ );
+
+ const handleSnackBarClose = useRecoilCallback(({ set }) => (id: string) => {
+ set(snackBarInternalScopedState({ scopeId }), (prevState) => ({
+ ...prevState,
+ queue: prevState.queue.filter((snackBar) => snackBar.id !== id),
+ }));
+ });
+
+ const setSnackBarQueue = useRecoilCallback(
+ ({ set }) =>
+ (newValue) =>
+ set(snackBarInternalScopedState({ scopeId }), (prev) => {
+ if (prev.queue.length >= prev.maxQueue) {
+ return {
+ ...prev,
+ queue: [...prev.queue.slice(1), newValue] as SnackBarOptions[],
+ };
+ }
+
+ return {
+ ...prev,
+ queue: [...prev.queue, newValue] as SnackBarOptions[],
+ };
+ }),
+ );
+
+ const enqueueSnackBar = (
+ message: string,
+ options?: Omit,
+ ) => {
+ setSnackBarQueue({
+ id: uuidv4(),
+ message,
+ ...options,
+ });
+ };
+
+ return { handleSnackBarClose, enqueueSnackBar };
+};
diff --git a/front/src/modules/ui/feedback/snack-bar-manager/scopes/SnackBarProviderScope.tsx b/front/src/modules/ui/feedback/snack-bar-manager/scopes/SnackBarProviderScope.tsx
new file mode 100644
index 000000000..a2bb6a9e1
--- /dev/null
+++ b/front/src/modules/ui/feedback/snack-bar-manager/scopes/SnackBarProviderScope.tsx
@@ -0,0 +1,23 @@
+import { ReactNode } from 'react';
+
+import { SnackBarManagerScopeInternalContext } from './scope-internal-context/SnackBarManagerScopeInternalContext';
+
+type SnackBarProviderScopeProps = {
+ children: ReactNode;
+ snackBarManagerScopeId: string;
+};
+
+export const SnackBarProviderScope = ({
+ children,
+ snackBarManagerScopeId,
+}: SnackBarProviderScopeProps) => {
+ return (
+
+ {children}
+
+ );
+};
diff --git a/front/src/modules/ui/feedback/snack-bar-manager/scopes/scope-internal-context/SnackBarManagerScopeInternalContext.ts b/front/src/modules/ui/feedback/snack-bar-manager/scopes/scope-internal-context/SnackBarManagerScopeInternalContext.ts
new file mode 100644
index 000000000..c7be54b38
--- /dev/null
+++ b/front/src/modules/ui/feedback/snack-bar-manager/scopes/scope-internal-context/SnackBarManagerScopeInternalContext.ts
@@ -0,0 +1,7 @@
+import { ScopedStateKey } from '@/ui/utilities/recoil-scope/scopes-internal/types/ScopedStateKey';
+import { createScopeInternalContext } from '@/ui/utilities/recoil-scope/scopes-internal/utils/createScopeInternalContext';
+
+type SnackBarManagerScopeInternalContextProps = ScopedStateKey;
+
+export const SnackBarManagerScopeInternalContext =
+ createScopeInternalContext();
diff --git a/front/src/modules/ui/feedback/snack-bar-manager/states/snackBarInternalScopedState.ts b/front/src/modules/ui/feedback/snack-bar-manager/states/snackBarInternalScopedState.ts
new file mode 100644
index 000000000..18dc03e4f
--- /dev/null
+++ b/front/src/modules/ui/feedback/snack-bar-manager/states/snackBarInternalScopedState.ts
@@ -0,0 +1,20 @@
+import { createScopedState } from '@/ui/utilities/recoil-scope/utils/createScopedState';
+
+import { SnackBarProps } from '../components/SnackBar';
+
+export type SnackBarOptions = SnackBarProps & {
+ id: string;
+};
+
+type SnackBarState = {
+ maxQueue: number;
+ queue: SnackBarOptions[];
+};
+
+export const snackBarInternalScopedState = createScopedState({
+ key: 'snackBarState',
+ defaultValue: {
+ maxQueue: 3,
+ queue: [],
+ },
+});
diff --git a/front/src/modules/ui/feedback/snack-bar/hooks/useSnackBar.ts b/front/src/modules/ui/feedback/snack-bar/hooks/useSnackBar.ts
deleted file mode 100644
index 4c5df2349..000000000
--- a/front/src/modules/ui/feedback/snack-bar/hooks/useSnackBar.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import { useSetRecoilState } from 'recoil';
-import { v4 as uuidv4 } from 'uuid';
-
-import {
- SnackBarOptions,
- snackBarSetQueueState,
-} from '../states/snackBarState';
-
-export const useSnackBar = () => {
- const setSnackBarQueue = useSetRecoilState(snackBarSetQueueState);
-
- const enqueueSnackBar = (
- message: string,
- options?: Omit,
- ) => {
- setSnackBarQueue({
- id: uuidv4(),
- message,
- ...options,
- });
- };
-
- return { enqueueSnackBar };
-};
diff --git a/front/src/modules/ui/feedback/snack-bar/states/snackBarState.ts b/front/src/modules/ui/feedback/snack-bar/states/snackBarState.ts
deleted file mode 100644
index e8572a86b..000000000
--- a/front/src/modules/ui/feedback/snack-bar/states/snackBarState.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-import { atom, selector } from 'recoil';
-
-import { SnackBarProps } from '../components/SnackBar';
-
-export type SnackBarOptions = SnackBarProps & {
- id: string;
-};
-
-type SnackBarState = {
- maxQueue: number;
- queue: SnackBarOptions[];
-};
-
-export const snackBarInternalState = atom({
- key: 'snackBarState',
- default: {
- maxQueue: 3,
- queue: [],
- },
-});
-
-// TODO: use a recoil callback
-export const snackBarSetQueueState = selector({
- key: 'snackBarQueueState',
- get: ({ get: _get }) => null, // We don't care about getting the value
- set: ({ set }, newValue) =>
- set(snackBarInternalState, (prev) => {
- if (prev.queue.length >= prev.maxQueue) {
- return {
- ...prev,
- queue: [...prev.queue.slice(1), newValue] as SnackBarOptions[],
- };
- }
-
- return {
- ...prev,
- queue: [...prev.queue, newValue] as SnackBarOptions[],
- };
- }),
-});
diff --git a/front/src/modules/ui/layout/board/components/BoardColumnMenu.tsx b/front/src/modules/ui/layout/board/components/BoardColumnMenu.tsx
index 04d5de599..cd71a50c0 100644
--- a/front/src/modules/ui/layout/board/components/BoardColumnMenu.tsx
+++ b/front/src/modules/ui/layout/board/components/BoardColumnMenu.tsx
@@ -8,7 +8,7 @@ import {
IconPencil,
IconPlus,
} from '@/ui/display/icon';
-import { useSnackBar } from '@/ui/feedback/snack-bar/hooks/useSnackBar';
+import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar';
import { relationPickerSearchFilterScopedState } from '@/ui/input/relation-picker/states/relationPickerSearchFilterScopedState';
import { EntityForSelect } from '@/ui/input/relation-picker/types/EntityForSelect';
import { RelationPickerHotkeyScope } from '@/ui/input/relation-picker/types/RelationPickerHotkeyScope';
diff --git a/front/src/modules/workspace/components/WorkspaceInviteLink.tsx b/front/src/modules/workspace/components/WorkspaceInviteLink.tsx
index 15d630947..0a9e53f3a 100644
--- a/front/src/modules/workspace/components/WorkspaceInviteLink.tsx
+++ b/front/src/modules/workspace/components/WorkspaceInviteLink.tsx
@@ -2,7 +2,7 @@ import { useTheme } from '@emotion/react';
import styled from '@emotion/styled';
import { IconCopy, IconLink } from '@/ui/display/icon';
-import { useSnackBar } from '@/ui/feedback/snack-bar/hooks/useSnackBar';
+import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar';
import { Button } from '@/ui/input/button/components/Button';
import { TextInput } from '@/ui/input/components/TextInput';
diff --git a/front/src/pages/auth/CreateProfile.tsx b/front/src/pages/auth/CreateProfile.tsx
index 4515e225d..163e799d5 100644
--- a/front/src/pages/auth/CreateProfile.tsx
+++ b/front/src/pages/auth/CreateProfile.tsx
@@ -16,7 +16,7 @@ import { useUpdateOneObjectRecord } from '@/object-record/hooks/useUpdateOneObje
import { ProfilePictureUploader } from '@/settings/profile/components/ProfilePictureUploader';
import { PageHotkeyScope } from '@/types/PageHotkeyScope';
import { H2Title } from '@/ui/display/typography/components/H2Title';
-import { useSnackBar } from '@/ui/feedback/snack-bar/hooks/useSnackBar';
+import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar';
import { MainButton } from '@/ui/input/button/components/MainButton';
import { TextInput } from '@/ui/input/components/TextInput';
import { useScopedHotkeys } from '@/ui/utilities/hotkey/hooks/useScopedHotkeys';
diff --git a/front/src/pages/auth/CreateWorkspace.tsx b/front/src/pages/auth/CreateWorkspace.tsx
index cd8c99ab6..e82520ff1 100644
--- a/front/src/pages/auth/CreateWorkspace.tsx
+++ b/front/src/pages/auth/CreateWorkspace.tsx
@@ -14,7 +14,7 @@ import { OnboardingStatus } from '@/auth/utils/getOnboardingStatus';
import { WorkspaceLogoUploader } from '@/settings/workspace/components/WorkspaceLogoUploader';
import { PageHotkeyScope } from '@/types/PageHotkeyScope';
import { H2Title } from '@/ui/display/typography/components/H2Title';
-import { useSnackBar } from '@/ui/feedback/snack-bar/hooks/useSnackBar';
+import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar';
import { MainButton } from '@/ui/input/button/components/MainButton';
import { TextInput } from '@/ui/input/components/TextInput';
import { useScopedHotkeys } from '@/ui/utilities/hotkey/hooks/useScopedHotkeys';