Function: eca-providers--render-provider

eca-providers--render-provider is a natively compiled function defined in eca-providers.el.

Signature

(eca-providers--render-provider PROVIDER SESSION KEYMAP)

Documentation

Render a single PROVIDER card for SESSION using KEYMAP for buttons.

Source Code

;; Defined in /nix/store/jklqzw6pzz6j4jrbv8wy0iwgi7jlrbld-emacs-packages-deps/share/emacs/site-lisp/elpa/eca-20260928.1827/eca-providers.el
(defun eca-providers--render-provider (provider session keymap)
  "Render a single PROVIDER card for SESSION using KEYMAP for buttons."
  (let* ((id (plist-get provider :id))
         (label (or (plist-get provider :label) id))
         (configured (plist-get provider :configured))
         (auth (plist-get provider :auth))
         (status (plist-get auth :status))
         (login-methods (plist-get (plist-get provider :login) :methods))
         (models (plist-get provider :models))
         (model-count (length models))
         (expanded (and eca-providers--expanded
                        (member id eca-providers--expanded)))
         (has-login (and login-methods (> (length login-methods) 0)))
         (is-authed (member status '("authenticated" "expiring" "expired" "local"))))
    ;; Line 1: indicator + name + status label
    (let ((start (point)))
      (insert " " (eca-providers--status-indicator status) " ")
      (insert (propertize label 'face 'bold))
      (let ((status-label (eca-providers--status-label status (plist-get auth :source))))
        (insert (make-string (max 1 (- 35 (length label))) ?\s))
        (insert status-label))
      (insert "\n")
      ;; Line 2: auth info (if any)
      (when-let* ((info (eca-providers--auth-info-text auth)))
        (insert "   " (propertize info 'face 'eca-providers-auth-info-face) "\n"))
      ;; Provider settings
      (eca-providers--render-settings (plist-get provider :settings) "   ")
      ;; Line 3: models count + actions
      (when configured
        (let* ((toggle-fn (lambda (&rest _)
                            (interactive)
                            (eca-providers--toggle-expand)))
               (expand-km (let ((km (make-composed-keymap (make-sparse-keymap) keymap)))
                            (define-key km (kbd "RET") toggle-fn)
                            (define-key km (kbd "<return>") toggle-fn)
                            (define-key km (kbd "TAB") toggle-fn)
                            (define-key km (kbd "<tab>") toggle-fn)
                            (when eca-buttons-allow-mouse
                              (define-key km (kbd "<mouse-1>") toggle-fn))
                            km))
               (models-text (concat "   "
                                    (propertize (if expanded "▾" "▸") 'face 'bold)
                                    " "
                                    (propertize (format "%d model%s" model-count (if (= model-count 1) "" "s"))
                                                'face 'font-lock-doc-face))))
          (insert (propertize models-text
                              'keymap expand-km
                              'pointer 'hand
                              'help-echo "RET / TAB / mouse-1: expand/collapse")))
        ;; Action buttons
        (let ((btn-col (max (+ (current-column) 2) 40))
              (source (plist-get auth :source)))
          (insert (make-string (max 1 (- btn-col (current-column))) ?\s))
          (cond
           ((and is-authed (string= source "login"))
            (insert (eca-buttonize
                     keymap
                     (propertize "Logout"
                                 'font-lock-face 'eca-providers-button-logout-face)
                     (lambda ()
                       (when (y-or-n-p (format "Logout from %s? " label))
                         (eca-api-request-async session
                           :method "providers/logout"
                           :params (list :provider id)
                           :success-callback (lambda (_) (eca-info "Logged out of %s" label))
                           :error-callback (lambda (err) (eca-warn "Logout failed: %s" err))))))))
           ((and has-login (not is-authed))
            (let ((btn-label (if (eca-providers--has-oauth-login-p login-methods) "Login" "Add Key")))
              (insert (eca-buttonize
                       keymap
                       (propertize btn-label
                                   'font-lock-face 'eca-providers-button-face)
                       (lambda () (eca-providers--do-login session id nil))))))))
        (insert "\n")
        ;; Expanded models
        (when (and expanded (> model-count 0))
          (eca-providers--render-models models)))
      ;; Unconfigured: show login/add-key button
      (when (and (not configured) has-login)
        (let ((btn-label (if (eca-providers--has-oauth-login-p login-methods) "Login" "Add Key")))
          (insert "   "
                  (eca-buttonize
                   keymap
                   (propertize btn-label
                               'font-lock-face 'eca-providers-button-face)
                   (lambda () (eca-providers--do-login session id nil)))
                  "\n")))
      ;; Tag the whole card with provider id
      (put-text-property start (point) 'eca-provider-id id))
    (insert "\n")))