import React, { useEffect, useState } from 'react'; import { LOCALSTORAGE_KEY_TOKEN } from '../const'; import { useGetSessionQuery } from '../services/session'; import { Skeleton } from '../components/Skeleton'; import { IAnnouncement } from '../../common/types/announcement'; import { $delete, $get, $post, $put } from '../misc/api'; import { showModal } from '../store/slices/screen'; import { useDispatch } from 'react-redux'; import { useTitle } from '../hooks/useTitle'; export const AdminPage: React.VFC = () => { const { data, error } = useGetSessionQuery(undefined); const dispatch = useDispatch(); useTitle('_sidebar.admin'); const [announcements, setAnnouncements] = useState([]); 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 [misshaiLog, setMisshaiLog] = useState(null); const submitAnnouncement = async () => { 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 = () => { setAnnouncements([]); setAnnouncementsLoaded(false); $get('announcements').then(announcements => { setAnnouncements(announcements ?? []); setAnnouncementsLoaded(true); }); fetchLog(); }; const fetchLog = () => { $get('admin/misshai/log').then(setMisshaiLog); }; const onClickStartMisshaiAlertWorkerButton = () => { $post('admin/misshai/start').then(() => { dispatch(showModal({ type: 'dialog', message: '開始', })); }).catch((e) => { dispatch(showModal({ type: 'dialog', icon: 'error', message: e.message, })); }); }; /** * Session APIのエラーハンドリング * このAPIがエラーを返した = トークンが無効 なのでトークンを削除してログアウトする */ useEffect(() => { if (error) { console.error(error); localStorage.removeItem(LOCALSTORAGE_KEY_TOKEN); location.reload(); } }, [error]); /** * Edit Modeがオンのとき、Delete Modeを無効化する(誤操作防止) */ useEffect(() => { if (isEditMode) { setDeleteMode(false); } }, [isEditMode]); /** * お知らせ取得 */ useEffect(() => { fetchAll(); }, []); useEffect(() => { if (selectedAnnouncement) { setDraftTitle(selectedAnnouncement.title); setDraftBody(selectedAnnouncement.body); } else { setDraftTitle(''); setDraftBody(''); } }, [selectedAnnouncement]); return !data || !isAnnouncementsLoaded ? (
) : (
{ !data.isAdmin ? (

You are not an administrator and cannot open this page.

) : ( <>

Announcements

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