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 '../../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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<WebViewComponent>
|
||||
onLoadStop: (controller, url) async {
|
||||
pullToRefreshController?.endRefreshing();
|
||||
addInitScript(controller);
|
||||
widget.onLoadStop(widget.webInfo, controller);
|
||||
},
|
||||
onReceivedError: (controller, request, error) {
|
||||
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(
|
||||
"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<Database> getCurrentDatabase() async {
|
||||
|
||||
@@ -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<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 {
|
||||
|
||||
@@ -55,8 +55,12 @@ class _IndexWebComponent extends State<IndexWebComponent> {
|
||||
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 = "";
|
||||
|
||||
@@ -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<MeRouter> {
|
||||
setState(() {
|
||||
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
|
||||
@@ -133,25 +149,25 @@ class _MeRouter extends CustState<MeRouter> {
|
||||
|
||||
List<Widget> 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(
|
||||
|
||||
@@ -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<MeRouterWebItemComponent> {
|
||||
),
|
||||
),
|
||||
Text(
|
||||
"${widget.num}",
|
||||
"${widget.num ?? 0}",
|
||||
maxLines: 1,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
|
||||
Reference in New Issue
Block a user