From 56a2c459bd59ea14f5faa1a606850cfb71da55dd Mon Sep 17 00:00:00 2001 From: raduwen Date: Sat, 9 Oct 2021 10:12:00 +0900 Subject: [PATCH] feat: implementts add widget --- src/components/IFrameWidget/editor.tsx | 8 ++ src/components/TextWidget/editor.tsx | 15 ++- src/components/TimeWidget/editor.tsx | 5 + src/pages/admin/index.tsx | 144 +++++++++++++++++++++++-- 4 files changed, 161 insertions(+), 11 deletions(-) diff --git a/src/components/IFrameWidget/editor.tsx b/src/components/IFrameWidget/editor.tsx index 56b0fa46..1c05ac23 100644 --- a/src/components/IFrameWidget/editor.tsx +++ b/src/components/IFrameWidget/editor.tsx @@ -195,6 +195,14 @@ class IFrameWidgetEditor extends Component { ); } + + public static defaultProps: IFrameWidgetProps = { + url: "", + retry_time: 10, + retry_count: 3, + width: 640, + height: 480, + }; } export { IFrameWidgetEditor }; diff --git a/src/components/TextWidget/editor.tsx b/src/components/TextWidget/editor.tsx index 0729fb10..46db1a8f 100644 --- a/src/components/TextWidget/editor.tsx +++ b/src/components/TextWidget/editor.tsx @@ -41,17 +41,18 @@ class Color { } // from #rrggbb - static fromRGBCode(rgb: string): Color { - return new Color( + static fromRGBCode?(rgb: string): Color { + return rgb ? new Color( parseInt(rgb.substr(1,2), 16), parseInt(rgb.substr(3,2), 16), parseInt(rgb.substr(5,2), 16), 1, - ); + ) : new Color(0, 0, 0, 1); } // from rgba(r,g,b,a) - static fromRGBA(rgba: string): Color { + static fromRGBA(rgba?: string): Color { + if (!rgba) return new Color(0, 0, 0, 1); const match = rgba.match(/rgba\((\d+),(\d+),(\d+),(\d(\.\d+)?)\)/); return new Color( parseInt(match[1]), @@ -342,6 +343,12 @@ class TextWidgetEditor extends Component { ); } + + public static defaultProps: TextWidgetProps = { + text: "", + hidden: false, + autoHidden: true, + } } export { TextWidgetEditor }; diff --git a/src/components/TimeWidget/editor.tsx b/src/components/TimeWidget/editor.tsx index 4feee67d..1f6e4ddb 100644 --- a/src/components/TimeWidget/editor.tsx +++ b/src/components/TimeWidget/editor.tsx @@ -89,6 +89,11 @@ class TimeWidgetEditor extends Component { ); } + + public static defaultProps: TimeWidgetProps = { + size: 24, + hidden: false, + }; } export { TimeWidgetEditor }; diff --git a/src/pages/admin/index.tsx b/src/pages/admin/index.tsx index c105a307..8df9baa7 100644 --- a/src/pages/admin/index.tsx +++ b/src/pages/admin/index.tsx @@ -1,16 +1,32 @@ -import { useEffect, useState } from 'react'; +import { useEffect, useState, MouseEvent } from 'react'; +import styled from 'styled-components'; import { CssBaseline, Container, Box, AppBar, Toolbar, + Menu, + MenuItem, Typography, Button, + IconButton, + FormControl, + InputLabel, + TextField, + Select, + Backdrop, + Dialog, + DialogActions, + DialogContent, + DialogTitle, + Fade, } from '@mui/material'; import { makeStyles } from '@mui/styles' +import AddIcon from '@mui/icons-material/Add'; +import AccountCircleIcon from '@mui/icons-material/AccountCircle'; import { User } from '@firebase/auth'; -import { ref, onValue, DataSnapshot } from '@firebase/database'; +import { ref, set, onValue, DataSnapshot } from '@firebase/database'; import { AuthProvider } from '@/lib/AuthProvider'; import { auth, db } from '@/lib/firebase'; @@ -72,11 +88,86 @@ const Widgets = () => { } ); -} +}; + +const AddWidgetModel = ({ open, onClose }: { open: boolean, onClose: () => void }) => { + const [widgetId, setWidgetId] = useState(""); + const [widgetType, setWidgetType] = useState("text"); + + const FormGroup = styled.div` + display: flex; + margin-bottom: 1rem; + & > div { + flex-grow: 1; + margin-left: 0.25rem; + } + `; + + const style = { + display: 'flex', + flexDirection: 'column', + position: 'absolute' as 'absolute', + top: '50%', + left: '50%', + transform: 'translate(-50%, -50%)', + width: 640, + bgcolor: 'background.paper', + border: '1px solid #ddd', + borderRadius: '4px', + boxShadow: 24, + pt: 4, + px: 4, + pb: 3, + }; + + return ( + + Add Widget + + + + { setWidgetId(e.target.value); }}/> + + + + + + Widget + + + + + + + + + ); +}; const AdminIndexPage = () => { const classes = useStyles(); const [currentUser, setCurrentUser] = useState(null); + const [anchorEl, setAnchorEl] = useState(null); + const [addWidgetModalOpened, setAddWidgetModalOpened] = useState(false); + const isUserMenuOpen = Boolean(anchorEl); useEffect(() => { auth.onAuthStateChanged((user) => { @@ -85,6 +176,7 @@ const AdminIndexPage = () => { }); const signout = async () => { + setAnchorEl(null); try { await auth.signOut(); } catch (err) { @@ -92,6 +184,14 @@ const AdminIndexPage = () => { } }; + const userMenuId = 'user-menu'; + const handleUserMenuOpen = (event: MouseEvent) => { + setAnchorEl(event.currentTarget); + }; + const handleUserMenuClose = () => { + setAnchorEl(null); + }; + return currentUser !== null ? ( @@ -101,12 +201,42 @@ const AdminIndexPage = () => { Admin - {currentUser.email} - + + + {setAddWidgetModalOpened(true);}} + > + + + + + + + + Logout + + { + setAddWidgetModalOpened(false); + }} + />