@@ -20,11 +20,12 @@ import {
2020 ModalContent ,
2121 ModalHeader ,
2222 ModalFooter ,
23- Tooltip ,
2423} from "@heroui/react"
2524
2625import { PasteResponse , parsePath , parseFilenameFromContentDisposition } from "../src/shared.js"
2726
27+ import { DarkModeToggle , DarkMode , defaultDarkMode , shouldBeDark } from "./components/darkModeToggle.js"
28+
2829import {
2930 verifyExpiration ,
3031 verifyManageUrl ,
@@ -36,20 +37,9 @@ import {
3637} from "./utils.js"
3738
3839import "./style.css"
39- import { computerIcon , moonIcon , sunIcon } from "./icons.js"
4040
4141type EditKind = "edit" | "file"
4242type UploadKind = "short" | "long" | "custom" | "manage"
43- type DarkMode = "dark" | "light" | "system"
44-
45- function defaultDarkMode ( ) : DarkMode {
46- const storedDarkModeSelect = localStorage . getItem ( "darkModeSelect" )
47- if ( storedDarkModeSelect !== null && [ "light" , "dark" , "system" ] . includes ( storedDarkModeSelect ) ) {
48- return storedDarkModeSelect as DarkMode
49- } else {
50- return "system"
51- }
52- }
5343
5444export function PasteBin ( ) {
5545 const [ editKind , setEditKind ] = useState < EditKind > ( "edit" )
@@ -72,10 +62,6 @@ export function PasteBin() {
7262
7363 const [ darkModeSelect , setDarkModeSelect ] = useState < DarkMode > ( defaultDarkMode ( ) )
7464
75- // when matchMedia not available (e.g. in tests), set to light mode
76- const systemDark = window . matchMedia ? window . matchMedia ( "(prefers-color-scheme: dark)" ) . matches : false
77- const isDark = darkModeSelect === "system" ? systemDark : darkModeSelect === "dark"
78-
7965 function showModal ( err : string , title : string ) {
8066 setModalErrMsg ( err )
8167 setModalErrTitle ( title )
@@ -242,35 +228,10 @@ export function PasteBin() {
242228 }
243229 }
244230
245- const iconsMap = new Map ( [
246- [ "system" , computerIcon ] ,
247- [ "dark" , moonIcon ] ,
248- [ "light" , sunIcon ] ,
249- ] )
250- const toggleDarkModeButton = (
251- < Tooltip content = "Toggle Dark Mode" >
252- < span
253- className = "absolute right-0"
254- data-testid = "pastebin-darkmode-toggle"
255- onClick = { ( ) => {
256- if ( darkModeSelect === "system" ) {
257- setDarkModeSelect ( "dark" )
258- } else if ( darkModeSelect === "dark" ) {
259- setDarkModeSelect ( "light" )
260- } else {
261- setDarkModeSelect ( "system" )
262- }
263- } }
264- >
265- { iconsMap . get ( darkModeSelect ) }
266- </ span >
267- </ Tooltip >
268- )
269-
270231 const info = (
271232 < div className = "mx-4 lg:mx-0" >
272233 < h1 className = "text-3xl mt-8 mb-4 relative" >
273- { INDEX_PAGE_TITLE } { toggleDarkModeButton }
234+ { INDEX_PAGE_TITLE } < DarkModeToggle mode = { darkModeSelect } onModeChange = { setDarkModeSelect } />
274235 </ h1 >
275236 < p className = "my-2" > This is an open source pastebin deployed on Cloudflare Workers. </ p >
276237 < p className = "my-2" >
@@ -538,7 +499,7 @@ export function PasteBin() {
538499 data-testid = "pastebin-main"
539500 className = {
540501 "flex flex-col items-center min-h-screen font-sans bg-background text-foreground" +
541- ( isDark ? " dark" : " light" )
502+ ( shouldBeDark ( darkModeSelect ) ? " dark" : " light" )
542503 }
543504 >
544505 < div className = "grow w-full max-w-[64rem]" >
0 commit comments