diff --git a/lib/component/webview/web_info.dart b/lib/component/webview/web_info.dart index 593e8be..1890540 100644 --- a/lib/component/webview/web_info.dart +++ b/lib/component/webview/web_info.dart @@ -1,5 +1,7 @@ import 'package:flutter_inappwebview/flutter_inappwebview.dart'; +import '../../data/browser_history.dart'; + class WebInfo { String id; @@ -11,10 +13,13 @@ class WebInfo { String? title; + BrowserHistory? browserHistory; + WebInfo clone() { var wi = WebInfo(id, url); wi.controller = controller; wi.title = title; + wi.browserHistory = browserHistory; return wi; } } diff --git a/lib/component/webview/webview_component.dart b/lib/component/webview/webview_component.dart index 0fd5d59..75b2299 100644 --- a/lib/component/webview/webview_component.dart +++ b/lib/component/webview/webview_component.dart @@ -9,6 +9,8 @@ import 'package:nostr_sdk/utils/string_util.dart'; import 'package:nowser/component/webview/web_info.dart'; import 'package:nowser/const/app_type.dart'; import 'package:nowser/const/auth_type.dart'; +import 'package:nowser/data/browser_history.dart'; +import 'package:nowser/data/browser_history_db.dart'; import 'package:nowser/main.dart'; import 'package:nowser/provider/permission_check_mixin.dart'; @@ -22,10 +24,13 @@ class WebViewComponent extends StatefulWidget { Function(WebInfo, InAppWebViewController, String?) onTitleChanged; + Function(WebInfo, InAppWebViewController) onLoadStop; + WebViewComponent( this.webInfo, this.onWebViewCreated, this.onTitleChanged, + this.onLoadStop, ); @override @@ -169,6 +174,7 @@ class _WebViewComponent extends State onLoadStop: (controller, url) async { pullToRefreshController?.endRefreshing(); addInitScript(controller); + widget.onLoadStop(widget.webInfo, controller); }, onReceivedError: (controller, request, error) { pullToRefreshController?.endRefreshing(); diff --git a/lib/data/bookmark.dart b/lib/data/bookmark.dart new file mode 100644 index 0000000..a1546cb --- /dev/null +++ b/lib/data/bookmark.dart @@ -0,0 +1,40 @@ +class Bookmark { + int? id; + String? title; + String? url; + String? favicon; + int? weight; + int? addedToIndex; + int? createdAt; + + Bookmark( + {this.id, + this.title, + this.url, + this.favicon, + this.weight, + this.addedToIndex, + this.createdAt}); + + Bookmark.fromJson(Map json) { + id = json['id']; + title = json['title']; + url = json['url']; + favicon = json['favicon']; + weight = json['weight']; + addedToIndex = json['added_to_index']; + createdAt = json['created_at']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['title'] = this.title; + data['url'] = this.url; + data['favicon'] = this.favicon; + data['weight'] = this.weight; + data['added_to_index'] = this.addedToIndex; + data['created_at'] = this.createdAt; + return data; + } +} diff --git a/lib/data/bookmark_db.dart b/lib/data/bookmark_db.dart new file mode 100644 index 0000000..2b8f34d --- /dev/null +++ b/lib/data/bookmark_db.dart @@ -0,0 +1,17 @@ +import 'package:nowser/data/bookmark.dart'; +import 'package:sqflite/sqflite.dart'; + +import 'db.dart'; + +class BookmarkDB { + static Future insert(Bookmark o, {DatabaseExecutor? db}) async { + db = await DB.getDB(db); + return await db.insert("bookmark", o.toJson()); + } + + static Future total({DatabaseExecutor? db}) async { + db = await DB.getDB(db); + var sql = "select count(1) from bookmark"; + return Sqflite.firstIntValue(await db.rawQuery(sql)); + } +} diff --git a/lib/data/browser_history.dart b/lib/data/browser_history.dart new file mode 100644 index 0000000..8ac7b95 --- /dev/null +++ b/lib/data/browser_history.dart @@ -0,0 +1,27 @@ +class BrowserHistory { + int? id; + String? title; + String? url; + String? favicon; + int? createdAt; + + BrowserHistory({this.id, this.title, this.url, this.favicon, this.createdAt}); + + BrowserHistory.fromJson(Map json) { + id = json['id']; + title = json['title']; + url = json['url']; + favicon = json['favicon']; + createdAt = json['created_at']; + } + + Map toJson() { + final Map data = new Map(); + data['id'] = this.id; + data['title'] = this.title; + data['url'] = this.url; + data['favicon'] = this.favicon; + data['created_at'] = this.createdAt; + return data; + } +} diff --git a/lib/data/browser_history_db.dart b/lib/data/browser_history_db.dart new file mode 100644 index 0000000..239d01f --- /dev/null +++ b/lib/data/browser_history_db.dart @@ -0,0 +1,17 @@ +import 'package:nowser/data/browser_history.dart'; +import 'package:sqflite/sqflite.dart'; + +import 'db.dart'; + +class BrowserHistoryDB { + static Future insert(BrowserHistory o, {DatabaseExecutor? db}) async { + db = await DB.getDB(db); + return await db.insert("browser_history", o.toJson()); + } + + static Future total({DatabaseExecutor? db}) async { + db = await DB.getDB(db); + var sql = "select count(1) from browser_history"; + return Sqflite.firstIntValue(await db.rawQuery(sql)); + } +} diff --git a/lib/data/db.dart b/lib/data/db.dart index 8bb8c93..27b9fe9 100644 --- a/lib/data/db.dart +++ b/lib/data/db.dart @@ -48,6 +48,11 @@ class DB { db.execute( "create table zap_log(id integer not null constraint zap_log_pk primary key autoincrement,app_id integer not null constraint zap_log_index unique,zap_type integer not null,num integer not null,created_at integer not null);"); db.execute("create index zap_log_index on zap_log (app_id);"); + + db.execute( + "create table bookmark(id integer not null constraint bookmark_pk primary key autoincrement,title text,url text not null,favicon text,weight integer,added_to_index integer,created_at integer);"); + db.execute( + "create table browser_history(id integer not null constraint browser_history_pk primary key autoincrement,title text,url text not null,favicon text,created_at integer);"); } static Future getCurrentDatabase() async { diff --git a/lib/provider/web_provider.dart b/lib/provider/web_provider.dart index f714e88..4821efc 100644 --- a/lib/provider/web_provider.dart +++ b/lib/provider/web_provider.dart @@ -1,7 +1,11 @@ import 'package:flutter/material.dart'; import 'package:nostr_sdk/utils/string_util.dart'; +import 'package:nowser/data/bookmark_db.dart'; import '../component/webview/web_info.dart'; +import '../data/bookmark.dart'; +import '../data/browser_history.dart'; +import '../data/browser_history_db.dart'; class WebProvider extends ChangeNotifier { int index = 0; @@ -97,6 +101,53 @@ class WebProvider extends ChangeNotifier { checkBlank(); notifyListeners(); } + + Future onLoadStop(WebInfo webInfo) async { + if (webInfo.controller == null) { + return; + } + + try { + var url = await webInfo.controller!.getUrl(); + if (url == null) { + return; + } + + var title = await webInfo.controller!.getTitle(); + var favicons = await webInfo.controller!.getFavicons(); + String? favicon; + if (favicons.isNotEmpty) { + favicon = favicons.first.url.toString(); + } + var browserHistory = BrowserHistory( + title: title, + favicon: favicon, + url: url.toString(), + createdAt: DateTime.now().millisecondsSinceEpoch ~/ 1000, + ); + + BrowserHistoryDB.insert(browserHistory); + + webInfo.browserHistory = browserHistory; + updateWebInfo(webInfo); + } catch (e) {} + } + + void addBookmark(WebInfo webInfo) { + if (webInfo.browserHistory == null) { + return; + } + + var bookmark = Bookmark(); + bookmark.title = webInfo.title; + bookmark.url = webInfo.browserHistory!.url; + bookmark.favicon = webInfo.browserHistory!.favicon; + bookmark.weight = 0; + bookmark.addedToIndex = -1; + bookmark.createdAt = DateTime.now().millisecondsSinceEpoch ~/ 1000; + + BookmarkDB.insert(bookmark); + } } class WebNumInfo { diff --git a/lib/router/index/index_web_component.dart b/lib/router/index/index_web_component.dart index 5b96630..21e7ae5 100644 --- a/lib/router/index/index_web_component.dart +++ b/lib/router/index/index_web_component.dart @@ -55,8 +55,12 @@ class _IndexWebComponent extends State { webInfo.controller = controller; webProvider.updateWebInfo(webInfo); }, (webInfo, controller, title) { + webInfo.controller = controller; webInfo.title = title; webProvider.updateWebInfo(webInfo); + }, (webInfo, controller) { + webInfo.controller = controller; + webProvider.onLoadStop(webInfo); }); String title = ""; diff --git a/lib/router/me/me_router.dart b/lib/router/me/me_router.dart index ebe5fb5..0c44a69 100644 --- a/lib/router/me/me_router.dart +++ b/lib/router/me/me_router.dart @@ -6,6 +6,8 @@ import 'package:nowser/component/user/user_pic_component.dart'; import 'package:nowser/const/base.dart'; import 'package:nowser/const/router_path.dart'; import 'package:nowser/data/auth_log_db.dart'; +import 'package:nowser/data/bookmark_db.dart'; +import 'package:nowser/data/browser_history_db.dart'; import 'package:nowser/provider/app_provider.dart'; import 'package:nowser/provider/key_provider.dart'; import 'package:nowser/router/me/me_router_log_item_component.dart'; @@ -33,6 +35,20 @@ class _MeRouter extends CustState { setState(() { authLogs = list; }); + + updateNumber(); + } + + int? bookmarkNum = 0; + + int? historyNum = 0; + + int? downloadNum = 0; + + Future updateNumber() async { + bookmarkNum = await BookmarkDB.total(); + historyNum = await BrowserHistoryDB.total(); + setState(() {}); } @override @@ -133,25 +149,25 @@ class _MeRouter extends CustState { List webItemList = []; webItemList.add(MeRouterWebItemComponent( - num: 102, + num: bookmarkNum, name: "Bookmark", iconData: Icons.bookmark, )); webItemList.add(MeRouterWebItemComponent( - num: 999, + num: historyNum, name: "History", iconData: Icons.history, )); webItemList.add(MeRouterWebItemComponent( - num: 30, + num: downloadNum, name: "Download", iconData: Icons.download, )); - webItemList.add(MeRouterWebItemComponent( - num: 102, - name: "Bookmark", - iconData: Icons.bookmark, - )); + // webItemList.add(MeRouterWebItemComponent( + // num: 102, + // name: "Bookmark", + // iconData: Icons.bookmark, + // )); var webItemWidget = Container( margin: listWidgetMargin, child: Row( diff --git a/lib/router/me/me_router_web_item_component.dart b/lib/router/me/me_router_web_item_component.dart index 0f12fa7..3d254d5 100644 --- a/lib/router/me/me_router_web_item_component.dart +++ b/lib/router/me/me_router_web_item_component.dart @@ -2,14 +2,14 @@ import 'package:flutter/material.dart'; import 'package:nowser/const/base.dart'; class MeRouterWebItemComponent extends StatefulWidget { - int num; + int? num; String name; IconData iconData; MeRouterWebItemComponent({ - required this.num, + this.num, required this.name, required this.iconData, }); @@ -54,7 +54,7 @@ class _MeRouterWebItemComponent extends State { ), ), Text( - "${widget.num}", + "${widget.num ?? 0}", maxLines: 1, overflow: TextOverflow.ellipsis, ),