phanpy/src/components/list-add-edit.jsx

173 lines
5.3 KiB
React
Raw Normal View History

2023-04-05 15:30:26 +00:00
import { useEffect, useRef, useState } from 'preact/hooks';
import { api } from '../utils/api';
import supports from '../utils/supports';
2023-04-05 15:30:26 +00:00
2023-04-20 08:10:57 +00:00
import Icon from './icon';
import MenuConfirm from './menu-confirm';
2023-04-20 08:10:57 +00:00
function ListAddEdit({ list, onClose }) {
2023-04-05 15:30:26 +00:00
const { masto } = api();
2023-08-14 03:22:42 +00:00
const [uiState, setUIState] = useState('default');
2023-04-05 15:30:26 +00:00
const editMode = !!list;
const nameFieldRef = useRef();
const repliesPolicyFieldRef = useRef();
const exclusiveFieldRef = useRef();
2023-04-05 15:30:26 +00:00
useEffect(() => {
if (editMode) {
nameFieldRef.current.value = list.title;
repliesPolicyFieldRef.current.value = list.repliesPolicy;
if (exclusiveFieldRef.current) {
exclusiveFieldRef.current.checked = list.exclusive;
}
2023-04-05 15:30:26 +00:00
}
}, [editMode]);
const supportsExclusive = supports('@mastodon/list-exclusive');
2023-04-05 15:30:26 +00:00
return (
<div class="sheet">
2023-04-20 08:10:57 +00:00
{!!onClose && (
<button type="button" class="sheet-close" onClick={onClose}>
<Icon icon="x" />
</button>
)}{' '}
2023-04-05 15:30:26 +00:00
<header>
<h2>{editMode ? 'Edit list' : 'New list'}</h2>
</header>
<main>
<form
class="list-form"
onSubmit={(e) => {
e.preventDefault(); // Get form values
const formData = new FormData(e.target);
const title = formData.get('title');
const repliesPolicy = formData.get('replies_policy');
const exclusive = formData.get('exclusive') === 'on';
2023-04-05 15:30:26 +00:00
console.log({
title,
repliesPolicy,
exclusive,
2023-04-05 15:30:26 +00:00
});
2023-08-14 03:22:42 +00:00
setUIState('loading');
2023-04-05 15:30:26 +00:00
(async () => {
try {
let listResult;
if (editMode) {
listResult = await masto.v1.lists.update(list.id, {
title,
replies_policy: repliesPolicy,
exclusive,
2023-04-05 15:30:26 +00:00
});
} else {
listResult = await masto.v1.lists.create({
title,
replies_policy: repliesPolicy,
exclusive,
2023-04-05 15:30:26 +00:00
});
}
console.log(listResult);
2023-08-14 03:22:42 +00:00
setUIState('default');
2023-04-20 08:10:57 +00:00
onClose?.({
2023-04-05 15:30:26 +00:00
state: 'success',
list: listResult,
});
} catch (e) {
console.error(e);
2023-08-14 03:22:42 +00:00
setUIState('error');
2023-04-05 15:30:26 +00:00
alert(
editMode ? 'Unable to edit list.' : 'Unable to create list.',
);
}
})();
}}
>
<div class="list-form-row">
<label for="list-title">
Name{' '}
<input
ref={nameFieldRef}
type="text"
id="list-title"
name="title"
required
disabled={uiState === 'loading'}
/>
</label>
</div>
<div class="list-form-row">
<select
ref={repliesPolicyFieldRef}
name="replies_policy"
required
disabled={uiState === 'loading'}
>
<option value="list">Show replies to list members</option>
<option value="followed">Show replies to people I follow</option>
<option value="none">Don't show replies</option>
</select>
</div>
{supportsExclusive && (
<div class="list-form-row">
<label class="label-block">
<input
ref={exclusiveFieldRef}
type="checkbox"
name="exclusive"
disabled={uiState === 'loading'}
/>{' '}
Hide posts on this list from Home/Following
</label>
</div>
)}
2023-04-05 15:30:26 +00:00
<div class="list-form-footer">
<button type="submit" disabled={uiState === 'loading'}>
{editMode ? 'Save' : 'Create'}
</button>
{editMode && (
<MenuConfirm
2023-04-05 15:30:26 +00:00
disabled={uiState === 'loading'}
align="end"
menuItemClassName="danger"
confirmLabel="Delete this list?"
2023-04-05 15:30:26 +00:00
onClick={() => {
// const yes = confirm('Delete this list?');
// if (!yes) return;
2023-08-14 03:22:42 +00:00
setUIState('loading');
2023-04-05 15:30:26 +00:00
(async () => {
try {
await masto.v1.lists.remove(list.id);
2023-08-14 03:22:42 +00:00
setUIState('default');
2023-04-20 08:10:57 +00:00
onClose?.({
2023-04-05 15:30:26 +00:00
state: 'deleted',
});
} catch (e) {
console.error(e);
2023-08-14 03:22:42 +00:00
setUIState('error');
2023-04-05 15:30:26 +00:00
alert('Unable to delete list.');
}
})();
}}
>
<button
type="button"
class="light danger"
disabled={uiState === 'loading'}
>
Delete
</button>
</MenuConfirm>
2023-04-05 15:30:26 +00:00
)}
</div>
</form>
</main>
</div>
);
}
export default ListAddEdit;