skillok meeting
d0d9d7d1b42763f9297927180d851d27dda50dcd
Перейти к файлу
Код
meeting srcviewsnew.ts
anc Переименование говорящих и экран «Новая запись» (#13) - Имя говорящего в расшифровке — кнопка: нажал, вписал «Ольга», Enter — подпись сменилась во всех его репликах, а имя целым словом — в конспекте, задачах и других результатах («Я» там не трогается). - «Записать встречу» в меню, «Записать» в шапке и на главной открывают экран «Новая запись»: что запишется, совет про наушники, предупреждение участникам с копированием. Запись начинается только кнопкой «Начать запись». Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> 87935b9 30 сентября 2026 г.
new.ts
// Экран «Новая запись»: «Записать встречу» ведёт сюда, а не запускает запись
// сразу (решение владельца 01.10.2026). Здесь видно, что запишется, совет про
// наушники и предупреждение участникам; запись начинается только кнопкой
// «Начать запись».

import { api } from "../api";
import { esc } from "../dom";
import type { Scope } from "../scope";
import { copy, startRecording, state } from "../state";

export async function renderNew(root: HTMLElement, scope: Scope): Promise<void> {
  // Запись уже идёт — вторую не начать, показываем идущую.
  if (state.recording) {
    location.replace(`#/m/${encodeURIComponent(state.recording.meeting_id)}`);
    return;
  }
  const view = await api.getSettings();
  if (!scope.alive) return;

  if (!view.capture_supported) {
    root.innerHTML = `
      <div class="page">
        <section class="card">
          <h1>Новая запись</h1>
          <p>На этой системе запись не поддерживается. Добавьте готовый аудиофайл — перетащите его в окно или выберите через меню.</p>
        </section>
      </div>`;
    return;
  }

  root.innerHTML = `
    <div class="page">
      <section class="card prep">
        <h1>Новая запись</h1>
        <div class="prep-block">
          <p class="field-label">Запишется</p>
          <ul class="prep-list">
            <li><span class="dot"></span>ваш микрофон</li>
            <li><span class="dot"></span>весь звук компьютера — голоса собеседников в Zoom, Google Meet, Телемосте и где угодно</li>
          </ul>
        </div>
        <p class="muted">Лучше в наушниках — так голоса собеседников не попадут в микрофон второй раз.</p>
        <div class="prep-block">
          <p class="field-label">Предупредите участников</p>
          <blockquote class="prep-warning">${esc(view.settings.warning_text)}</blockquote>
          <div class="actions">
            <button class="link-btn" data-copy-warning>Скопировать для чата встречи</button>
            <a class="link-btn" href="#/settings">Изменить текст</a>
          </div>
        </div>
        ${
          view.openrouter_key
            ? ""
            : `<p class="notice">Записать можно и без ИИ. Чтобы потом расшифровать, подключите его в <a href="#/settings">настройках</a>.</p>`
        }
        <button class="ui-btn hero-btn" data-start>Начать запись</button>
      </section>
    </div>`;
  root.querySelector("[data-copy-warning]")!.addEventListener("click", () =>
    copy(view.settings.warning_text, "Предупреждение скопировано — вставьте его в чат встречи"),
  );
  root.querySelector<HTMLButtonElement>("[data-start]")!.addEventListener("click", async (e) => {
    const b = e.currentTarget as HTMLButtonElement;
    b.disabled = true;
    b.textContent = "Начинаю…";
    await startRecording();
    // Не началась — ошибку уже показало сообщение внизу, кнопку возвращаем.
    if (scope.alive && !state.recording) {
      b.disabled = false;
      b.textContent = "Начать запись";
    }
  });
}