0
0
Fork 0

お知らせを削除できるように

This commit is contained in:
Xeltica 2021-10-11 19:55:50 +09:00
parent 4f6ce715c7
commit 8cc8366823

View file

@ -4,7 +4,7 @@ import { LOCALSTORAGE_KEY_TOKEN } from '../const';
import { useGetSessionQuery } from '../services/session'; import { useGetSessionQuery } from '../services/session';
import { Skeleton } from './Skeleton'; import { Skeleton } from './Skeleton';
import { IAnnouncement } from '../../common/types/announcement'; 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'; import { Card } from './Card';
@ -15,11 +15,11 @@ export const AdminPage: React.VFC = () => {
const [selectedAnnouncement, selectAnnouncement] = useState<IAnnouncement | null>(null); const [selectedAnnouncement, selectAnnouncement] = useState<IAnnouncement | null>(null);
const [isAnnouncementsLoaded, setAnnouncementsLoaded] = useState(false); const [isAnnouncementsLoaded, setAnnouncementsLoaded] = useState(false);
const [isEditMode, setEditMode] = useState(false); const [isEditMode, setEditMode] = useState(false);
const [isDeleteMode, setDeleteMode] = useState(false);
const [draftTitle, setDraftTitle] = useState(''); const [draftTitle, setDraftTitle] = useState('');
const [draftBody, setDraftBody] = useState(''); const [draftBody, setDraftBody] = useState('');
const submitAnnouncement = async () => { const submitAnnouncement = async () => {
try {
if (selectedAnnouncement) { if (selectedAnnouncement) {
await $put('announcements', { await $put('announcements', {
id: selectedAnnouncement.id, id: selectedAnnouncement.id,
@ -33,11 +33,16 @@ export const AdminPage: React.VFC = () => {
}); });
} }
selectAnnouncement(null); selectAnnouncement(null);
setDraftTitle('');
setDraftBody('');
setEditMode(false); setEditMode(false);
fetchAll(); fetchAll();
} catch (e: unknown) { };
// todo
} const deleteAnnouncement = ({id}: IAnnouncement) => {
$delete('announcements', {id}).then(() => {
fetchAll();
});
}; };
const fetchAll = () => { const fetchAll = () => {
@ -61,6 +66,15 @@ export const AdminPage: React.VFC = () => {
} }
}, [error]); }, [error]);
/**
* Edit ModeがオンのときDelete Modeを無効化する
*/
useEffect(() => {
if (isEditMode) {
setDeleteMode(false);
}
}, [isEditMode]);
/** /**
* *
*/ */
@ -94,22 +108,39 @@ export const AdminPage: React.VFC = () => {
<> <>
<article> <article>
<h2>Announcements</h2> <h2>Announcements</h2>
{!isEditMode && (
<label className="input-switch mb-1">
<input type="checkbox" checked={isDeleteMode} onChange={e => setDeleteMode(e.target.checked)}/>
<div className="switch"></div>
<span>Delete Mode</span>
</label>
)}
<Card bodyClassName={isEditMode ? '' : 'px-0'}> <Card bodyClassName={isEditMode ? '' : 'px-0'}>
{ !isEditMode ? ( { !isEditMode ? (
<>
{isDeleteMode && <div className="ml-2 text-danger">Click the item to delete.</div>}
<div className="large menu"> <div className="large menu">
{announcements.map(a => ( {announcements.map(a => (
<button className="item fluid" key={a.id} onClick={() => { <button className="item fluid" key={a.id} onClick={() => {
if (isDeleteMode) {
deleteAnnouncement(a);
} else {
selectAnnouncement(a); selectAnnouncement(a);
setEditMode(true); setEditMode(true);
}
}}> }}>
{isDeleteMode && <i className="icon bi bi-trash text-danger" />}
{a.title} {a.title}
</button> </button>
))} ))}
{!isDeleteMode && (
<button className="item fluid" onClick={() => setEditMode(true)}> <button className="item fluid" onClick={() => setEditMode(true)}>
<i className="icon bi bi-plus"/ > <i className="icon bi bi-plus"/ >
Create New Create New
</button> </button>
)}
</div> </div>
</>
) : ( ) : (
<div className="vstack"> <div className="vstack">
<label className="input-field"> <label className="input-field">
@ -121,10 +152,10 @@ export const AdminPage: React.VFC = () => {
<textarea className="input-field" value={draftBody} rows={10} onChange={e => setDraftBody(e.target.value)}/> <textarea className="input-field" value={draftBody} rows={10} onChange={e => setDraftBody(e.target.value)}/>
</label> </label>
<div className="hstack" style={{justifyContent: 'flex-end'}}> <div className="hstack" style={{justifyContent: 'flex-end'}}>
<button className="btn primary" onClick={() => submitAnnouncement()} disabled={!draftTitle || !draftBody}> <button className="btn primary" onClick={submitAnnouncement} disabled={!draftTitle || !draftBody}>
Submit Submit
</button> </button>
<button className="btn danger" onClick={() => { <button className="btn" onClick={() => {
selectAnnouncement(null); selectAnnouncement(null);
setEditMode(false); setEditMode(false);
}}> }}>