From 50528de0f2f5216831f38dde86bd1e0916720906 Mon Sep 17 00:00:00 2001 From: juan Date: Fri, 23 May 2025 16:14:46 -0400 Subject: [PATCH] email view , WIP --- lib/emailView.dart | 3 + lib/emailViewAndroid.dart | 95 +++++++++++++++ lib/emailViewStub.dart | 39 ++++++ lib/emailViewWeb.dart | 241 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 378 insertions(+) create mode 100644 lib/emailView.dart create mode 100644 lib/emailViewAndroid.dart create mode 100644 lib/emailViewStub.dart create mode 100644 lib/emailViewWeb.dart diff --git a/lib/emailView.dart b/lib/emailView.dart new file mode 100644 index 0000000..61c9bf8 --- /dev/null +++ b/lib/emailView.dart @@ -0,0 +1,3 @@ +export 'emailViewStub.dart' + if (dart.library.io) 'emailViewAndroid.dart' + if (dart.library.js_interop) 'emailViewWeb.dart'; \ No newline at end of file diff --git a/lib/emailViewAndroid.dart b/lib/emailViewAndroid.dart new file mode 100644 index 0000000..d6d6981 --- /dev/null +++ b/lib/emailViewAndroid.dart @@ -0,0 +1,95 @@ +import 'package:crab_ui/collapsableEmailsAndroid.dart'; +import 'package:flutter/material.dart'; +// import 'dart:ui_web' as ui; +// import 'augment.dart'; +// // import 'dart:js_interop' as js; //eventually for manipulating css +// import 'package:pointer_interceptor/pointer_interceptor.dart'; +// import 'collapsableEmails.dart'; +// import 'api_service.dart'; + +class EmailView extends StatefulWidget { + final List emailContent; + final String from; + final String name; + final String to; + final String subject; + final String date; + final String id; + final List messages; + + const EmailView({ + Key? key, + required this.emailContent, + required this.from, + required this.name, // tf is name + required this.to, + required this.subject, + required this.date, + required this.id, + required this.messages, + }) : super(key: key); + @override + _EmailViewState createState() => _EmailViewState(); +} + +class _EmailViewState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text(widget.name), + ), + body: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + Row( + children: [ + Expanded( + child: Text( + widget.subject, + style: TextStyle(fontSize: 15), + overflow: TextOverflow.visible, + softWrap: true, + ), + ), + ], + ), + Row( + children: [ + Text( + 'from ${widget.name}', + style: TextStyle(fontSize: 8), + ), + Text( + '<${widget.from}>', + style: TextStyle(fontSize: 8), + ), + Spacer(), + Text( + widget.date, + textAlign: TextAlign.right, + ) + ], + ), + Row( + children: [ + Text( + 'to ${widget.to.toString()}', + style: TextStyle(fontSize: 8), + ) + ], + ), + Expanded( + child: CollapsableEmails( + thread: widget.messages, + threadHTML: widget.emailContent, + threadIDs: widget.id, + ), + ), + ], + ), + ) + ); + } +} \ No newline at end of file diff --git a/lib/emailViewStub.dart b/lib/emailViewStub.dart new file mode 100644 index 0000000..5c5f657 --- /dev/null +++ b/lib/emailViewStub.dart @@ -0,0 +1,39 @@ +import 'package:flutter/material.dart'; + + +class EmailView extends StatefulWidget { + final List emailContent; + final String from; + final String name; + final String to; + final String subject; + final String date; + final String id; + final List messages; + + const EmailView({ + Key? key, + required this.emailContent, + required this.from, + required this.name, + required this.to, + required this.subject, + required this.date, + required this.id, + required this.messages, + }) : super(key: key); + @override + _EmailViewState createState() => _EmailViewState(); +} + +class _EmailViewState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + body: Center( + child: Text(" emailview stub, not supported") + ) + ); + } + +} \ No newline at end of file diff --git a/lib/emailViewWeb.dart b/lib/emailViewWeb.dart new file mode 100644 index 0000000..08551eb --- /dev/null +++ b/lib/emailViewWeb.dart @@ -0,0 +1,241 @@ +import 'package:flutter/material.dart'; +import 'dart:ui_web' as ui; +import 'augment.dart'; +// import 'dart:js_interop' as js; //eventually for manipulating css +import 'package:pointer_interceptor/pointer_interceptor.dart'; +import 'collapsableEmails.dart'; +import 'api_service.dart'; + + +class EmailView extends StatefulWidget { + final List emailContent; + final String from; + final String name; + final String to; + final String subject; + final String date; + final String id; + final List messages; + + const EmailView({ + Key? key, + required this.emailContent, + required this.from, + required this.name, + required this.to, + required this.subject, + required this.date, + required this.id, + required this.messages, + }) : super(key: key); + @override + _EmailViewState createState() => _EmailViewState(); +} + +class _EmailViewState extends State { + //html css rendering thing + late Key iframeKey; + late String currentContent; + late String viewTypeId; //make this a list too??? + Future>>? _markerPositionsFuture; + // TextEditingController _jumpController = TextEditingController(); + final hardcodedMarkers = [ + {'id': 'marker1', 'x': 50, 'y': 100}, + {'id': 'marker2', 'x': 150, 'y': 200}, + {'id': 'marker3', 'x': 250, 'y': 300}, + ]; + + @override + void initState() { + super.initState(); + print("thread id? ${widget.id}"); + List currentContent = widget + .emailContent; //html of the email/ actually entire thread, gives me little space to play in between + // i wonder if the other attributes change? because if so i have to add like some zooms in and out of the emails, as in collapse + // _registerViewFactory(currentContent); + } + + // void _registerViewFactory(List currentContent) { // i think this doesnt work anymore + // setState(() { //update to do item per item + // // each item to have itsviewtype ID + // // is this necessarey here?? + + // //could just move to collapsable + + // viewTypeId = 'iframe-${DateTime.now().millisecondsSinceEpoch}'; + // final emailHTML = web.document.createElement('div') as web.HTMLDivElement + // ..id = viewTypeId + // ..innerHTML = currentContent[0].toJS; // temporarily index because it has to do all of them + // emailHTML.style + // ..width = '100%' + // ..height = '100%' + // ..overflow = 'auto' + // ..scrollBehavior = 'smooth'; + + // ui.platformViewRegistry.registerViewFactory( + // viewTypeId, + // (int viewId) => emailHTML, + // ); + // }); + // } + + void _scrollToNumber(String spanId) { + AugmentClasses.handleJump(spanId); + } + + // TODO: void _invisibility(String ) //to make purple numbers not visible + + @override + Widget build(BuildContext context) { + // print("thread id ${widget.id}"); + ApiService.currThreadID = widget.id; + return Scaffold( + appBar: AppBar( + title: Text(widget.name), + ), + body: Stack( + children: [ + Column( + children: [ + EmailToolbar( + onJumpToSpan: _scrollToNumber, + onButtonPressed: () => {}, + // AugmentClasses.handleJump(viewTypeId, '1'); + // print("button got pressed?"); + + // _registerViewFactory(r""" + //

