SessionViewScreen constructor

SessionViewScreen(
  1. AppContext ctx,
  2. String nodeId,
  3. String sessionRef, {
  4. TerminalView terminalFactory(
    1. HTMLElement host
    )?,
  5. Future<ShellSessionPort> opener(
    1. int cols,
    2. int rows
    )?,
  6. ClipboardReader? clipboardRead,
  7. ClipboardWriter? clipboardWrite,
})

Builds the screen. Production callers omit the injected hooks.

Implementation

SessionViewScreen(
  this.ctx,
  this.nodeId,
  this.sessionRef, {
  TerminalView Function(web.HTMLElement host)? terminalFactory,
  Future<ShellSessionPort> Function(int cols, int rows)? opener,
  ClipboardReader? clipboardRead,
  ClipboardWriter? clipboardWrite,
}) : terminalFactory = terminalFactory ?? ((host) => XtermTerminalView(host)),
     opener = opener ?? _defaultOpener(ctx, nodeId, sessionRef),
     clipboardRead = clipboardRead ?? defaultClipboardRead,
     clipboardWrite = clipboardWrite ?? defaultClipboardWrite {
  _host = el(
    'div',
    classes: 'terminal-host',
    role: 'group',
    ariaLabel: 'Terminal',
  );
  _status = div(classes: 'row');
  _accessory = div();
  _fsToggle = button(
    '⤢ Fullscreen',
    className: 'ghost',
    ariaLabel: 'Enter fullscreen',
    onClick: _toggleFullscreen,
  );

  element = el(
    'div',
    classes: 'stack terminal-screen',
    children: [
      el(
        'div',
        classes: 'toolbar',
        children: [
          button(
            '← Sessions',
            className: 'ghost',
            onClick: () => ctx.router.go(
              '/nodes/${Uri.encodeComponent(nodeId)}/sessions',
            ),
          ),
          el('div', classes: 'grow'),
          _status,
          _fsToggle,
          button('Detach', onClick: _detach),
          button('Terminate', className: 'danger', onClick: _terminate),
        ],
      ),
      el('div', classes: 'card terminal-card', children: [_host]),
      _accessory,
      // Floating exit button, hidden by CSS unless fullscreen is active.
      button(
        '⤡',
        className: 'icon ghost term-exit-fullscreen',
        ariaLabel: 'Exit fullscreen',
        onClick: _toggleFullscreen,
      ),
    ],
  );

  _status.appendChild(loadingRow('Connecting…'));
  // Lock the page to the viewport so only the terminal content scrolls (no
  // body/rubber-band scroll); removed again on dispose.
  web.document.documentElement?.classList.add('terminal-active');
  // Defer until mounted so the host has layout for the terminal fit.
  scheduleMicrotask(_start);
}