WIP: android/ios-adaption feature, markdown, and augment #6
118
lib/augment.dart
118
lib/augment.dart
@ -3,9 +3,11 @@ import 'package:crab_ui/attachmentDownload.dart';
|
|||||||
import 'package:crab_ui/collapsableEmails.dart';
|
import 'package:crab_ui/collapsableEmails.dart';
|
||||||
import 'package:crab_ui/structs.dart';
|
import 'package:crab_ui/structs.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:go_router/go_router.dart';
|
||||||
import 'package:pointer_interceptor/pointer_interceptor.dart';
|
import 'package:pointer_interceptor/pointer_interceptor.dart';
|
||||||
import 'attachmentWidget.dart';
|
import 'attachmentWidget.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
|
import 'routingHandler.dart';
|
||||||
|
|
||||||
class EmailToolbar extends StatefulWidget {
|
class EmailToolbar extends StatefulWidget {
|
||||||
final Function(String) onJumpToNumbering;
|
final Function(String) onJumpToNumbering;
|
||||||
@ -14,6 +16,7 @@ class EmailToolbar extends StatefulWidget {
|
|||||||
final Function(String) onFiltering;
|
final Function(String) onFiltering;
|
||||||
final List<String> emails;
|
final List<String> emails;
|
||||||
final String subject;
|
final String subject;
|
||||||
|
late AugmentTree? rootAugment;
|
||||||
|
|
||||||
EmailToolbar({
|
EmailToolbar({
|
||||||
Key? key,
|
Key? key,
|
||||||
@ -23,6 +26,7 @@ class EmailToolbar extends StatefulWidget {
|
|||||||
required this.onFiltering,
|
required this.onFiltering,
|
||||||
required this.emails,
|
required this.emails,
|
||||||
required this.subject,
|
required this.subject,
|
||||||
|
required this.rootAugment,
|
||||||
}) : super(key: key);
|
}) : super(key: key);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@ -33,7 +37,7 @@ class _DynamicClassesAugment extends State<EmailToolbar> {
|
|||||||
String selectedClass = 'Class 1';
|
String selectedClass = 'Class 1';
|
||||||
TextEditingController _jumpController = TextEditingController();
|
TextEditingController _jumpController = TextEditingController();
|
||||||
TextEditingController _viewspecsController = TextEditingController();
|
TextEditingController _viewspecsController = TextEditingController();
|
||||||
AugmentClasses? localAugment;
|
AugmentTree? localAugment;
|
||||||
List<SerializableMessage>? emailsInThread;
|
List<SerializableMessage>? emailsInThread;
|
||||||
|
|
||||||
// late final FocusNode _JumpItemfocusNode;
|
// late final FocusNode _JumpItemfocusNode;
|
||||||
@ -55,6 +59,7 @@ class _DynamicClassesAugment extends State<EmailToolbar> {
|
|||||||
// _viewSpecsfocusNode.addListener(() {
|
// _viewSpecsfocusNode.addListener(() {
|
||||||
// setState(() => _viewSpecsHasFocus = _viewSpecsfocusNode.hasFocus);
|
// setState(() => _viewSpecsHasFocus = _viewSpecsfocusNode.hasFocus);
|
||||||
// });
|
// });
|
||||||
|
localAugment = widget.rootAugment;
|
||||||
_serializableData(widget.emails);
|
_serializableData(widget.emails);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -236,7 +241,9 @@ class _DynamicClassesAugment extends State<EmailToolbar> {
|
|||||||
child: Text('Create Link'),
|
child: Text('Create Link'),
|
||||||
),
|
),
|
||||||
ElevatedButton(
|
ElevatedButton(
|
||||||
onPressed: AugmentClasses.handleFind,
|
// onPressed: () => localAugment!.handlePaste(context),
|
||||||
|
onPressed: () =>
|
||||||
|
AugmentClasses().handlePaste(context, widget.emails[0]),
|
||||||
child: Text('Paste Link'),
|
child: Text('Paste Link'),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
@ -249,6 +256,11 @@ class _DynamicClassesAugment extends State<EmailToolbar> {
|
|||||||
class AugmentClasses {
|
class AugmentClasses {
|
||||||
CollapsableEmails? localCollapsable;
|
CollapsableEmails? localCollapsable;
|
||||||
String? nameOfDocument;
|
String? nameOfDocument;
|
||||||
|
AugmentTree? rootTree;
|
||||||
|
|
||||||
|
void setRootTree(AugmentTree aTree) {
|
||||||
|
rootTree = aTree;
|
||||||
|
}
|
||||||
|
|
||||||
// AugmentClasses(CollapsableEmails localCollapsable) {
|
// AugmentClasses(CollapsableEmails localCollapsable) {
|
||||||
// localCollapsable = localCollapsable;
|
// localCollapsable = localCollapsable;
|
||||||
@ -519,6 +531,26 @@ class AugmentClasses {
|
|||||||
print("Find button pressed");
|
print("Find button pressed");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AugmentTree? _findAugmentNode(String target, AugmentTree node, int index) {
|
||||||
|
// so the ideqa is that since the numbering its quite linear, meaning that it tells you where it goes,
|
||||||
|
// thus i've thought the amount of max moves are only the length of the string of the target
|
||||||
|
//e.g. if we have a target of 1e9, its steps are the same or time complexity as if it were 1a1, or 99z99
|
||||||
|
// since each number or letter tells us which is the index in this array, genius ik
|
||||||
|
// thus first one needs another function from converting from alphabetical to numbers
|
||||||
|
if (node.numbering[index] == target[index]) {
|
||||||
|
_findAugmentNode(target, node.children[index++], index++);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool _checkValidTarget(String target) {
|
||||||
|
target = target.trim();
|
||||||
|
//find if the target exists,
|
||||||
|
//recursive?
|
||||||
|
_findAugmentNode(target, rootTree!, 0);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
_copyLink(String anchor, String target, String format, String viewspecs,
|
_copyLink(String anchor, String target, String format, String viewspecs,
|
||||||
String nameOfDocument) {
|
String nameOfDocument) {
|
||||||
String form = "$anchor < $nameOfDocument, $target :$viewspecs >";
|
String form = "$anchor < $nameOfDocument, $target :$viewspecs >";
|
||||||
@ -631,7 +663,13 @@ class AugmentClasses {
|
|||||||
actions: [
|
actions: [
|
||||||
ElevatedButton(
|
ElevatedButton(
|
||||||
onPressed: () => {
|
onPressed: () => {
|
||||||
_copyLink(anchorController.text, targetController.text, format, viewspecsController.text,
|
// _checkValidTarget(targetController.text),
|
||||||
|
|
||||||
|
_copyLink(
|
||||||
|
anchorController.text,
|
||||||
|
targetController.text,
|
||||||
|
format,
|
||||||
|
viewspecsController.text,
|
||||||
nameOfDocument),
|
nameOfDocument),
|
||||||
Navigator.of(context).pop()
|
Navigator.of(context).pop()
|
||||||
},
|
},
|
||||||
@ -644,6 +682,72 @@ class AugmentClasses {
|
|||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<void> handlePaste(BuildContext context, String emailID) async {
|
||||||
|
final TextEditingController gotoLink = TextEditingController();
|
||||||
|
|
||||||
|
Routinghandler localRouting;
|
||||||
|
await showDialog(
|
||||||
|
context: context,
|
||||||
|
builder: (context) => AlertDialog(
|
||||||
|
title: Text("GOTO Link"),
|
||||||
|
content: SizedBox(
|
||||||
|
height: 400,
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
Row(
|
||||||
|
children: [
|
||||||
|
Text("Paste link to go: "),
|
||||||
|
SizedBox(
|
||||||
|
width: 350,
|
||||||
|
child: TextField(
|
||||||
|
controller: gotoLink,
|
||||||
|
maxLines: 1,
|
||||||
|
autofocus: true,
|
||||||
|
decoration: const InputDecoration(
|
||||||
|
border: OutlineInputBorder(),
|
||||||
|
),
|
||||||
|
))
|
||||||
|
],
|
||||||
|
)
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
actions: [
|
||||||
|
ElevatedButton(
|
||||||
|
onPressed: () {
|
||||||
|
print('pressed');
|
||||||
|
// i need this shit to be processed into args
|
||||||
|
print("email_id given $emailID");
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
final localRouting =
|
||||||
|
Routinghandler(gotoLink.text, emailID);
|
||||||
|
final String subject =
|
||||||
|
localRouting.docName; // This is your :subject
|
||||||
|
final String target =
|
||||||
|
localRouting.target; // This is your :target
|
||||||
|
final String viewspecs =
|
||||||
|
localRouting.viewspecs; // This is your :viewspecs
|
||||||
|
final String finalEmailID = emailID;
|
||||||
|
|
||||||
|
final encodedSubject = Uri.encodeComponent(subject);
|
||||||
|
final encodedTarget = Uri.encodeComponent(target);
|
||||||
|
final encodedViewspecs = Uri.encodeComponent(viewspecs);
|
||||||
|
final encodedEmailID = Uri.encodeComponent(finalEmailID);
|
||||||
|
print("emailID $encodedEmailID");
|
||||||
|
String link =
|
||||||
|
"/email/$encodedSubject/$encodedTarget/$encodedViewspecs/$encodedEmailID";
|
||||||
|
GoRouter.of(context).go(link);
|
||||||
|
},
|
||||||
|
child: Text("OK")),
|
||||||
|
ElevatedButton(
|
||||||
|
onPressed: () {
|
||||||
|
Navigator.of(context).pop();
|
||||||
|
},
|
||||||
|
child: Text("Cancel"))
|
||||||
|
],
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
static void handleStop() {
|
static void handleStop() {
|
||||||
print("Stop button pressed");
|
print("Stop button pressed");
|
||||||
}
|
}
|
||||||
@ -655,12 +759,8 @@ class AugmentClasses {
|
|||||||
static void invisibility(String htmlClass) {}
|
static void invisibility(String htmlClass) {}
|
||||||
|
|
||||||
static Future<void> JumpButton(BuildContext context) async {
|
static Future<void> JumpButton(BuildContext context) async {
|
||||||
// FocusNode textFieldFocusNode = FocusNode();
|
|
||||||
|
|
||||||
// AugmentClasses.disableIframePointerEvents();
|
|
||||||
await showDialog(
|
await showDialog(
|
||||||
barrierDismissible: true,
|
barrierDismissible: true,
|
||||||
// barrierColor: Colors.yellow,
|
|
||||||
context: context,
|
context: context,
|
||||||
builder: (context) => AlertDialog(
|
builder: (context) => AlertDialog(
|
||||||
title: Text('Jump Item:'),
|
title: Text('Jump Item:'),
|
||||||
@ -892,10 +992,6 @@ class AugmentClasses {
|
|||||||
await showDialog(
|
await showDialog(
|
||||||
context: context,
|
context: context,
|
||||||
builder: (BuildContext dialogContext) {
|
builder: (BuildContext dialogContext) {
|
||||||
// => Container(
|
|
||||||
// height: 150,
|
|
||||||
// width: 300,
|
|
||||||
// child:
|
|
||||||
return StatefulBuilder(builder:
|
return StatefulBuilder(builder:
|
||||||
(BuildContext statefulBuilderContext, StateSetter setState) {
|
(BuildContext statefulBuilderContext, StateSetter setState) {
|
||||||
return AlertDialog(
|
return AlertDialog(
|
||||||
|
@ -1,8 +1,6 @@
|
|||||||
import 'package:english_words/english_words.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'api_service.dart';
|
import 'api_service.dart';
|
||||||
import 'structs.dart';
|
import 'structs.dart';
|
||||||
import 'package:html2md/html2md.dart' as html2md;
|
|
||||||
import 'package:markdown_widget/markdown_widget.dart';
|
import 'package:markdown_widget/markdown_widget.dart';
|
||||||
import 'package:markdown/markdown.dart' as md;
|
import 'package:markdown/markdown.dart' as md;
|
||||||
|
|
||||||
@ -14,6 +12,7 @@ class CollapsableEmails extends StatefulWidget {
|
|||||||
final String? targetJumpNumbering;
|
final String? targetJumpNumbering;
|
||||||
final String? targetViewspecs;
|
final String? targetViewspecs;
|
||||||
final String? targetFiltering;
|
final String? targetFiltering;
|
||||||
|
final String? nameOfDocument;
|
||||||
|
|
||||||
const CollapsableEmails({
|
const CollapsableEmails({
|
||||||
required this.thread,
|
required this.thread,
|
||||||
@ -23,10 +22,15 @@ class CollapsableEmails extends StatefulWidget {
|
|||||||
this.targetJumpNumbering,
|
this.targetJumpNumbering,
|
||||||
this.targetViewspecs,
|
this.targetViewspecs,
|
||||||
this.targetFiltering,
|
this.targetFiltering,
|
||||||
|
this.nameOfDocument,
|
||||||
});
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
State<CollapsableEmails> createState() => _CollapsableEmailsState();
|
State<CollapsableEmails> createState() => _CollapsableEmailsState();
|
||||||
|
|
||||||
|
AugmentTree? getAugmentRoot() {
|
||||||
|
return _CollapsableEmailsState().getAugmentRoot();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class _CollapsableEmailsState extends State<CollapsableEmails> {
|
class _CollapsableEmailsState extends State<CollapsableEmails> {
|
||||||
@ -63,7 +67,7 @@ class _CollapsableEmailsState extends State<CollapsableEmails> {
|
|||||||
static bool leftNumbering = true;
|
static bool leftNumbering = true;
|
||||||
static bool rightNumbering = true;
|
static bool rightNumbering = true;
|
||||||
bool showWhole = false;
|
bool showWhole = false;
|
||||||
List<AugmentTree> queryResults = [];
|
List<AugmentTree> queryResults = []; //results of conducting filtering
|
||||||
bool _isFilteringActive = false;
|
bool _isFilteringActive = false;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@ -99,6 +103,14 @@ class _CollapsableEmailsState extends State<CollapsableEmails> {
|
|||||||
super.dispose();
|
super.dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
List<SerializableMessage> getThreads() {
|
||||||
|
return emailsInThread;
|
||||||
|
}
|
||||||
|
|
||||||
|
AugmentTree getAugmentRoot() {
|
||||||
|
return zoomTreeRoot;
|
||||||
|
}
|
||||||
|
|
||||||
void _add2Tree(AugmentTree tree, md.Element node2add) {
|
void _add2Tree(AugmentTree tree, md.Element node2add) {
|
||||||
// adds node to its corresponding place
|
// adds node to its corresponding place
|
||||||
AugmentTree newNode = AugmentTree();
|
AugmentTree newNode = AugmentTree();
|
||||||
@ -252,6 +264,8 @@ class _CollapsableEmailsState extends State<CollapsableEmails> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Widget _buildForZooms(int indexThread) {
|
Widget _buildForZooms(int indexThread) {
|
||||||
|
// index of email in thread, currentZoomTree,
|
||||||
|
//
|
||||||
if (!_isLoaded) {
|
if (!_isLoaded) {
|
||||||
return const Center(child: CircularProgressIndicator()); // loading screen
|
return const Center(child: CircularProgressIndicator()); // loading screen
|
||||||
}
|
}
|
||||||
@ -568,7 +582,6 @@ class _CollapsableEmailsState extends State<CollapsableEmails> {
|
|||||||
maxHeight: MediaQuery.of(context).size.height * 0.6,
|
maxHeight: MediaQuery.of(context).size.height * 0.6,
|
||||||
),
|
),
|
||||||
child: _buildForZooms(index), //show the tree
|
child: _buildForZooms(index), //show the tree
|
||||||
// child: _buildForZooms(key: ValueKey(currentZoomNode)),
|
|
||||||
),
|
),
|
||||||
Divider(),
|
Divider(),
|
||||||
],
|
],
|
||||||
|
205
lib/routingHandler.dart
Normal file
205
lib/routingHandler.dart
Normal file
@ -0,0 +1,205 @@
|
|||||||
|
import 'package:crab_ui/collapsableEmails.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:go_router/go_router.dart';
|
||||||
|
import 'package:markdown/markdown.dart' as md;
|
||||||
|
import 'package:markdown_widget/markdown_widget.dart';
|
||||||
|
import 'api_service.dart';
|
||||||
|
|
||||||
|
class Routinghandler extends StatefulWidget {
|
||||||
|
Routinghandler(String link, emailID) {
|
||||||
|
bool anchorDone = false;
|
||||||
|
|
||||||
|
bool docNameDone = false;
|
||||||
|
|
||||||
|
bool viewspecsDone = false;
|
||||||
|
|
||||||
|
bool targetDone = false;
|
||||||
|
|
||||||
|
for (int letter = 0; letter < link.length; letter++) {
|
||||||
|
if (!anchorDone) {
|
||||||
|
if (link[letter] != '<') {
|
||||||
|
//when the anchor hasnt been dissected
|
||||||
|
anchor += link[letter];
|
||||||
|
} else {
|
||||||
|
anchorDone = true;
|
||||||
|
}
|
||||||
|
} else if (!docNameDone) {
|
||||||
|
if (link[letter] != ',') {
|
||||||
|
//when the docName hasnt been dissected
|
||||||
|
docName += link[letter];
|
||||||
|
} else {
|
||||||
|
docNameDone = true;
|
||||||
|
}
|
||||||
|
} else if (!targetDone) {
|
||||||
|
if (link[letter] != ':') {
|
||||||
|
target += link[letter];
|
||||||
|
} else {
|
||||||
|
targetDone = true;
|
||||||
|
}
|
||||||
|
} else if (!viewspecsDone) {
|
||||||
|
if (link[letter] != '>') {
|
||||||
|
//when the docName hasnt been dissected
|
||||||
|
viewspecs += link[letter];
|
||||||
|
} else {
|
||||||
|
viewspecsDone = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
anchor = anchor.trim();
|
||||||
|
docName = docName.trim();
|
||||||
|
target = target.trim();
|
||||||
|
viewspecs = viewspecs.trim();
|
||||||
|
print("inside constructor uwu $emailID");
|
||||||
|
emailID = emailID.trim();
|
||||||
|
}
|
||||||
|
Routinghandler.fromParameters(String anchor, String docName, String target,
|
||||||
|
String viewspecs, String emailID) {
|
||||||
|
this.anchor = anchor;
|
||||||
|
this.docName = docName;
|
||||||
|
this.viewspecs = viewspecs;
|
||||||
|
this.target = target;
|
||||||
|
this.emailID = emailID;
|
||||||
|
}
|
||||||
|
Routinghandler.copyConstructor(Routinghandler other) {
|
||||||
|
anchor = other.anchor;
|
||||||
|
docName = other.docName;
|
||||||
|
viewspecs = other.viewspecs;
|
||||||
|
target = other.target;
|
||||||
|
emailID = other.emailID;
|
||||||
|
}
|
||||||
|
|
||||||
|
String anchor = '';
|
||||||
|
String docName = '';
|
||||||
|
String viewspecs = '';
|
||||||
|
String target = '';
|
||||||
|
String emailID = '';
|
||||||
|
|
||||||
|
void goToLink() {
|
||||||
|
// bool anchorDone = false;
|
||||||
|
|
||||||
|
// bool docNameDone = false;
|
||||||
|
|
||||||
|
// bool viewspecsDone = false;
|
||||||
|
|
||||||
|
// bool targetDone = false;
|
||||||
|
|
||||||
|
// for (int letter = 0; letter < link.length; letter++) {
|
||||||
|
// if (!anchorDone) {
|
||||||
|
// if (link[letter] != '<') {
|
||||||
|
// //when the anchor hasnt been dissected
|
||||||
|
// anchor += link[letter];
|
||||||
|
// } else {
|
||||||
|
// anchorDone = true;
|
||||||
|
// }
|
||||||
|
// } else if (!docNameDone) {
|
||||||
|
// if (link[letter] != ',') {
|
||||||
|
// //when the docName hasnt been dissected
|
||||||
|
// docName += link[letter];
|
||||||
|
// } else {
|
||||||
|
// docNameDone = true;
|
||||||
|
// }
|
||||||
|
// } else if (!targetDone) {
|
||||||
|
// if (link[letter] != ':') {
|
||||||
|
// target += link[letter];
|
||||||
|
// } else {
|
||||||
|
// targetDone = true;
|
||||||
|
// }
|
||||||
|
// } else if (!viewspecsDone) {
|
||||||
|
// if (link[letter] != '>') {
|
||||||
|
// //when the docName hasnt been dissected
|
||||||
|
// viewspecs += link[letter];
|
||||||
|
// } else {
|
||||||
|
// viewspecsDone = true;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
print("anchor $anchor");
|
||||||
|
print("docName $docName");
|
||||||
|
print("target $target");
|
||||||
|
print("viewspecs $viewspecs");
|
||||||
|
print("emailID $emailID");
|
||||||
|
//now it should open a widget in that part
|
||||||
|
//maybe i need a rewrite
|
||||||
|
}
|
||||||
|
|
||||||
|
String getEmailID() {
|
||||||
|
return emailID;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<StatefulWidget> createState() => _RoutingHandlerState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _RoutingHandlerState extends State<Routinghandler> {
|
||||||
|
List<String> markdownContent = [];
|
||||||
|
bool _isLoaded = false;
|
||||||
|
|
||||||
|
@override
|
||||||
|
void initState() {
|
||||||
|
// TODO: implement initState
|
||||||
|
super.initState();
|
||||||
|
_loadMarkdown();
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<void> _loadMarkdown() async {
|
||||||
|
String folder = ApiService.currFolder;
|
||||||
|
// print(folder);
|
||||||
|
print(widget.getEmailID());
|
||||||
|
String emailID = widget.emailID;
|
||||||
|
print("inside _loadMarkdown in routinghandler $emailID");
|
||||||
|
markdownContent =
|
||||||
|
await ApiService().fetchMarkdownContent([emailID], "INBOX");
|
||||||
|
// print(markdownContent);
|
||||||
|
setState(() {
|
||||||
|
_isLoaded = true;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
if (!_isLoaded) {
|
||||||
|
return const Center(
|
||||||
|
child: CircularProgressIndicator(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return Scaffold(
|
||||||
|
appBar: AppBar(
|
||||||
|
title: Text("Routing Handler"),
|
||||||
|
leading: IconButton(
|
||||||
|
onPressed: () {
|
||||||
|
GoRouter.of(context).go('/home');
|
||||||
|
},
|
||||||
|
icon: const Icon(Icons.arrow_back_ios)),
|
||||||
|
),
|
||||||
|
body: ConstrainedBox(
|
||||||
|
constraints: BoxConstraints(
|
||||||
|
minHeight: 100,
|
||||||
|
maxHeight: MediaQuery.of(context).size.height * 0.7,
|
||||||
|
),
|
||||||
|
child: SingleChildScrollView(
|
||||||
|
child:MarkdownBlock(data: markdownContent[0]))),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class LinkViewer extends StatefulWidget {
|
||||||
|
const LinkViewer({super.key});
|
||||||
|
|
||||||
|
@override
|
||||||
|
State<StatefulWidget> createState() => _LinkViewerState();
|
||||||
|
}
|
||||||
|
|
||||||
|
class _LinkViewerState extends State<LinkViewer> {
|
||||||
|
@override
|
||||||
|
Widget build(BuildContext context) {
|
||||||
|
// this should be a class that opens a popup of the email on the view it wants
|
||||||
|
|
||||||
|
return Scaffold(
|
||||||
|
appBar: AppBar(
|
||||||
|
title: Text('url viewer'),
|
||||||
|
),
|
||||||
|
body: Column(
|
||||||
|
children: [],
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user