Welcome to My Website

+ //

This is a simple HTML page.

+ //

What is HTML?

+ //

HTML (HyperText Markup Language) is the most basic building~ block of the Web. It defines the meaning and structure of web content. Other technologies besides HTML are generally used to describe a web page's appearance/presentation (CSS) or functionality/behavior (JavaScript).

+ //

Here's a simple list:

+ //
    + //
  • HTML elements are the building blocks of HTML pages
  • + //
  • HTML uses tags like <tag> to organize and format content
  • + //
  • CSS is used with HTML to style pages
  • + //
+ //

Copyright © 2023

+ // """); + // print("change"); + // widget.emailContent = r" + + // + ), + Row( + // title of email + children: [ + Text( + widget.subject, + style: TextStyle(fontSize: 30), + ), + ], + ), + Row( + children: [ + Text( + 'from ${widget.name}', + style: TextStyle(fontSize: 18), + ), + Text( + '<${widget.from}>', + style: TextStyle(fontSize: 18), + ), + Spacer(), + Text( + '${widget.date}', + textAlign: TextAlign.right, + ) + ], + ), + // TODO: make a case where if one of these is the user's email it just says me :))))) + Row( + children: [ + Text( + 'to ${widget.to.toString()}', + style: TextStyle(fontSize: 15), + ) + ], + ), + Expanded( + child: CollapsableEmails( + //change here + thread: widget.messages, //this wont work in serializable + threadHTML: widget.emailContent, + threadIDs: widget.id, + ), + ), + // Expanded( + // child: HtmlElementView( + // key: UniqueKey(), + // viewType: viewTypeId, + // ), + // ), + ], + ), + + // Overlay widgets dynamically based on marker positions + // FutureBuilder>>( + // future: _markerPositionsFuture, + // builder: (context, snapshot) { + // print("FutureBuilder state: ${snapshot.connectionState}"); + // if (snapshot.connectionState == ConnectionState.waiting) { + // return Center(child: CircularProgressIndicator()); + // } + // if (snapshot.hasError) { + // print("Error in FutureBuilder: ${snapshot.error}"); + // return Center(child: Text('error loading markers')); + // } + // if (snapshot.hasData && snapshot.data != null) { + // final markers = snapshot.data!; + // return Stack( + // children: markers.map((marker) { + // return Positioned( + // left: marker['x'].toDouble(), + // top: marker['y'].toDouble(), + // child: GestureDetector( + // onTap: () { + // print('Tapped on ${marker['id']}'); + // }, + // child: Container( + // width: 50, + // height: 50, + // color: Colors.red, + // child: Center( + // child: Text( + // marker['id'], + // style: TextStyle(color: Colors.white), + // ), + // ), + // ), + // ), + // ); + // }).toList(), + // ); + // } + + // return SizedBox.shrink(); // No markers found + // }, + // ), + // Red widget overlay + // Positioned( + // left: 8, // Adjust based on your desired position + // top: 100 + 44 + 5, // Adjust based on your desired position + // child: IgnorePointer( + // ignoring: true, // Ensures the iframe remains interactive + // child: Container( + // color: Colors.red, + // width: 100, + // height: 50, + // child: Center( + // child: Text( + // 'Overlay', + // style: TextStyle(color: Colors.white), + // ), + // ), + // ), + // ), + // ), + ], + )); + } +}