{"version":3,"sources":["theme.tsx","features/adsense/index.ts","components/ProTip.tsx","app/hooks.ts","features/toast/toastSlice.ts","features/ac/acSlice.ts","assets/utils.ts","components/RemoteControl.tsx","logo.svg","features/ac/AirConditioner.tsx","features/toast/Toast.tsx","layouts/Copyright.tsx","features/ac/index.ts","pages/Home.tsx","pages/Rc.tsx","App.tsx","app/store.ts","serviceWorkerRegistration.ts","reportWebVitals.ts","index.tsx"],"names":["ThemeProvider","props","children","preferredMode","useMediaQuery","theme","useMemo","createTheme","palette","mode","ximalayaLink","jumpToXimalaya","console","log","ReactGA","ga","hitType","eventCategory","eventAction","eventLabel","window","open","useStyles","makeStyles","root","margin","spacing","display","justifyContent","alignItems","XimalayaLink","className","href","target","onClick","ProTip","classes","Typography","align","color","process","REACT_APP_DISABLE_ADSENSE","useAppDispatch","useDispatch","useAppSelector","useSelector","toastSlice","createSlice","name","initialState","message","reducers","setMessage","state","action","payload","setOpen","actions","acItemKey","status","namespace","temperature","localStorage","getItem","parseInt","acSlice","setStatus","setTemperature","increment","setItem","toString","decrement","setMode","toggleStatus","selectTemperature","ac","getAssetsUrl","url","playStartSoundTimeoutId","playWorkSoundTimeoutId","playWorkSoundIntervalId","extendedIcon","marginRight","RCButton","Fab","di","document","getElementById","play","playDi","playStartSound","acStart","load","setTimeout","acWork","setInterval","currentTime","noiseDuration","noiseStartTime","playWorkSound","customTheme","primary","green","SOUND_DI_PATH","SOUND_AC_WORK_PATH","SOUND_AIR_EXTRACTOR_FAN_PATH","RemoteControl","dispatch","Box","my","flexDirection","id","src","preload","aria-label","clearTimeout","clearInterval","toggleAC","style","backgroundColor","getState","acColor","acBorder","borderRadius","borderBottomLeftRadius","borderBottomRightRadius","acDisplay","textShadow","acLogo","width","acStatus","energyLabel","AcBorder","bgcolor","height","border","borderColor","boxShadow","position","AcTemperature","variant","AcDisplay","React","forwardRef","ref","top","right","AcLogo","textAlign","mt","pkg","title","rel","logo","alt","AirOutlet","AcStatus","led","textLabel","num","size","mx","titleLength","Array","keys","titleLabel","map","n","EnergyLabel","left","p","px","py","Grid","container","marginLeft","borderTop","borderRight","borderBottom","borderLeft","borderTopColor","borderRightColor","borderBottomColor","borderLeftColor","borderStyle","mb","pt","EnergySavingLabel","WindEffect","transform","AirConditioner","Fade","in","timeout","enter","exit","Toast","toast","handleClose","event","reason","Snackbar","autoHideDuration","onClose","Alert","severity","Copyright","Link","Date","getFullYear","useDetectStorage","useEffect","onStorage","e","key","newValue","addEventListener","removeEventListener","Home","Container","maxWidth","sx","component","gutterBottom","Button","Rc","App","path","store","configureStore","reducer","acReducer","toastReducer","isLocalhost","Boolean","location","hostname","match","registerValidSW","swUrl","config","navigator","serviceWorker","register","then","registration","onupdatefound","installingWorker","installing","onstatechange","controller","onUpdate","onSuccess","catch","error","reportWebVitals","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","initialize","pageview","pathname","search","ReactDOM","render","StrictMode","URL","origin","fetch","headers","response","contentType","get","indexOf","ready","unregister","reload","checkValidServiceWorker","serviceWorkerRegistration"],"mappings":"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","file":"static/js/main.bb03a590.chunk.js","sourcesContent":["import { useMemo } from \"react\";\nimport PropTypes from \"prop-types\";\nimport { useMediaQuery } from \"@material-ui/core\";\nimport { ThemeProvider as MuiThemeProvider } from \"@material-ui/styles\";\nimport { createTheme } from \"@material-ui/core/styles\";\n\nexport function ThemeProvider(props: any) {\n const { children } = props;\n\n // https://developer.mozilla.org/zh-CN/docs/Web/CSS/@media/prefers-color-scheme\n const prefersDarkMode = useMediaQuery(\"(prefers-color-scheme: dark)\");\n const preferredMode = prefersDarkMode ? \"dark\" : \"light\";\n // A custom theme for this app\n const theme = useMemo(\n () =>\n createTheme({\n palette: {\n mode: preferredMode,\n },\n }),\n [preferredMode]\n );\n\n return {children};\n}\n\nThemeProvider.propTypes = {\n children: PropTypes.node,\n};\n\nexport default ThemeProvider;\n","import ReactGA from \"react-ga\";\n\n/**\n * 喜马拉雅广告链接\n */\nexport const ximalayaLink =\n \"https://m.ximalaya.com/sleepaudio/6?mixedTrackIds=331526646&utm_source=smxkt\";\n\n/**\n * 跳转至喜马拉雅\n * 「你想用钱来收买我吗?这是对我的侮辱!我本想这样大声呵斥他,但钱实在是太多了」\n */\nexport function jumpToXimalaya() {\n console.log(\n \"你想用钱来收买我吗?这是对我的侮辱!我本想这样大声呵斥他,但钱实在是太多了。\"\n );\n ReactGA.ga(\"send\", {\n hitType: \"event\",\n eventCategory: \"Outbound Link\",\n eventAction: \"click\",\n eventLabel: \"Ximalaya Adsense\",\n });\n window.open(ximalayaLink);\n}\n","import { makeStyles } from \"@material-ui/core/styles\";\nimport Typography from \"@material-ui/core/Typography\";\nimport EmojiObjectsOutlinedIcon from \"@material-ui/icons/EmojiObjectsOutlined\";\nimport { jumpToXimalaya, ximalayaLink } from \"../features/adsense\";\n\nconst useStyles = makeStyles((theme) => ({\n root: {\n margin: theme.spacing(3, 0),\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n },\n}));\n\n/**\n * 喜马拉雅链接\n */\nfunction XimalayaLink() {\n return (\n {\n jumpToXimalaya();\n }}\n >\n 喜马拉雅\n \n );\n}\n\nexport default function ProTip() {\n const classes = useStyles();\n return (\n \n \n Tip: {process.env.REACT_APP_DISABLE_ADSENSE ? null : }\n 为你的夏日带去清凉!\n \n );\n}\n","import { TypedUseSelectorHook, useDispatch, useSelector } from \"react-redux\";\nimport type { RootState, AppDispatch } from \"./store\";\n\n// Use throughout your app instead of plain `useDispatch` and `useSelector`\nexport const useAppDispatch = () => useDispatch();\nexport const useAppSelector: TypedUseSelectorHook = useSelector;\n","import { createSlice, PayloadAction } from \"@reduxjs/toolkit\";\n\nexport interface ToastState {\n /**\n * 是否打开\n */\n open: boolean;\n /**\n * 消息内容\n */\n message: string;\n}\n\nconst initialState: ToastState = {\n open: false,\n message: \"\",\n};\n\nexport const toastSlice = createSlice({\n name: \"toast\",\n initialState,\n reducers: {\n /**\n * 设置提示框内容\n * @param state\n * @param action\n */\n setMessage(state, action: PayloadAction) {\n state.message = action.payload;\n },\n /**\n * 设置提示框是否显示\n * @param state\n * @param action\n */\n setOpen(state, action: PayloadAction) {\n state.open = action.payload;\n },\n },\n});\n\nexport const { setMessage, setOpen } = toastSlice.actions;\n\nexport default toastSlice.reducer;\n","import { createSlice, PayloadAction } from \"@reduxjs/toolkit\";\nimport { AppThunk, RootState } from \"../../app/store\";\nimport { setMessage, setOpen } from \"../toast/toastSlice\";\n\nexport type AcMode = \"cold\" | \"hot\";\nexport interface AcState {\n /**\n * 状态\n */\n status: boolean;\n /**\n * 模式\n */\n mode: AcMode;\n /**\n * 温度\n */\n temperature: number;\n}\n\nconst namespace = \"ac-\";\n\nexport const acItemKey = {\n status: namespace + \"status\",\n mode: namespace + \"mode\",\n temperature: namespace + \"temperature\",\n};\n\nconst initialState: AcState = {\n status: false,\n mode: (localStorage.getItem(acItemKey.mode) as AcMode) || \"cold\",\n temperature:\n parseInt(localStorage.getItem(acItemKey.temperature) || \"\") || 20,\n};\n\nconst maxTemperature = 31;\nconst minTemperature = 16;\n\nexport const acSlice = createSlice({\n name: \"ac\",\n initialState,\n reducers: {\n /**\n * 设置状态\n * @param state\n * @param action\n */\n setStatus(state, action: PayloadAction) {\n state.status = action.payload;\n },\n /**\n * 设置温度\n * @param state\n * @param action\n */\n setTemperature(state, action: PayloadAction) {\n state.temperature = action.payload;\n },\n /**\n * 增加温度\n * @param state\n */\n increment: (state) => {\n state.temperature += 1;\n localStorage.setItem(acItemKey.temperature, state.temperature.toString());\n },\n\n /**\n * 降低温度\n * @param state\n */\n decrement: (state) => {\n state.temperature -= 1;\n localStorage.setItem(acItemKey.temperature, state.temperature.toString());\n },\n\n /**\n * 设置空调模式\n * @param state\n * @param action\n */\n setMode(state, action: PayloadAction) {\n state.mode = action.payload;\n localStorage.setItem(acItemKey.mode, state.mode);\n },\n\n /**\n * 切换开关状态\n * @param state\n * @param action\n */\n toggleStatus(state) {\n state.status = !state.status;\n localStorage.setItem(acItemKey.status, state.status.toString());\n },\n },\n});\n\nexport const selectTemperature = (state: RootState) => state.ac.temperature;\n\nexport const {\n setTemperature,\n increment,\n decrement,\n setMode,\n toggleStatus,\n setStatus,\n} = acSlice.actions;\n\n/**\n * 增加温度\n * @returns\n */\nexport const increaseTemperature = (): AppThunk => (dispatch, getState) => {\n const currentValue = selectTemperature(getState());\n if (currentValue < maxTemperature) {\n dispatch(increment());\n } else {\n dispatch(setMessage(\"已经是最大温度啦!\"));\n dispatch(setOpen(true));\n }\n};\n\n/**\n * 降低温度\n * @returns\n */\nexport const decreaseTemperature = (): AppThunk => (dispatch, getState) => {\n const currentValue = selectTemperature(getState());\n if (currentValue > minTemperature) {\n dispatch(decrement());\n } else {\n dispatch(setMessage(\"已经是最小温度啦!\"));\n dispatch(setOpen(true));\n }\n};\n\nexport default acSlice.reducer;\n","/**\n * 是否为生产环境\n */\nexport const isProd = process.env.NODE_ENV === \"production\";\n\n/**\n * 获取资源 URL\n * @param url\n */\nexport function getAssetsUrl(url: string) {\n const jsdelivrCDN =\n \"https://cdn.jsdelivr.net/gh/YunYouJun/air-conditioner/public\";\n return (isProd ? jsdelivrCDN : process.env.PUBLIC_URL) + url;\n}\n","import {\n createTheme,\n makeStyles,\n ThemeProvider,\n} from \"@material-ui/core/styles\";\nimport { Box, Fab } from \"@material-ui/core\";\nimport ExpandLessIcon from \"@material-ui/icons/ExpandLess\";\nimport ExpandMoreIcon from \"@material-ui/icons/ExpandMore\";\nimport PowerSettingsNewIcon from \"@material-ui/icons/PowerSettingsNew\";\nimport AcUnitIcon from \"@material-ui/icons/AcUnit\";\nimport WbSunnyIcon from \"@material-ui/icons/WbSunny\";\n\nimport { green } from \"@material-ui/core/colors\";\nimport { useAppDispatch, useAppSelector } from \"../app/hooks\";\nimport {\n decreaseTemperature,\n increaseTemperature,\n setMode,\n toggleStatus,\n} from \"../features/ac/acSlice\";\nimport { RootState } from \"../app/store\";\nimport { getAssetsUrl } from \"../assets/utils\";\n\nconst useStyles = makeStyles((theme) => ({\n margin: {\n margin: theme.spacing(1),\n },\n extendedIcon: {\n marginRight: theme.spacing(1),\n },\n}));\n\n/**\n * 遥控器按钮\n * @param props\n */\nfunction RCButton(props: any) {\n return (\n {\n playDi();\n props.onClick();\n }}\n >\n );\n}\n\n/**\n * 播放「嘀」的音效\n */\nfunction playDi() {\n const di = document.getElementById(\"di\");\n if (di) {\n (di as HTMLAudioElement).play();\n }\n}\n\nlet playStartSoundTimeoutId: any;\nlet playWorkSoundTimeoutId: any;\nlet playWorkSoundIntervalId: any;\n\n/**\n * 播放空调启动声音\n */\nfunction playStartSound() {\n const acStart = document.getElementById(\"ac-work\") as HTMLAudioElement;\n acStart.load();\n acStart.play();\n\n playStartSoundTimeoutId = setTimeout(() => {\n playWorkSound();\n }, 8000);\n}\n\n// 噪音起始时间\nconst noiseStartTime = 2;\n// 噪音持续时间\nconst noiseDuration = 56;\n\n/**\n * 播放空调工作声音\n */\nfunction playWorkSound() {\n const acWork = document.getElementById(\n \"air-extractor-fan\"\n ) as HTMLAudioElement;\n acWork.load();\n acWork.play();\n\n playWorkSoundTimeoutId = setTimeout(() => {\n playWorkSoundIntervalId = setInterval(() => {\n acWork.currentTime = noiseStartTime;\n }, noiseDuration * 1000);\n }, noiseStartTime * 1000);\n}\n\n/**\n * 切换空调工作状态\n * @param {*} props\n */\nfunction toggleAC(status: boolean, dispatch: any) {\n if (status) {\n (document.getElementById(\"ac-work\") as HTMLAudioElement).load();\n const acWork = document.getElementById(\n \"air-extractor-fan\"\n ) as HTMLAudioElement;\n if (playStartSoundTimeoutId) {\n clearTimeout(playStartSoundTimeoutId);\n }\n if (playWorkSoundTimeoutId) {\n clearTimeout(playWorkSoundTimeoutId);\n }\n if (playWorkSoundIntervalId) {\n clearInterval(playWorkSoundIntervalId);\n }\n acWork.currentTime = noiseStartTime + noiseDuration;\n } else {\n playStartSound();\n }\n\n dispatch(toggleStatus());\n}\n\nconst customTheme = createTheme({\n palette: {\n primary: green,\n },\n});\n\nconst SOUND_DI_PATH = getAssetsUrl(\"/assets/audio/di.mp3\");\nconst SOUND_AC_WORK_PATH = getAssetsUrl(\"/assets/audio/ac-work.mp3\");\nconst SOUND_AIR_EXTRACTOR_FAN_PATH = getAssetsUrl(\n \"/assets/audio/air-extractor-fan.mp3\"\n);\n\n/**\n * 遥控\n * @param {*} props\n */\nexport default function RemoteControl() {\n const classes = useStyles();\n const ac = useAppSelector((state: RootState) => state.ac);\n const dispatch = useAppDispatch();\n return (\n \n \n \n \n
\n {\" \"}\n {\n dispatch(setMode(\"cold\"));\n }}\n >\n \n \n \n {\n toggleAC(ac.status, dispatch);\n }}\n style={{ color: \"white\" }}\n >\n \n \n \n {\n dispatch(setMode(\"hot\"));\n }}\n >\n \n \n
\n {\n dispatch(increaseTemperature());\n }}\n >\n \n \n {\n dispatch(decreaseTemperature());\n }}\n >\n \n \n
\n );\n}\n","export default __webpack_public_path__ + \"static/media/logo.5fb28574.svg\";","import React from \"react\";\nimport { makeStyles } from \"@material-ui/core/styles\";\nimport { Box, Grid, Typography, Fade } from \"@material-ui/core\";\nimport logo from \"../../logo.svg\";\n\nimport * as pkg from \"../../../package.json\";\n\nimport \"./AirConditioner.scss\";\nimport { useAppSelector } from \"../../app/hooks\";\n\nimport { AcMode, selectTemperature } from \"./acSlice\";\nimport { ximalayaLink, jumpToXimalaya } from \"../adsense\";\n\nconst acColor = {\n border: \"#e0e0e0\",\n display: \"#cccccc\",\n wind: \"#bbbbbb\",\n};\n\nconst useStyles = makeStyles((theme) => ({\n acBorder: {\n borderRadius: 10,\n borderBottomLeftRadius: 20,\n borderBottomRightRadius: 20,\n },\n acDisplay: {\n textShadow: \"0px 0px 2px rgba(0, 0, 0, 0.3)\",\n // visibility: (props) => props.visibility,\n },\n acLogo: {\n width: 12,\n },\n acStatus: {\n backgroundColor: (props?: any) => props.backgroundColor || \"transparent\",\n },\n energyLabel: {\n backgroundColor: \"#4ea5f5\",\n },\n}));\n\nfunction AcBorder(props: any) {\n return (\n \n );\n}\n\n/**\n * 空调温度\n * @returns\n */\nfunction AcTemperature() {\n const temperature = useAppSelector(selectTemperature);\n return (\n \n {temperature}\n °C\n \n );\n}\n\n/**\n * 显示屏(温度/图标)\n * @param props\n */\nconst AcDisplay = React.forwardRef((props: { mode: AcMode }, ref) => {\n return (\n \n \n {props.mode === \"cold\" ? \"❄\" : \"☀️\"}️️\n \n \n \n );\n});\n\n/**\n * 空调 Logo\n * @param props\n */\nfunction AcLogo(props: any) {\n return (\n // \n \n \n \"logo\"\n \n \n );\n}\n\n/**\n * 出风口线\n * @returns\n */\nfunction AirOutlet() {\n return ;\n}\n\n/**\n * 空调状态\n * @param props\n */\nfunction AcStatus(props: { status: boolean }) {\n // 空调状态小灯\n const led = { backgroundColor: props.status ? \"#38F709\" : acColor.border };\n const classes = useStyles(led);\n return (\n \n );\n}\n\n/**\n * 文本标签(黑色小点点)\n * @param num\n * @param color\n * @param size\n * @param mx\n * @param my\n */\nfunction textLabel(\n num: number,\n color: string,\n size: number,\n mx: number,\n my = 0\n) {\n const titleLength = [...new Array(num).keys()];\n const titleLabel = titleLength.map((n) => (\n \n ));\n return (\n \n {titleLabel}\n \n );\n}\n\n/**\n * 功耗标签\n * @param props\n */\nfunction EnergyLabel(props: any) {\n return (\n \n {textLabel(6, \"white\", 4, 0.25)}\n \n \n \n \n \n \n \n \n \n \n \n \n {textLabel(11, \"black\", 2, 0.1, 0.25)}\n \n {textLabel(9, \"black\", 1.5, 0.1, 0.25)}\n {textLabel(10, \"black\", 1.2, 0.1, 0)}\n \n {textLabel(8, \"white\", 2, 0.1)}\n \n );\n}\n\n/**\n * 节能产品惠民工程\n */\nfunction EnergySavingLabel() {\n return (\n
\n  节能产品惠民工程\n {/* eslint-disable-next-line */}\n {\n jumpToXimalaya();\n }}\n >\n \n \n {textLabel(10, \"black\", 1.2, 0.1, 0)}\n {textLabel(10, \"black\", 1.2, 0.1, 0)}\n {textLabel(11, \"black\", 2, 0.1, 0.25)}\n
\n );\n}\n\n/**\n * 风特效\n * @param props\n */\nconst WindEffect = React.forwardRef((props, ref) => {\n return (\n \n \n \n \n \n );\n});\n\n/**\n * 空调\n */\nexport default function AirConditioner(props: {\n mode: AcMode;\n status: boolean;\n temperature: number;\n}) {\n const classes = useStyles(props);\n return (\n \n \n \n \n \n \n \n \n \n {process.env.REACT_APP_DISABLE_ADSENSE ? null : }\n \n \n \n \n \n );\n}\n","import { Alert, Snackbar } from \"@material-ui/core\";\nimport { RootState } from \"../../app/store\";\nimport { useAppDispatch, useAppSelector } from \"../../app/hooks\";\nimport { setOpen } from \"./toastSlice\";\n\nexport default function Toast() {\n const toast = useAppSelector((state: RootState) => state.toast);\n const dispatch = useAppDispatch();\n\n const handleClose = (event?: React.SyntheticEvent, reason?: string) => {\n dispatch(setOpen(false));\n };\n\n return (\n \n \n {toast.message}\n \n \n );\n}\n","import Box from \"@material-ui/core/Box\";\nimport Link from \"@material-ui/core/Link\";\nimport Typography from \"@material-ui/core/Typography\";\nimport * as pkg from \"../../package.json\";\n\nfunction Copyright() {\n return (\n
\n \n \n {\"© \"}\n \n Yun Air Conditioner\n \n {\" - \"}\n \n {pkg.author.name}\n \n \n \n \n {\" 2019 - \" + new Date().getFullYear()}\n \n
\n );\n}\n\nexport default Copyright;\n","import { useAppDispatch } from \"../../app/hooks\";\nimport {\n AcMode,\n acItemKey,\n setTemperature,\n setMode,\n setStatus,\n} from \"../../features/ac/acSlice\";\nimport { useEffect } from \"react\";\n\n/**\n * 通过监听 storage 来更新状态\n */\nexport function useDetectStorage() {\n const dispatch = useAppDispatch();\n useEffect(() => {\n function onStorage(e: StorageEvent) {\n // 重复设置相同的键值不会触发该事件\n switch (e.key) {\n case acItemKey.status:\n dispatch(setStatus(e.newValue === \"true\"));\n break;\n case acItemKey.temperature:\n dispatch(setTemperature(parseInt(e.newValue || \"20\")));\n break;\n case acItemKey.mode:\n dispatch(setMode((e.newValue || \"cold\") as AcMode));\n break;\n default:\n break;\n }\n }\n window.addEventListener(\"storage\", onStorage);\n return () => {\n window.removeEventListener(\"storage\", onStorage);\n };\n }, [dispatch]);\n}\n","import Button from \"@material-ui/core/Button\";\nimport Container from \"@material-ui/core/Container\";\nimport Typography from \"@material-ui/core/Typography\";\nimport Box from \"@material-ui/core/Box\";\n\nimport ProTip from \"../components/ProTip\";\nimport RemoteControl from \"../components/RemoteControl\";\n\nimport AirConditioner from \"../features/ac/AirConditioner\";\nimport Toast from \"../features/toast/Toast\";\n\nimport { ThemeProvider } from \"../theme\";\n\nimport { useAppSelector } from \"../app/hooks\";\nimport { RootState } from \"../app/store\";\nimport Copyright from \"../layouts/Copyright\";\nimport { useDetectStorage } from \"../features/ac\";\n\nfunction Home() {\n const ac = useAppSelector((state: RootState) => state.ac);\n\n useDetectStorage();\n\n /**\n * 根据模式返回对应的色温\n * @returns\n */\n function getClassByMode() {\n if (ac.status) {\n return ac.mode === \"hot\" ? \"hot-color\" : \"cold-color\";\n } else {\n return \"\";\n }\n }\n\n return (\n \n \n \n \n 便携小空调\n \n \n \n
\n \n {\n window.open(\"/#/rc\", \"_blank\", \"width=300, height=400\");\n }}\n >\n 独立遥控器\n \n \n
\n \n \n
\n \n
\n
\n );\n}\n\nexport default Home;\n","import RemoteControl from \"../components/RemoteControl\";\nimport Copyright from \"../layouts/Copyright\";\nimport { useDetectStorage } from \"../features/ac\";\n\nexport default function Rc() {\n useDetectStorage();\n return (\n
\n \n \n
\n );\n}\n","import \"./App.scss\";\n\nimport { ThemeProvider } from \"./theme\";\nimport Container from \"@material-ui/core/Container\";\n\nimport { HashRouter as Router, Switch, Route } from \"react-router-dom\";\nimport Home from \"./pages/Home\";\nimport Rc from \"./pages/Rc\";\nimport { useEffect } from \"react\";\n\nfunction App() {\n useEffect(() => {\n console.log(\n `%c ☁️ air-conditioner %c https://github.com/YunYouJun/air-conditioner`,\n \"color: white; background: #0078E7; padding:5px 0;\",\n \"padding:4px;border:1px solid #0078E7;\"\n );\n console.log(\n `%c ☁️ @YunYouJun %c https://www.yunyoujun.cn`,\n \"color: white; background: #0078E7; padding:5px 0;\",\n \"padding:4px;border:1px solid #0078E7;\"\n );\n }, []);\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n}\n\nexport default App;\n","import { configureStore, ThunkAction, Action } from \"@reduxjs/toolkit\";\nimport acReducer from \"../features/ac/acSlice\";\nimport toastReducer from \"../features/toast/toastSlice\";\n\nexport const store = configureStore({\n reducer: {\n ac: acReducer,\n toast: toastReducer,\n },\n});\n\nexport type AppDispatch = typeof store.dispatch;\nexport type RootState = ReturnType;\nexport type AppThunk = ThunkAction<\n ReturnType,\n RootState,\n unknown,\n Action\n>;\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://cra.link/PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === \"localhost\" ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === \"[::1]\" ||\n // 127.0.0.0/8 are considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\ntype Config = {\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\n};\n\nexport function register(config?: Config) {\n if (process.env.NODE_ENV === \"production\" && \"serviceWorker\" in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener(\"load\", () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n \"This web app is being served cache-first by a service \" +\n \"worker. To learn more, visit https://cra.link/PWA\"\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl: string, config?: Config) {\n navigator.serviceWorker\n .register(swUrl)\n .then((registration) => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === \"installed\") {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n \"New content is available and will be used when all \" +\n \"tabs for this page are closed. See https://cra.link/PWA.\"\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log(\"Content is cached for offline use.\");\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch((error) => {\n console.error(\"Error during service worker registration:\", error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { \"Service-Worker\": \"script\" },\n })\n .then((response) => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get(\"content-type\");\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf(\"javascript\") === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then((registration) => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n \"No internet connection found. App is running in offline mode.\"\n );\n });\n}\n\nexport function unregister() {\n if (\"serviceWorker\" in navigator) {\n navigator.serviceWorker.ready\n .then((registration) => {\n registration.unregister();\n })\n .catch((error) => {\n console.error(error.message);\n });\n }\n}\n","import { ReportHandler } from \"web-vitals\";\n\nconst reportWebVitals = (onPerfEntry?: ReportHandler) => {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n import(\"web-vitals\").then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n getCLS(onPerfEntry);\n getFID(onPerfEntry);\n getFCP(onPerfEntry);\n getLCP(onPerfEntry);\n getTTFB(onPerfEntry);\n });\n }\n};\n\nexport default reportWebVitals;\n","import React from \"react\";\nimport ReactDOM from \"react-dom\";\n\nimport \"./index.scss\";\nimport App from \"./App\";\nimport { store } from \"./app/store\";\nimport { Provider } from \"react-redux\";\nimport * as serviceWorkerRegistration from \"./serviceWorkerRegistration\";\nimport reportWebVitals from \"./reportWebVitals\";\n\nimport ReactGA from \"react-ga\";\nReactGA.initialize(\"UA-121354150-10\");\nReactGA.pageview(window.location.pathname + window.location.search);\n\nReactDOM.render(\n \n \n \n \n ,\n document.getElementById(\"root\")\n);\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorkerRegistration.register();\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals();\n"],"sourceRoot":""}