diff --git a/src/frontend/components/AdminPage.tsx b/src/frontend/components/AdminPage.tsx index b3ae5b5..b48d424 100644 --- a/src/frontend/components/AdminPage.tsx +++ b/src/frontend/components/AdminPage.tsx @@ -4,7 +4,7 @@ import { LOCALSTORAGE_KEY_TOKEN } from '../const'; import { useGetSessionQuery } from '../services/session'; import { Skeleton } from './Skeleton'; import { IAnnouncement } from '../../common/types/announcement'; -import { $get, $post, $put } from '../misc/api'; +import { $delete, $get, $post, $put } from '../misc/api'; import { Card } from './Card'; @@ -15,29 +15,34 @@ export const AdminPage: React.VFC = () => { const [selectedAnnouncement, selectAnnouncement] = useState(null); const [isAnnouncementsLoaded, setAnnouncementsLoaded] = useState(false); const [isEditMode, setEditMode] = useState(false); + const [isDeleteMode, setDeleteMode] = useState(false); const [draftTitle, setDraftTitle] = useState(''); const [draftBody, setDraftBody] = useState(''); const submitAnnouncement = async () => { - try { - if (selectedAnnouncement) { - await $put('announcements', { - id: selectedAnnouncement.id, - title: draftTitle, - body: draftBody, - }); - } else { - await $post('announcements', { - title: draftTitle, - body: draftBody, - }); - } - selectAnnouncement(null); - setEditMode(false); - fetchAll(); - } catch (e: unknown) { - // todo + if (selectedAnnouncement) { + await $put('announcements', { + id: selectedAnnouncement.id, + title: draftTitle, + body: draftBody, + }); + } else { + await $post('announcements', { + title: draftTitle, + body: draftBody, + }); } + selectAnnouncement(null); + setDraftTitle(''); + setDraftBody(''); + setEditMode(false); + fetchAll(); + }; + + const deleteAnnouncement = ({id}: IAnnouncement) => { + $delete('announcements', {id}).then(() => { + fetchAll(); + }); }; const fetchAll = () => { @@ -61,6 +66,15 @@ export const AdminPage: React.VFC = () => { } }, [error]); + /** + * Edit Modeがオンのとき、Delete Modeを無効化する(誤操作防止) + */ + useEffect(() => { + if (isEditMode) { + setDeleteMode(false); + } + }, [isEditMode]); + /** * お知らせ取得 */ @@ -94,22 +108,39 @@ export const AdminPage: React.VFC = () => { <>

Announcements

+ {!isEditMode && ( + + )} { !isEditMode ? ( -
- {announcements.map(a => ( - - ))} - -
+ <> + {isDeleteMode &&
Click the item to delete.
} +
+ {announcements.map(a => ( + + ))} + {!isDeleteMode && ( + + )} +
+ ) : (