mirror of
https://github.com/haorendashu/nowser.git
synced 2025-12-17 09:54:19 +01:00
bookmark and history some code
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
40
lib/data/bookmark.dart
Normal 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
17
lib/data/bookmark_db.dart
Normal 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));
|
||||||
|
}
|
||||||
|
}
|
||||||
27
lib/data/browser_history.dart
Normal file
27
lib/data/browser_history.dart
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
17
lib/data/browser_history_db.dart
Normal file
17
lib/data/browser_history_db.dart
Normal 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));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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 = "";
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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,
|
||||||
),
|
),
|
||||||
|
|||||||
Reference in New Issue
Block a user