-
Notifications
You must be signed in to change notification settings - Fork 513
Expand file tree
/
Copy pathuse-code-overlay.tsx
More file actions
70 lines (59 loc) · 1.87 KB
/
use-code-overlay.tsx
File metadata and controls
70 lines (59 loc) · 1.87 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
'use client';
import { usePathname } from 'next/navigation';
import { createContext, useCallback, useContext, useEffect, useMemo, useState, type ReactNode } from 'react';
type CodeOverlayContextType = {
isOpen: boolean,
code: string,
language: string,
title: string,
openOverlay: (code: string, language?: string, title?: string) => void,
closeOverlay: () => void,
toggleOverlay: () => void,
};
const CodeOverlayContext = createContext<CodeOverlayContextType | null>(null);
export function CodeOverlayProvider({ children }: { children: ReactNode }) {
const [isOpen, setIsOpen] = useState(false);
const [code, setCode] = useState('');
const [language, setLanguage] = useState('tsx');
const [title, setTitle] = useState('Code Example');
const [, setCurrentPage] = useState('');
const pathname = usePathname();
// Close overlay when navigating to a different page
useEffect(() => {
setIsOpen(false);
setCurrentPage(pathname);
}, [pathname]);
const openOverlay = useCallback((newCode: string, newLanguage = 'tsx', newTitle = 'Code Example') => {
setCode(newCode);
setLanguage(newLanguage);
setTitle(newTitle);
setIsOpen(true);
}, []);
const closeOverlay = useCallback(() => {
setIsOpen(false);
}, []);
const toggleOverlay = useCallback(() => {
setIsOpen(prev => !prev);
}, []);
const contextValue = useMemo(() => ({
isOpen,
code,
language,
title,
openOverlay,
closeOverlay,
toggleOverlay,
}), [isOpen, code, language, title, openOverlay, closeOverlay, toggleOverlay]);
return (
<CodeOverlayContext.Provider value={contextValue}>
{children}
</CodeOverlayContext.Provider>
);
}
export function useCodeOverlay() {
const context = useContext(CodeOverlayContext);
if (!context) {
throw new Error('useCodeOverlay must be used within a CodeOverlayProvider');
}
return context;
}