UNPKG

@teachinglab/omd

Version:

omd

336 lines (262 loc) 11.4 kB
import { omdColor } from "./omdColor.js"; import { omdNumber } from "./omdNumber.js"; import { omdVariable } from "./omdVariable.js"; import { omdTerm } from "./omdTerm.js"; import { omdOperator } from "./omdOperator.js"; import { omdExpression } from "./omdExpression.js"; import { omdPowerExpression } from "./omdPowerExpression.js"; import { omdRationalExpression } from "./omdRationalExpression.js"; import { omdEquation } from "./omdEquation.js"; import { omdFunction } from "./omdFunction.js"; import { omdNumberLine } from "./omdNumberLine.js"; import { omdTapeDiagram } from "./omdTapeDiagram.js"; import { omdBalanceHanger } from "./omdBalanceHanger.js"; import { omdNumberTile } from "./omdNumberTile.js"; import { omdRatioChart } from "./omdRatioChart.js"; import { omdCoordinatePlane } from "./omdCoordinatePlane.js"; import { omdSpinner } from "./omdSpinner.js"; import { omdRightTriangle } from "./omdShapes.js"; import { omdIsoscelesTriangle } from "./omdShapes.js"; import { omdRectangle } from "./omdShapes.js"; import { omdEllipse } from "./omdShapes.js"; import { omdCircle } from "./omdShapes.js"; import { omdRegularPolygon } from "./omdShapes.js"; import { omdProblem } from "./omdProblem.js"; import { jsvgGroup, jsvgTextBox, jsvgTextArea, jsvgButton, jsvgEllipse } from "@teachinglab/jsvg"; export class omdAppCanvas extends jsvgGroup { constructor() { // initialization super(); console.log("canvas!!!"); window.theApp = this; window.addEventListener("resize", this.onResize.bind(this) ); window.addEventListener("keydown", this.onKeydown.bind(this) ); // upward shift this.setPosition( 0, -50 ); // AI stuff this.inputField = new jsvgTextArea(); this.inputField.setPlaceholderText( "please enter your request here" ); this.inputField.setWidthAndHeight( 600, 100 ); this.inputField.setPosition( 100, 100 ); this.inputField.setFontFamily( "Albert Sans" ); this.inputField.setFontColor( "black" ); this.inputField.setFontSize( 18 ); this.inputField.div.style.backgroundColor = "#FFDD00"; //omdColor.lightGray; this.inputField.div.style.border = "0px"; this.inputField.div.style.padding = "10px"; this.addChild( this.inputField ); this.inputButton = new jsvgButton(); this.inputButton.setText( "submit" ); this.inputButton.setFillColor( omdColor.lightGray ); this.inputButton.setPosition( 100, 220 ); this.inputButton.setClickCallback( this.handleSubmitClick.bind(this) ); this.addChild( this.inputButton ); this.responseText = new jsvgTextBox(); this.responseText.setText(""); this.responseText.setWidthAndHeight( 400, 30 ); this.responseText.setPosition( 100, 260 ); this.responseText.setFontFamily( "Albert Sans" ); this.responseText.setFontColor( omdColor.darkGray ); this.responseText.setFontSize( 14 ); this.addChild( this.responseText ); this.AIholder = new jsvgGroup(); this.AIholder.setPosition( 100, 350 ); this.addChild( this.AIholder ); // resize this.onResize(); } onKeydown( event ) { } update() { super.update(); window.equatorScale = 1.5; } onResize() { } handleSubmitClick( B ) { this.responseText.setText( "working..." ); var text = this.inputField.getText(); console.log( text ); this.fetchAI( text ); } handleAIResponse( jsonData ) { var N = null; if ( jsonData.omdType == "number" ) { var N = new omdNumber(); } if ( jsonData.omdType == "variable" ) { var N = new omdVariable(); } if ( jsonData.omdType == "operator" ) { var N = new omdOperator(); } if ( jsonData.omdType == "term" ) { var N = new omdTerm(); } if ( jsonData.omdType == "expression" ) { var N = new omdExpression(); } if ( jsonData.omdType == "powerExpression" ) { var N = new omdPowerExpression(); } if ( jsonData.omdType == "rationalExpression" ) { var N = new omdRationalExpression(); } if ( jsonData.omdType == "function" ) { var N = new omdFunction(); } if ( jsonData.omdType == "equation" ) { var N = new omdEquation(); } if ( jsonData.omdType == "numberLine" ) { var N = new omdNumberLine(); } if ( jsonData.omdType == "balanceHanger" ) { var N = new omdBalanceHanger(); N.setPosition( 150, 0 ); } if ( jsonData.omdType == "tapeDiagram" ) { var N = new omdTapeDiagram(); } if ( jsonData.omdType == "numberTile" ) { var N = new omdNumberTile(); } if ( jsonData.omdType == "ratioChart" ) { var N = new omdRatioChart(); } if ( jsonData.omdType == "coordinatePlane" ) { var N = new omdCoordinatePlane(); } if ( jsonData.omdType == "spinner" ) { var N = new omdSpinner(); } if ( jsonData.omdType == "rightTriangle" ) { var N = new omdRightTriangle(); } if ( jsonData.omdType == "isoscelesTriangle" ) { var N = new omdIsoscelesTriangle(); } if ( jsonData.omdType == "rectangle" ) { var N = new omdRectangle(); } if ( jsonData.omdType == "ellipse" ) { var N = new omdEllipse(); } if ( jsonData.omdType == "circle" ) { var N = new omdCircle(); } if ( jsonData.omdType == "regularPolygon" ) { var N = new omdRegularPolygon(); } if ( jsonData.omdType == "problem" ) { var N = new omdProblem(); } // load from json N.loadFromJSON( jsonData ); // add to the AI holder var E = new omdCanvasEntry(); E.addObject( N ); this.AIholder.addChild( E ); return E; } fetchAI( topic ) { // console.log( "=== fetchAI ===" ); // console.log( topic ); // consturct url based on topic var urlToFetch = ""; if ( window.location.hostname.includes("localhost") ) urlToFetch = "http://localhost:8888/.netlify/functions/ai-omd-lookup/"; else urlToFetch = "https://teaching-lab-omd.netlify.app/.netlify/functions/ai-omd-lookup/"; // add topic urlToFetch += "?topic='" + topic + "'"; // console.log( "URL: " + urlToFetch ); // fetch the data fetch( urlToFetch ) .then((response) => response.text()) .then((body) => { // console.log("==== raw data ======"); // console.log( body ); // console.log("==== preParseData ======"); var preParseData = body; preParseData = preParseData.replaceAll( "`", "" ); preParseData = preParseData.replaceAll( "json", "" ); console.log( "=== pre-parse ===" ); console.log( preParseData ); try { var data = JSON.parse( preParseData ); console.log( "=== parsedData ===" ); console.log( data ); this.responseText.setText( "" ); this.handleAIResponse( data ); } catch { // if parsing failed, try again console.log( preParseData ); console.log(">>> data not parse-able"); this.responseText.setText( "An error occured. Please try again." ); } }); } } class omdCanvasEntry extends jsvgGroup { constructor() { // initialization super(); this.clickRect = new jsvgEllipse(); this.clickRect.setWidthAndHeight( 40,40 ); this.clickRect.setPosition( 10,10 ); this.clickRect.setFillColor( "transparent" ); this.addChild( this.clickRect ); this.clickRect.svgObject.onmousedown = this.handleMouseDown.bind( this ); this.clickRect.svgObject.ontouchstart = this.handleMouseDown.bind( this ); this.clickRect.svgObject.style.cursor = "pointer"; this.backRect = new jsvgEllipse(); this.backRect.setWidthAndHeight( 20,20 ); this.backRect.setPosition( 10,10 ); this.backRect.setFillColor( "#DDDDDD" ); this.addChild( this.backRect ); this.backRect.svgObject.onmousedown = this.handleMouseDown.bind( this ); this.backRect.svgObject.ontouchstart = this.handleMouseDown.bind( this ); this.backRect.svgObject.style.cursor = "pointer"; } addObject( obj ) { this.theObject = obj; obj.setPosition( 10,10 ); this.addChild( obj ); //var W = this.theObject.width; //var H = this.theObject.height; //this.backRect.setWidthAndHeight( W+20,H+20 ); //this.backRect.setWidthAndHeight( 20,20 ); } handleMouseDown( event ) { if ( ! this.visible ) return; // select // window.theApp.setActiveEntry( this ); // handle dragging function handleMouseMove(event) { event.preventDefault(); // get mouseX and mouseY var mouseX, mouseY; if ( event.touches && event.touches.length >= 1 ) { mouseX = event.touches[0].clientX; mouseY = event.touches[0].clientY; } else { mouseX = event.clientX; mouseY = event.clientY; } // calculate dX and dY if ( this.oldMouseX && this.oldMouseY ) { var dX = mouseX - this.oldMouseX; var dY = mouseY - this.oldMouseY; // dX /= window.dragScale; // adjust for drag scale // dY /= window.dragScale; // adjust for drag scale var pX = this.xpos + dX; var pY = this.ypos + dY; // move the circle this.setPosition( pX, pY ); } // set oldMouseX and oldMouseY this.oldMouseX = mouseX; this.oldMouseY = mouseY; } // on mouse up function handleMouseUp(event) { // set active dot // window.theApp.setActiveEntry( this ); // this forces an update to the detail panel // update data in firebase // this.updateEntryInDatabase(); // console.log("handleMouseUp"); // this.activeDot = null; window.onmousemove = null; window.ontouchmove = null; window.onmouseup = null; window.ontouchend = null; this.oldMouseX = 0; this.oldMouseY = 0; // this.dotHilite.hide(); } window.onmousemove = handleMouseMove.bind(this); window.ontouchmove = handleMouseMove.bind(this);; window.onmouseup = handleMouseUp.bind(this); window.ontouchend = handleMouseUp.bind(this);; } }