Path: blob/main/components/dashboard/src/contexts/ConfettiContext.tsx
2500 views
/**1* Copyright (c) 2023 Gitpod GmbH. All rights reserved.2* Licensed under the GNU Affero General Public License (AGPL).3* See License.AGPL.txt in the project root for license information.4*/56import { lazy, createContext, FC, useMemo, useState, useContext, Suspense } from "react";78const Confetti = lazy(() => import(/* webpackPrefetch: true */ "react-confetti"));910type ConfettiContextType = {11isConfettiDropping: boolean;12dropConfetti(): void;13hideConfetti(): void;14};15const ConfettiContext = createContext<ConfettiContextType>({16isConfettiDropping: false,17dropConfetti: () => undefined,18hideConfetti: () => undefined,19});2021export const ConfettiContextProvider: FC = ({ children }) => {22const [isConfettiDropping, setIsConfettiDropping] = useState(false);23const value = useMemo(() => {24return {25isConfettiDropping: isConfettiDropping,26dropConfetti: () => setIsConfettiDropping(true),27hideConfetti: () => setIsConfettiDropping(false),28};29}, [isConfettiDropping]);3031return (32<ConfettiContext.Provider value={value}>33{children}34{isConfettiDropping && (35<Suspense fallback={<></>}>36<Confetti recycle={false} numberOfPieces={300} onConfettiComplete={value.hideConfetti} />37</Suspense>38)}39</ConfettiContext.Provider>40);41};4243export const useConfetti = () => {44return useContext(ConfettiContext);45};464748