Skip to content

Commit 8a11e99

Browse files
authored
feat: edit a widget (#146)
1 parent 0d52050 commit 8a11e99

File tree

2 files changed

+48
-13
lines changed

2 files changed

+48
-13
lines changed

src/components/admin/LeftSideNav/index.tsx

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,38 @@ import {
44
Toolbar,
55
List,
66
ListItem,
7-
ListItemText,
7+
ListItemButton,
88
Divider,
99
} from '@mui/material';
1010
import { ref, onValue, DataSnapshot } from '@firebase/database';
1111
import { db } from '@/lib/firebase';
1212

13+
type Widget = {
14+
name: string;
15+
id: string;
16+
};
17+
1318
type LeftSideBarProps = {
1419
profile: string;
20+
selectWidget: ({ id, name }: Widget) => void;
1521
}
1622

17-
const LeftSideBar = ({ profile }: LeftSideBarProps) => {
18-
const [widgets, setWidgets] = useState<string[]>([]);
23+
const LeftSideBar = ({ profile, selectWidget }: LeftSideBarProps) => {
24+
const [widgets, setWidgets] = useState<Widget[]>([]);
1925

2026
useEffect(() => {
2127
const widgetsRef = ref(db, `/profiles/${profile}/widgets`);
2228
onValue(widgetsRef, (snap: DataSnapshot) => {
2329
if (snap?.val()) {
24-
setWidgets(Object.keys(snap.val()));
30+
const widgets = snap.val();
31+
setWidgets(
32+
Object.entries(widgets).map((widget: any) => {
33+
return {
34+
name: widget[1].name,
35+
id: widget[0],
36+
};
37+
})
38+
);
2539
}
2640
});
2741
}, [profile]);
@@ -45,10 +59,10 @@ const LeftSideBar = ({ profile }: LeftSideBarProps) => {
4559
<Divider />
4660
<List>
4761
{widgets.map((widget) => (
48-
<ListItem key={widget}>
49-
<ListItemText>
50-
<a href={`#${widget}`}>{widget}</a>
51-
</ListItemText>
62+
<ListItem key={widget.id}>
63+
<ListItemButton onClick={() => { selectWidget(widget); }}>
64+
{widget.id}
65+
</ListItemButton>
5266
</ListItem>
5367
))}
5468
</List>

src/pages/admin/[id]/index.tsx

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,23 +8,39 @@ import {
88
} from '@mui/material';
99
import { User } from '@firebase/auth';
1010
import { AuthProvider } from '@/lib/AuthProvider';
11-
import { auth } from '@/lib/firebase';
11+
import { auth, db } from '@/lib/firebase';
1212
import { Signin } from '@/components/admin/signin';
1313
import { Navbar } from '@/components/admin/Navbar';
1414
import { LeftSideBar } from '@/components/admin/LeftSideNav';
15-
import { Editors } from '@/components/admin/Editors';
15+
import { TextWidgetEditor } from '@/components/TextWidget';
16+
import { TimeWidgetEditor } from '@/components/TimeWidget';
17+
import { IFrameWidgetEditor } from '@/components/IFrameWidget';
18+
19+
const EditorMap = {
20+
text: TextWidgetEditor,
21+
time: TimeWidgetEditor,
22+
iframe: IFrameWidgetEditor,
23+
};
24+
25+
type Widget = {
26+
name: string;
27+
id: string;
28+
}
1629

1730
const AdminIndexPage = () => {
1831
const router = useRouter();
1932
const [currentUser, setCurrentUser] = useState<User | null>(null);
33+
const [currentWidget, setCurrentWidget] = useState<Widget | null>(null);
2034

2135
const currentProfile = router.query.id as string;
2236

2337
useEffect(() => {
2438
auth.onAuthStateChanged((user) => {
2539
setCurrentUser(user);
2640
});
27-
});
41+
}, []);
42+
43+
const Editor = currentWidget ? EditorMap[currentWidget.name] : null;
2844

2945
return (
3046
<>
@@ -50,10 +66,15 @@ const AdminIndexPage = () => {
5066
flexDirection: 'row',
5167
}}
5268
>
53-
<LeftSideBar profile={currentProfile} />
69+
<LeftSideBar
70+
profile={currentProfile}
71+
selectWidget={(widget) => {
72+
setCurrentWidget(widget);
73+
}}
74+
/>
5475
<Box component="main">
5576
<Container sx={{ pt: 4, flex: 1, overflow: 'auto' }}>
56-
<Editors profile={currentProfile} />
77+
{currentWidget && <Editor id={currentWidget.id} profile={currentProfile} />}
5778
</Container>
5879
</Box>
5980
</Box>

0 commit comments

Comments
 (0)