summaryrefslogtreecommitdiff
path: root/moneyjsx/src/support-models.tsx
blob: 2afd726c49efe3ab2e90e55f4a60742bd3f9a5a3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import $ from "jquery";
import * as JSX from './jsx';
import * as API from "./api";
import * as user from "./user";
import * as util from "./util";

import { Page, GroupBox, Spinner, Dropdown, DropdownItem } from './components';

export default function Models() {
  if( !API.models.length ) {
    const modelTimeout = () => {
      if( API.models.length )
        JSX.navigateSilent( "/models" );
      else
        setTimeout( modelTimeout, 100 );
    }

    modelTimeout();

    return <Page>
      <div>
        <Spinner />
      </div>
    </Page>
  }

  let model = API.models[0].name;
  if( user.is_loggedin && user.settings.site_prefs && user.settings.site_prefs.model )
    model = user.settings.site_prefs.model!;

  return <Page>
    <GroupBox title="Models" style="width: 85%">
      <div id="selector-wrapper">
        <Dropdown title={ model } id="model-selector" inline>
          { API.models.map( ( m ) => <DropdownItem onclick={ changeModel }>{ m.name }</DropdownItem> ) }
        </Dropdown>
      </div>

      <div id="model-list"><ModelInfo model={ API.getModelFromName( model ) } /></div>
    </GroupBox>
  </Page>
}

function changeModel( e: Event ) {
  const el = $( e.target );
  const txt = el.text();
  console.log( txt );
  const m = API.getModelFromName( txt );
  console.log( m );

  $( "#model-list" ).children().replaceWith(
    <ModelInfo model={ m } />
  );

  $( "#model-selector" ).text( m.name );
}


function ModelInfo( props: any ) {
  const m = props.model as API.Model;
  return <div class="model-item">
    <div class="model-header" style="text-align: left">
      <h2 style="padding: 0px 10px 20px; margin: 0;">
        { m.name }
      </h2>
    </div>
    <div class="model-body">
      <div class="model-capabilities">
        <span class={ m.capabilities.web    ? "green" : "red" }>Web           { m.capabilities.web ? '✔' : '✘' }</span>
        <span class={ m.capabilities.notes  ? "green" : "red" }>Notes         { m.capabilities.notes ? '✔' : '✘' }</span>
        <span class={ m.capabilities.vision ? "green" : "red" }>Vision        { m.capabilities.vision ? '✔' : '✘' }</span>
        <span class={ m.capabilities.remind ? "green" : "red" }>Memory Lookup { m.capabilities.remind ? '✔' : '✘' }</span>
      </div>
      <div class="model-description">
        { m.description.full }
      </div>
      <div id="model-license-wrapper"></div>
      <br />
    </div>
    <ModelLicense>
      { util.escapeHtml( m.license ) }
    </ModelLicense>
  </div>;
}

let license_open = false;
function ModelLicense( props: any ) {
  const collapseToggle = () => {
    const el = $( "#model-license" );
    let list  = el.find( '.tool-call-list' );
    let btn   = el.find( '.tool-call-collapse' );

    license_open = list.css( 'display' ) == 'block';
    if( !license_open ) {
      list.css( 'display', 'block' );
      btn.text( '-' );
    } else {
      list.css( 'display', 'none' );
      btn.text( '+' );
    }
  };

  let el = <div class='tool-call' id="model-license" onclick={ collapseToggle }>
      <div class='tool-call-title-wrapper'>
        <span class='tool-call-title'>License</span>
        <span class='tool-call-collapse'>{ license_open ? '-' : '+' }</span>
      </div>
      <div class='tool-call-list' style={ `display: ${ license_open ? 'block' : 'none' }; white-space: pre-line; text-align: left` }>
        { props.children }
      </div>
    </div>;

  return el;
}