From 654520ad3a3fdfe7f0a9129493987170f0322dd2 Mon Sep 17 00:00:00 2001 From: juan Date: Wed, 11 Jun 2025 20:36:15 -0400 Subject: [PATCH] cleaned and called numbering per tree when its done --- lib/collapsableEmailsWeb.dart | 234 +++++++++++----------------------- 1 file changed, 75 insertions(+), 159 deletions(-) diff --git a/lib/collapsableEmailsWeb.dart b/lib/collapsableEmailsWeb.dart index b070d6a..0401130 100644 --- a/lib/collapsableEmailsWeb.dart +++ b/lib/collapsableEmailsWeb.dart @@ -1,5 +1,3 @@ -import 'dart:js_interop'; -import 'package:web/web.dart' as web; import 'package:flutter/material.dart'; import 'api_service.dart'; import 'structs.dart'; @@ -25,59 +23,53 @@ class _CollapsableEmailsState extends State { List emailsHTML = []; //html of the emails in the thread // build attachments with the forldar name and id Set _expandedEmails = {}; //open emails - List viewtypeIDs = []; //IDs of the viewtypes, order matters - List heightOfViewTypes = []; //the height of each viewtype + List emailsInThread = []; bool _isLoaded = false; - static bool _isListenerRegistered = false; - static bool left = true; - static bool right = true; - web.EventListener? _listener; List hirarchy = ["h1", "h2", "h3", "h4", "h5", "h6", "p"]; Map hirarchyDict = { "h1": 1, "h2": 2, "h3": 3, "h4": 4, - "h5": 6, - "h6": 7, + "h5": 5, + "h6": 6, "p": 8, "ul": 8, "li": 8, }; List tagsCollected = []; - String markdown = ''; + List allMarkdown = []; List> sentinel = []; int level = 0; AugmentTree zoomTreeRoot = AugmentTree(); - late AugmentTree currentZoomNode; + // late AugmentTree currentZoomNode; + late List currentZoomTree = []; bool zoomOut = false; bool zoomIn = true; + late List threadNodes = []; @override void initState() { super.initState(); + threadNodes = []; + currentZoomTree = []; _markdownConverter(); - // _registerViewFactory(widget.threadHTML); _serializableData(widget.threadIDs); // this - _markdown2Tree(markdown); - _keyListener(); - _buildForZooms(); + _markdown2Tree(allMarkdown); } @override void dispose() { - if (_listener != null) { - web.window.document.removeEventListener('keydown', _listener!); - _listener = null; - _isListenerRegistered = false; - } super.dispose(); } void _markdownConverter() async { - markdown = html2md.convert(widget.threadHTML[0]); + for (int email = 0; email < widget.threadHTML.length; email++) { + String markdown = html2md.convert(widget.threadHTML[email]); + allMarkdown.add(markdown); + } } void _add2Tree(AugmentTree tree, md.Element node2add) { @@ -89,7 +81,6 @@ class _CollapsableEmailsState extends State { //1. a node that comes is lower than the root.children last, if so it goes beneath it if (tree.children.isEmpty) { // new level to be created when totally empty - print('is empty'); tree.children.add(newNode); newNode.parent = tree; } else if (tree.children.isNotEmpty && @@ -128,99 +119,69 @@ class _CollapsableEmailsState extends State { _add2Tree(tree.children.last, node2add); } else if ((hirarchyDict[node2add.tag] ?? -1) == (hirarchyDict[tree.children.last.ogTag] ?? -1)) { - // print("equals??"); tree.children.add(newNode); newNode.parent = tree; } } } - void _markdown2Tree(String text) { + void _markdown2Tree(List text) { print("started markdown2tree"); - final List nakedList = md.Document().parseLines(text.split('\n')); - List pList = []; - List h1List = []; - List h2List = []; - List h3List = []; - List h4List = []; - List h5List = []; - List h6List = []; - - for (var node in nakedList) { - //maybe do an add function, but isn't this it? - if (node is md.Element) { - // print(node.textContent); - AugmentTree temp = AugmentTree(); - temp.data = node.textContent; - temp.ogTag = node.tag; - if (node.tag == 'h1') { - h1List.add(node.textContent); - _add2Tree(zoomTreeRoot, node); - } else if (node.tag == 'h2') { - // i dont add any since i dont have it, maybe the function makes sense - h2List.add(node.textContent); - _add2Tree(zoomTreeRoot, node); // fix this - } else if (node.tag == 'h3') { - h3List.add(node.textContent); - _add2Tree(zoomTreeRoot, node); - } else if (node.tag == 'h4') { - h4List.add(node.textContent); //this broke it - _add2Tree(zoomTreeRoot, node); // change to temp - } else if (node.tag == 'h5') { - h5List.add(node.textContent); - print(node.textContent); - _add2Tree(zoomTreeRoot, node); - } else if (node.tag == 'h6') { - h6List.add(node.textContent); - _add2Tree(zoomTreeRoot, node); // fix this - } else if (node.tag == 'p' || node.tag == 'ul' || node.tag == 'li') { - pList.add(node.textContent); - _add2Tree(zoomTreeRoot, node); // fix this + for (int emailsMD = 0; emailsMD < text.length; emailsMD++) { + final List nakedList = + md.Document().parseLines(text[emailsMD].split('\n')); + zoomTreeRoot = AugmentTree(); + for (var node in nakedList) { + //maybe do an add function, but isn't this it? + if (node is md.Element) { + AugmentTree temp = AugmentTree(); + temp.data = node.textContent; + temp.ogTag = node.tag; + if (node.tag == 'h1') { + // make this O(1) + _add2Tree(zoomTreeRoot, node); + } else if (node.tag == 'h2') { + // i dont add any since i dont have it, maybe the function makes sense + _add2Tree(zoomTreeRoot, node); // fix this + } else if (node.tag == 'h3') { + _add2Tree(zoomTreeRoot, node); + } else if (node.tag == 'h4') { + _add2Tree(zoomTreeRoot, node); // change to temp + } else if (node.tag == 'h5') { + _add2Tree(zoomTreeRoot, node); + } else if (node.tag == 'h6') { + _add2Tree(zoomTreeRoot, node); // fix this + } else if (node.tag == 'p' || node.tag == 'ul' || node.tag == 'li') { + _add2Tree(zoomTreeRoot, node); // fix this + } } } + zoomTreeRoot.addNumbering(); + threadNodes.add(zoomTreeRoot); + currentZoomTree.add(zoomTreeRoot); } - this.sentinel = [h1List, h2List, h3List, h4List, h5List, h6List, pList]; - sentinel.removeWhere((hList) => hList.isEmpty); - currentZoomNode = zoomTreeRoot; if (!mounted) return; setState(() { _isLoaded = true; }); } - void handleKeyDownMD(web.Event event) async { - final keyEvent = event as web.KeyboardEvent; - - if (!mounted) return; - if (keyEvent.key == 'a') { - print("key a"); - setState(() { - level = (level - 1).clamp(0, sentinel.length - 1); - }); - } else if (keyEvent.key == "b") { - print("b"); - setState(() { - level = (level + 1).clamp(0, sentinel.length - 1); - }); - } - } - - void _goToChildren(int index) async { - final target = currentZoomNode.children[index]; + void _goToChildren(int indexThread, int index) async { + final target = currentZoomTree[indexThread].children[index]; if (target.children.isNotEmpty) { setState(() { - currentZoomNode = target; + currentZoomTree[indexThread] = target; }); } else { print("This child has no further children."); } } - void _goToParent() async { - if (currentZoomNode.parent != null) { + void _goToParent(int indexThread) async { + if (currentZoomTree[indexThread].parent != null) { setState(() { - currentZoomNode = currentZoomNode.parent!; + currentZoomTree[indexThread] = currentZoomTree[indexThread].parent!; }); } else { print("Already at root."); @@ -230,82 +191,30 @@ class _CollapsableEmailsState extends State { void _serializableData(String threadID) async { emailsInThread = await ApiService().threadsInSerializable(threadID); print("done thread serializable"); + if (!mounted) return; setState(() { _isLoaded = true; }); } - void handleKeyDownHTML(web.Event event) { - final keyEvent = event as web.KeyboardEvent; - - if (keyEvent.key == 'G') { - print('You pressed the "G" key!'); - final rightPurpleNums = web.document.getElementsByClassName("right"); - _CollapsableEmailsState.right = !_CollapsableEmailsState.right; - final newOpacity = _CollapsableEmailsState.right ? '1.0' : '0.0'; - for (int i = 0; i < rightPurpleNums.length; i++) { - final currentElement = rightPurpleNums.item(i) as web.HTMLElement; - currentElement.style.opacity = newOpacity; - } - } else if (keyEvent.key == 'H') { - print('You pressed the "H" key!'); - final leftPurpleNums = web.document.getElementsByClassName("left"); - _CollapsableEmailsState.left = !_CollapsableEmailsState.left; - final newOpacity = _CollapsableEmailsState.left ? '1.0' : '0.0'; - for (int i = 0; i < leftPurpleNums.length; i++) { - final currentElement = leftPurpleNums.item(i) as web.HTMLElement; - currentElement.style.opacity = newOpacity; - } - } else if (keyEvent.key == 'm') { - print("you pressed 'm'"); - final purpleNums = web.document.getElementsByClassName("purplenumber"); - _CollapsableEmailsState.left = true; - _CollapsableEmailsState.right = true; - - for (int i = 0; i < purpleNums.length; i++) { - final currentElement = purpleNums.item(i) as web.HTMLElement; - currentElement.style.opacity = '1.0'; - } - } else if (keyEvent.key == 'n') { - print("you pressed 'n'"); - final purpleNums = web.document.getElementsByClassName("purplenumber"); - _CollapsableEmailsState.left = false; - _CollapsableEmailsState.right = false; - - for (int i = 0; i < purpleNums.length; i++) { - final currentElement = purpleNums.item(i) as web.HTMLElement; - currentElement.style.opacity = '0.0'; - } - } else if (keyEvent.key == 'w') { - print("you pressed 'w'"); - } - } - - void _keyListener() { - if (_isListenerRegistered) return; - _isListenerRegistered = true; - - // Convert the top-level function to JS-compatible - // _listener = handleKeyDownHTML.toJS; - _listener = handleKeyDownMD.toJS; - - web.window.document.addEventListener('keydown', _listener!); - } - - Widget _buildForZooms({Key? key}) { + Widget _buildForZooms(int indexThread) { + // IF I GIVE IT THE INDEX???? if (!_isLoaded) { return const Center(child: CircularProgressIndicator()); // loading screen } - final canZoomOut = currentZoomNode.parent != null; + + final AugmentTree currentZoomNodeForThisEmail = + currentZoomTree[indexThread]; + + final canZoomOut = currentZoomNodeForThisEmail.parent != null; return ListView.builder( - key: key, - itemCount: currentZoomNode.children.length, + itemCount: currentZoomNodeForThisEmail.children.length, itemBuilder: (context, index) { - final childNode = currentZoomNode.children[index]; + final childNode = currentZoomNodeForThisEmail.children[index]; final canZoomIn = childNode.children.isNotEmpty; - + // currentZoomNodeForThisEmail.addNumbering(); return Padding( padding: const EdgeInsets.symmetric(horizontal: 12.0, vertical: 6.0), child: Material( @@ -323,12 +232,13 @@ class _CollapsableEmailsState extends State { children: [ OutlinedButton( onPressed: - canZoomOut ? () => _goToParent() : null, + canZoomOut ? () => _goToParent(indexThread) : null, child: Icon(Icons.north_west_sharp), ), OutlinedButton( - onPressed: - canZoomIn ? () => _goToChildren(index) : null, + onPressed: canZoomIn + ? () => _goToChildren(indexThread, index) + : null, child: Icon(Icons.south_east_sharp), ), ], @@ -336,12 +246,17 @@ class _CollapsableEmailsState extends State { SizedBox(width: 12.0), Expanded( child: MarkdownBlock( - data: currentZoomNode - .children[index].data, // one string of markdown + data: childNode.data, + // data: currentZoomNode + // .children[index].data, // one string of markdown config: MarkdownConfig .darkConfig, // or lightConfig depending on theme ), ), + Text( + childNode.numbering, + style: TextStyle(color: Color(Colors.purple[400]!.value)), + ) ], ), ), @@ -382,7 +297,8 @@ class _CollapsableEmailsState extends State { minHeight: 100, maxHeight: MediaQuery.of(context).size.height * 0.6, ), - child: _buildForZooms(key: ValueKey(currentZoomNode)), + child: _buildForZooms(index), //show the tree + // child: _buildForZooms(key: ValueKey(currentZoomNode)), ), Divider(), ],