-
-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathedit_note.tsx
105 lines (98 loc) · 3.31 KB
/
edit_note.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
import { Component, createSignal } from 'solid-js';
import BaseModal from './base';
import { Book, Note, noteIntoUpdateNote, User } from '../../core/types';
import { createStore } from 'solid-js/store';
import { toSlug } from '../../core/helpers';
import { useApi } from '../../contexts/ApiProvider';
import { useNavigate } from '@solidjs/router';
import { apiErrorIntoToast, useToast } from '../../contexts/ToastProvider';
import { ApiError } from '../../core/api';
import Icon from '../icon';
type UpdateNoteModalProps = {
onClose: (note?: Note) => void
onDeleteClose: (noteId: string) => void
user: User
book: Book
note: Note
}
const UpdateNoteModal: Component<UpdateNoteModalProps> = (props) => {
const { api } = useApi()
const { pushToast } = useToast()
const navigate = useNavigate()
const [form, setForm] = createStore(noteIntoUpdateNote(props.note))
const [loading, setLoading] = createSignal(false)
const onSubmit = async (ev: Event) => {
ev.preventDefault()
setLoading(true)
let result = await api().updateNote(props.note.id, form)
setLoading(false)
if (result instanceof ApiError) pushToast(apiErrorIntoToast(result, "saving note"))
else {
navigate(`/${props.user.username}/${props.book.slug}/${form.slug}`)
props.onClose({
...props.note,
name: form.name || props.note.name,
slug: form.slug || props.note.slug,
})
}
}
const onDelete = async () => {
setLoading(true)
let result = await api().deleteNote(props.note.id)
setLoading(false)
if (result instanceof ApiError) pushToast(apiErrorIntoToast(result, "deleting note"))
else {
navigate(`/${props.user.username}/${props.book.slug}`)
props.onDeleteClose(props.note.id)
}
}
return (
<BaseModal title="Update Note">
<form onsubmit={onSubmit}>
<label class="form-control">
<span class="label"><span class="label-text">Title</span></span>
<input
oninput={(ev) => setForm({
name: ev.currentTarget.value,
})}
value={form.name}
class="input input-bordered w-full"
type="text"
placeholder="e.g. My Amazing Note"
required
/>
</label>
<label class="form-control">
<span class="label"><span class="label-text">Slug</span></span>
<input
oninput={(ev) => setForm({
slug: toSlug(ev.currentTarget.value)
})}
value={form.slug}
class="input input-bordered input-sm w-full"
type="text"
placeholder="e.g. my-amazing-note"
pattern="(?:[a-z0-9]|-)+"
required
/>
</label>
<div class="modal-action">
<button
onclick={onDelete}
class="btn btn-outline btn-error"
disabled={loading()}
type="button">
<Icon name="trash" />
Delete
</button>
<button class="btn btn-primary" disabled={loading()} classList={{ loading: loading() }} type="submit">
<Icon name="save" />
Save
</button>
<button onclick={() => props.onClose()} class="btn" type="button">Cancel</button>
</div>
</form>
</BaseModal>
);
};
export default UpdateNoteModal;