Доска день 2: удаление, шаринг и стартаппарат
Вчера доска заработала. Сегодня начал её допиливать до состояния, в котором ей можно пользоваться без мата. Список задач был простой:
Удаление заметок внутри доски.
Удаление самой доски.
Кнопка «Поделиться» прямо в доске (а не только при создании).
Ссылка, которая открывает доску сразу в Mini App, а не в браузере.
Сначала запилил API для удаления:
// DELETE /api/boards/:hash/notes/:id const boardNoteDeleteMatch = pathname.match(/^\/api\/boards\/([a-f0-9]+)\/notes\/(\d+)$/); if (boardNoteDeleteMatch && req.method === 'DELETE') { const ok = boardsApi.deleteNote(boardNoteDeleteMatch[1], parseInt(boardNoteDeleteMatch[2])); res.writeHead(ok ? 200 : 404, { 'Content-Type': 'application/json' }); res.end(JSON.stringify({ ok })); return; } // DELETE /api/boards/:hash const boardDeleteMatch = pathname.match(/^\/api\/boards\/([a-f0-9]+)$/); if (boardDeleteMatch && req.method === 'DELETE') { const hash = boardDeleteMatch[1]; const board = db.prepare('SELECT id FROM boards WHERE hash = ?').get(hash); if (board) { db.prepare('DELETE FROM board_notes WHERE board_id = ?').run(board.id); db.prepare('DELETE FROM boards WHERE id = ?').run(board.id); } res.writeHead(200, { 'Content-Type': 'application/json' }); res.end(JSON.stringify({ ok: true })); return; }
На фронте добавил контекстное меню (троеточие) для каждой заметки и для самой доски. Чтобы удалять можно было не через API-запросы вручную, а кнопкой.
Заодно прикрутил «Поделиться» прямо в открытой доске. Теперь ссылку можно кинуть в любой чат, не выходя из доски.
Ссылка вида https://tgnotion.bothost.tech/boards/<hash> открывала доску в браузере, а не в Mini App. Надо было сделать так, чтобы она открывалась прямо в Telegram, без лишних переходов.
Сначала попробовал через https://t.me/Telega_notion_bot/boards/<hash> — бот ругался, что приложение не найдено.
Потом через ?startapp=boards_<hash> — бот открывался, но показывал мои личные заметки, а не нужную доску.
Потому что startapp передаёт параметр во фронт, но я его не читал.
Надо было добавить обработку в app2.js:
const startParam = tg.initDataUnsafe?.start_param || new URLSearchParams(location.search).get('tgWebAppStartParam'); if (startParam?.startsWith('boards_')) { viewBoard(startParam.slice('boards_'.length)); }
Теперь ссылка формата https://t.me/Telega_notion_bot?startapp=boards_%3Chash%3E сразу открывает нужную доску в Mini App. Без браузера, без лишних кликов.
А ещё мы почти сделали доску прямо в чате.
Идея: бот отправляет в чат сообщение с названием доски и списком заметок. Под сообщением кнопки: «Добавить заметку», «Удалить», «Обновить». При нажатии бот обновляет это же сообщение.
Это не Mini App, но доска висит в чате как живое сообщение. Прямо там можно работать. Технически это возможно через editMessageText и инлайн-клавиатуру.
Пока оставил на потом. Но идея крутая — сделаю как-нибудь на досуге.
Удаление заметок и досок — есть.
Кнопка «Поделиться» внутри доски — есть.
Ссылка открывает доску сразу в Mini App — есть.
Доска в чате — в планах.
Особая благодарность @Vijay Taitoo ☭ за свежий взгляд и помощь.
Коллективный интеллект иногда решает быстрее, чем ИИ.