Допиливая TG Notion
Доска день 2: удаление, шаринг и стартаппарат
Вчера доска заработала. Сегодня начал её допиливать до состояния, в котором ей можно пользоваться без мата. Список задач был простой:
Удаление заметок внутри доски.
Удаление самой доски.
Кнопка «Поделиться» прямо в доске (а не только при создании).
Ссылка, которая открывает доску сразу в Mini App, а не в браузере.
Сначала запилил API для удаления:
javascript
// 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:
javascript
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 ☭ за свежий взгляд и помощь.
Коллективный интеллект иногда решает быстрее, чем ИИ.
Тестируй:
https://t.me/Telega_notion_bot

ИТ-проекты пикабушников
767 постов3.5K подписчиков
Правила сообщества
0. Запрещены посты вне тематики сообщества
1. Уважайте труд людей, пишите только конструктивную критику,
2. Не выкладывайте информацию по своему проекту чаще 2ух раз в месяц