Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
gitpod-io
GitHub Repository: gitpod-io/gitpod
Path: blob/main/components/dashboard/src/contexts/ConfettiContext.tsx
2500 views
1
/**
2
* Copyright (c) 2023 Gitpod GmbH. All rights reserved.
3
* Licensed under the GNU Affero General Public License (AGPL).
4
* See License.AGPL.txt in the project root for license information.
5
*/
6
7
import { lazy, createContext, FC, useMemo, useState, useContext, Suspense } from "react";
8
9
const Confetti = lazy(() => import(/* webpackPrefetch: true */ "react-confetti"));
10
11
type ConfettiContextType = {
12
isConfettiDropping: boolean;
13
dropConfetti(): void;
14
hideConfetti(): void;
15
};
16
const ConfettiContext = createContext<ConfettiContextType>({
17
isConfettiDropping: false,
18
dropConfetti: () => undefined,
19
hideConfetti: () => undefined,
20
});
21
22
export const ConfettiContextProvider: FC = ({ children }) => {
23
const [isConfettiDropping, setIsConfettiDropping] = useState(false);
24
const value = useMemo(() => {
25
return {
26
isConfettiDropping: isConfettiDropping,
27
dropConfetti: () => setIsConfettiDropping(true),
28
hideConfetti: () => setIsConfettiDropping(false),
29
};
30
}, [isConfettiDropping]);
31
32
return (
33
<ConfettiContext.Provider value={value}>
34
{children}
35
{isConfettiDropping && (
36
<Suspense fallback={<></>}>
37
<Confetti recycle={false} numberOfPieces={300} onConfettiComplete={value.hideConfetti} />
38
</Suspense>
39
)}
40
</ConfettiContext.Provider>
41
);
42
};
43
44
export const useConfetti = () => {
45
return useContext(ConfettiContext);
46
};
47
48