bookmark and history some code

This commit is contained in:
DASHU
2024-09-12 10:32:18 +08:00
parent e63f99ff30
commit 99d1c03d2a
11 changed files with 199 additions and 11 deletions

View File

@@ -1,5 +1,7 @@
import 'package:flutter_inappwebview/flutter_inappwebview.dart'; import 'package:flutter_inappwebview/flutter_inappwebview.dart';
import '../../data/browser_history.dart';
class WebInfo { class WebInfo {
String id; String id;
@@ -11,10 +13,13 @@ class WebInfo {
String? title; String? title;
BrowserHistory? browserHistory;
WebInfo clone() { WebInfo clone() {
var wi = WebInfo(id, url); var wi = WebInfo(id, url);
wi.controller = controller; wi.controller = controller;
wi.title = title; wi.title = title;
wi.browserHistory = browserHistory;
return wi; return wi;
} }
} }

View File

@@ -9,6 +9,8 @@ import 'package:nostr_sdk/utils/string_util.dart';
import 'package:nowser/component/webview/web_info.dart'; import 'package:nowser/component/webview/web_info.dart';
import 'package:nowser/const/app_type.dart'; import 'package:nowser/const/app_type.dart';
import 'package:nowser/const/auth_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/main.dart';
import 'package:nowser/provider/permission_check_mixin.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, String?) onTitleChanged;
Function(WebInfo, InAppWebViewController) onLoadStop;
WebViewComponent( WebViewComponent(
this.webInfo, this.webInfo,
this.onWebViewCreated, this.onWebViewCreated,
this.onTitleChanged, this.onTitleChanged,
this.onLoadStop,
); );
@override @override
@@ -169,6 +174,7 @@ class _WebViewComponent extends State<WebViewComponent>
onLoadStop: (controller, url) async { onLoadStop: (controller, url) async {
pullToRefreshController?.endRefreshing(); pullToRefreshController?.endRefreshing();
addInitScript(controller); addInitScript(controller);
widget.onLoadStop(widget.webInfo, controller);
}, },
onReceivedError: (controller, request, error) { onReceivedError: (controller, request, error) {
pullToRefreshController?.endRefreshing(); pullToRefreshController?.endRefreshing();

40
lib/data/bookmark.dart Normal file
View File

@@ -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<String, dynamic> 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<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
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;
}
}

17
lib/data/bookmark_db.dart Normal file
View File

@@ -0,0 +1,17 @@
import 'package:nowser/data/bookmark.dart';
import 'package:sqflite/sqflite.dart';
import 'db.dart';
class BookmarkDB {
static Future<int> insert(Bookmark o, {DatabaseExecutor? db}) async {
db = await DB.getDB(db);
return await db.insert("bookmark", o.toJson());
}
static Future<int?> total({DatabaseExecutor? db}) async {
db = await DB.getDB(db);
var sql = "select count(1) from bookmark";
return Sqflite.firstIntValue(await db.rawQuery(sql));
}
}

View File

@@ -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<String, dynamic> json) {
id = json['id'];
title = json['title'];
url = json['url'];
favicon = json['favicon'];
createdAt = json['created_at'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['id'] = this.id;
data['title'] = this.title;
data['url'] = this.url;
data['favicon'] = this.favicon;
data['created_at'] = this.createdAt;
return data;
}
}

View File

@@ -0,0 +1,17 @@
import 'package:nowser/data/browser_history.dart';
import 'package:sqflite/sqflite.dart';
import 'db.dart';
class BrowserHistoryDB {
static Future<int> insert(BrowserHistory o, {DatabaseExecutor? db}) async {
db = await DB.getDB(db);
return await db.insert("browser_history", o.toJson());
}
static Future<int?> total({DatabaseExecutor? db}) async {
db = await DB.getDB(db);
var sql = "select count(1) from browser_history";
return Sqflite.firstIntValue(await db.rawQuery(sql));
}
}

View File

