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';