Files
wiki/memory/2026-05-05.md
2026-05-06 00:10:01 +03:00

8.4 KiB
Raw Blame History

2026-05-05 — Дневник

Enduro Trails — работа над прототипом

Кнопка «Поделиться» → «Скачать GPX»

  • Слава попросил убрать кастомный диалог «Поделиться» (Telegram/WhatsApp)
  • Оставить только скачивание GPX через downloadGPX()
  • Иконка заменена на download-стрелку (стрелка вниз + линия) в том же стиле что и другие кнопки header
  • HTML уже обновлён: onclick="downloadGPX()", иконка download
  • Из app.js удалены функции: shareRoute, closeShareDialog, shareTelegram, shareWhatsApp, shareNative
  • Из app.css удалены стили: .share-dialog, .sd-*, #share-dialog

Drag-and-drop для точек маршрута

  • Слава попросил добавить иконку «перетаскивания» (grip) в каждый wl-item
  • Дев-агент добавил grip SVG (6 кружков) и touch-drag логику
  • Логика вынесена в _initWaypointDragHandles(list) с общими функциями startDrag/moveDrag/endDrag
  • Проблема: на десктопе не работало — дев сделал только touch-события
  • Фикс: добавлены mouse-события (mousedown/mousemove/mouseup) с document-level listeners для корректного завершения drag за пределами списка

Баг: «Добавить точку» не работала в баре маршрутов

  • Причина: addWaypointMode() не устанавливала routeMode = true
  • При закрытом/свайпнутом sheet routeMode мог быть false
  • Клик на карте проверяет if (!routeMode) return — и игнорировал добавление
  • Фикс: в addWaypointMode() добавить routeMode = true перед установкой addingWaypoint = true

Технические заметки

  • Web Share API требует HTTPS — на HTTP молча падает, даже на Android Chrome
  • Кастомные диалоги через DOM работают всегда, но Слава предпочёл простоту (только скачать)
  • Mouse drag: важно вешать mousemove/mouseup на document, а не на list — иначе drag ломается при выходе курсора за пределы элемента

2026-05-05 — Дневник

Enduro Trails — работа над прототипом

Кнопка «Поделиться» → «Скачать GPX»

  • Слава попросил убрать кастомный диалог «Поделиться» (Telegram/WhatsApp)
  • Оставить только скачивание GPX через downloadGPX()
  • Иконка заменена на download-стрелку (стрелка вниз + линия) в том же стиле что и другие кнопки header
  • HTML уже обновлён: onclick="downloadGPX()", иконка download
  • Из app.js удалены функции: shareRoute, closeShareDialog, shareTelegram, shareWhatsApp, shareNative
  • Из app.css удалены стили: .share-dialog, .sd-*, #share-dialog

Drag-and-drop для точек маршрута

  • Слава попросил добавить иконку «перетаскивания» (grip) в каждый wl-item
  • Дев-агент добавил grip SVG (6 кружков) и touch-drag логику
  • Логика вынесена в _initWaypointDragHandles(list) с общими функциями startDrag/moveDrag/endDrag
  • Проблема: на десктопе не работало — дев сделал только touch-события
  • Фикс: добавлены mouse-события (mousedown/mousemove/mouseup) с document-level listeners для корректного завершения drag за пределами списка

Баг: «Добавить точку» не работала в баре маршрутов

  • Причина: addWaypointMode() не устанавливала routeMode = true
  • При закрытом/свайпнутом sheet routeMode мог быть false
  • Клик на карте проверяет if (!routeMode) return — и игнорировал добавление
  • Фикс: в addWaypointMode() добавить routeMode = true перед установкой addingWaypoint = true

Расстояние по маршруту между точками

  • Слава попросил показывать расстояние по маршруту (не по прямой) для каждого сегмента
  • Бэкенд не возвращает legs — только общий distance_m
  • Решение: функция getRouteSegmentDistances() — snap waypoints к геометрии маршрута, суммировать haversine по точкам геометрии
  • Проблема 1: сумма сегментов не совпадала с route.distance_m из-за неточного snap
  • Решение: масштабировать сегменты пропорционально чтобы сумма = route.distance_m
  • Проблема 2: при смене варианта маршрута расстояния не обновлялись
  • Фикс: добавить renderWaypointsList() в selectRoute() и selectMiniRoute()

Дублированные сообщения в Telegram

  • Слава заметил что от меня приходят дублированные сообщения
  • Анализ: streaming.mode: "partial" шлёт промежуточные сообщения каждые 2 сек вместо edit
  • Попробовали progress — тоже дублировало (маппится в partial на Telegram)
  • Финальное решение: streaming.mode: "off" — только финальное сообщение, без превью
  • Конфиг обновлён, hot-reload применился (лог: config hot reload applied)

Расстояние по маршруту — финальный фикс

  • Корневая проблема: renderWaypointsList() вызывается ДО завершения debounceBuildRoute() (async)
  • В момент рендера routeResults пустой → fallback на haversine по прямой (52 км вместо 104 км)
  • Фикс: добавить renderWaypointsList() сразу после drawRouteResults() — когда маршрут уже построен
  • Масштабирование сегментов оставлено: сумма сегментов = route.distance_m точно (diff=0 м)
  • Форматирование приведено к toFixed(1) везде для визуального совпадения

voice-tts скилл — дублированные сообщения

  • send_voice.sh пытался отправить через openclaw message send И через MEDIA: директиву одновременно
  • Результат: в Telegram приходило сообщение с путём к файлу + голосовое
  • Фикс: убрать блок openclaw message send из скрипта, оставить только генерацию OGG
  • Доставка только через MEDIA: директиву в ответе ассистента

Технические заметки

  • Web Share API требует HTTPS — на HTTP молча падает, даже на Android Chrome
  • Кастомные диалоги через DOM работают всегда, но Слава предпочёл простоту (только скачать)
  • Mouse drag: важно вешать mousemove/mouseup на document, а не на list — иначе drag ломается при выходе курсора за пределы элемента
  • OSRM бэкенд не возвращает legs — только общий distance_m. Сегменты считаем на фронте через snap к геометрии
  • streaming.mode: "progress" — лучший режим для Telegram: нет промежуточных сообщений, только финальный ответ