@@ -48,6 +48,11 @@ class DB {
db.execute( 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);"); "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 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<Database> getCurrentDatabase() async { static Future<Database> getCurrentDatabase() async {

View File

@@ -1,7 +1,11 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:nostr_sdk/utils/string_util.dart'; import 'package:nostr_sdk/utils/string_util.dart';
import 'package:nowser/data/bookmark_db.dart';
import '../component/webview/web_info.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 { class WebProvider extends ChangeNotifier {
int index = 0; int index = 0;
@@ -97,6 +101,53 @@ class WebProvider extends ChangeNotifier {
checkBlank(); checkBlank();
notifyListeners(); notifyListeners();
} }
Future<void> 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 { class WebNumInfo {

View File

@@ -55,8 +55,12 @@ class _IndexWebComponent extends State<IndexWebComponent> {
webInfo.controller = controller; webInfo.controller = controller;
webProvider.updateWebInfo(webInfo); webProvider.updateWebInfo(webInfo);
}, (webInfo, controller, title) { }, (webInfo, controller, title) {
webInfo.controller = controller;
webInfo.title = title; webInfo.title = title;
webProvider.updateWebInfo(webInfo); webProvider.updateWebInfo(webInfo);
}, (webInfo, controller) {
webInfo.controller = controller;
webProvider.onLoadStop(webInfo);
}); });
String title = ""; String title = "";

View File

@@ -6,6 +6,8 @@ import 'package:nowser/component/user/user_pic_component.dart';
import 'package:nowser/const/base.dart'; import 'package:nowser/const/base.dart';
import 'package:nowser/const/router_path.dart'; import 'package:nowser/const/router_path.dart';
import 'package:nowser/data/auth_log_db.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/app_provider.dart';
import 'package:nowser/provider/key_provider.dart'; import 'package:nowser/provider/key_provider.dart';
import 'package:nowser/router/me/me_router_log_item_component.dart'; import 'package:nowser/router/me/me_router_log_item_component.dart';
@@ -33,6 +35,20 @@ class _MeRouter extends CustState<MeRouter> {
setState(() { setState(() {
authLogs = list; authLogs = list;
}); });
updateNumber();
}
int? bookmarkNum = 0;
int? historyNum = 0;
int? downloadNum = 0;
Future<void> updateNumber() async {
bookmarkNum = await BookmarkDB.total();
historyNum = await BrowserHistoryDB.total();
setState(() {});
} }
@override @override
@@ -133,25 +149,25 @@ class _MeRouter extends CustState<MeRouter> {
List<Widget> webItemList = []; List<Widget> webItemList = [];
webItemList.add(MeRouterWebItemComponent( webItemList.add(MeRouterWebItemComponent(
num: 102, num: bookmarkNum,
name: "Bookmark", name: "Bookmark",
iconData: Icons.bookmark, iconData: Icons.bookmark,
)); ));
webItemList.add(MeRouterWebItemComponent( webItemList.add(MeRouterWebItemComponent(
num: 999, num: historyNum,
name: "History", name: "History",
iconData: Icons.history, iconData: Icons.history,
)); ));
webItemList.add(MeRouterWebItemComponent( webItemList.add(MeRouterWebItemComponent(
num: 30, num: downloadNum,
name: "Download", name: "Download",
iconData: Icons.download, iconData: Icons.download,
)); ));
webItemList.add(MeRouterWebItemComponent( // webItemList.add(MeRouterWebItemComponent(
num: 102, // num: 102,
name: "Bookmark", // name: "Bookmark",
iconData: Icons.bookmark, // iconData: Icons.bookmark,
)); // ));
var webItemWidget = Container( var webItemWidget = Container(
margin: listWidgetMargin, margin: listWidgetMargin,
child: Row( child: Row(

View File

@@ -2,14 +2,14 @@ import 'package:flutter/material.dart';
import 'package:nowser/const/base.dart'; import 'package:nowser/const/base.dart';
class MeRouterWebItemComponent extends StatefulWidget { class MeRouterWebItemComponent extends StatefulWidget {
int num; int? num;
String name; String name;
IconData iconData; IconData iconData;
MeRouterWebItemComponent({ MeRouterWebItemComponent({
required this.num, this.num,
required this.name, required this.name,
required this.iconData, required this.iconData,
}); });
@@ -54,7 +54,7 @@ class _MeRouterWebItemComponent extends State<MeRouterWebItemComponent> {
), ),
), ),
Text( Text(
"${widget.num}", "${widget.num ?? 0}",
maxLines: 1, maxLines: 1,
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
), ),