Use floating modal for add-contact from messages page
- replace inline row form with overlay modal - keep Name + Email fields and POST /api/contacts submit
This commit is contained in:
@ -68,7 +68,6 @@ export default function MessagesPage() {
|
|||||||
const whoRaw = m.contact_name || m.callerid || "Unknown caller";
|
const whoRaw = m.contact_name || m.callerid || "Unknown caller";
|
||||||
const num = (m.callerid || "").replace(/[^\d+]/g, "");
|
const num = (m.callerid || "").replace(/[^\d+]/g, "");
|
||||||
const showAdd = !m.contact_name && num;
|
const showAdd = !m.contact_name && num;
|
||||||
const isAdding = addingId === m.id;
|
|
||||||
return (
|
return (
|
||||||
<div key={m.id} className={"card" + (m.is_read ? "" : " unread")}>
|
<div key={m.id} className={"card" + (m.is_read ? "" : " unread")}>
|
||||||
<div className="who">
|
<div className="who">
|
||||||
@ -109,17 +108,9 @@ export default function MessagesPage() {
|
|||||||
</button>
|
</button>
|
||||||
{m.has_audio && <a className="btn" href={"/audio/" + m.id + "?dl=1"}>Download</a>}
|
{m.has_audio && <a className="btn" href={"/audio/" + m.id + "?dl=1"}>Download</a>}
|
||||||
<button className="danger" onClick={() => deleteMsg.mutate(m.id)}>Delete</button>
|
<button className="danger" onClick={() => deleteMsg.mutate(m.id)}>Delete</button>
|
||||||
{showAdd && !isAdding && (
|
{showAdd && (
|
||||||
<button className="add-btn" onClick={() => startAdd(m)}>+ Add to contacts</button>
|
<button className="add-btn" onClick={() => startAdd(m)}>+ Add to contacts</button>
|
||||||
)}
|
)}
|
||||||
{isAdding && (
|
|
||||||
<form className="row" style={{ gap: 6, marginTop: 0 }} onSubmit={(e) => { e.preventDefault(); if (!addName.trim()) return; addContact.mutate({ name: addName.trim(), number: num, email: addEmail.trim() || null }); }}>
|
|
||||||
<input value={addName} onChange={(e) => setAddName(e.target.value)} placeholder="Name" required style={{ flex: 1, minWidth: 120 }} />
|
|
||||||
<input value={addEmail} onChange={(e) => setAddEmail(e.target.value)} placeholder="Email" type="email" style={{ flex: 1, minWidth: 140 }} />
|
|
||||||
<button type="submit" className="primary" disabled={addContact.isPending}>Save</button>
|
|
||||||
<button type="button" className="btn" onClick={() => setAddingId(null)}>Cancel</button>
|
|
||||||
</form>
|
|
||||||
)}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
@ -128,6 +119,24 @@ export default function MessagesPage() {
|
|||||||
{data?.messages?.length === 0 && (
|
{data?.messages?.length === 0 && (
|
||||||
<div className="card empty">No voicemails match your filters.</div>
|
<div className="card empty">No voicemails match your filters.</div>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
{addingId !== null && (
|
||||||
|
<div className="modal-bg open" onClick={() => setAddingId(null)}>
|
||||||
|
<div className="modal" onClick={(e) => e.stopPropagation()}>
|
||||||
|
<h3>Add contact</h3>
|
||||||
|
<form onSubmit={(e) => { e.preventDefault(); if (!addName.trim()) return; const target = data?.messages?.find((x: any) => x.id === addingId); const targetNum = target ? (target.callerid || "").replace(/[^\d+]/g, "") : ""; addContact.mutate({ name: addName.trim(), number: targetNum, email: addEmail.trim() || null }); }}>
|
||||||
|
<label>Name</label>
|
||||||
|
<input value={addName} onChange={(e) => setAddName(e.target.value)} required />
|
||||||
|
<label>Email</label>
|
||||||
|
<input type="email" value={addEmail} onChange={(e) => setAddEmail(e.target.value)} />
|
||||||
|
<div className="row">
|
||||||
|
<button type="button" className="btn" onClick={() => setAddingId(null)}>Cancel</button>
|
||||||
|
<button type="submit" className="primary" disabled={addContact.isPending}>Save</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user