sync every hour the latest version of packages with aur
display current version and if outdated in ui display correct time in output log
This commit is contained in:
@ -58,7 +58,10 @@ class _YourPackagesState extends State<YourPackages> {
|
||||
label: Text("Package Name"),
|
||||
),
|
||||
DataColumn(
|
||||
label: Text("Number of versions"),
|
||||
label: Text("Version"),
|
||||
),
|
||||
DataColumn(
|
||||
label: Text("Up-To-Date"),
|
||||
),
|
||||
DataColumn(
|
||||
label: Text("Status"),
|
||||
@ -85,14 +88,25 @@ class _YourPackagesState extends State<YourPackages> {
|
||||
cells: [
|
||||
DataCell(Text(package.id.toString())),
|
||||
DataCell(Text(package.name)),
|
||||
DataCell(Text(package.count.toString())),
|
||||
DataCell(Text(package.latest_version.toString())),
|
||||
DataCell(IconButton(
|
||||
icon: Icon(
|
||||
package.outofdate ? Icons.update : Icons.verified,
|
||||
color: package.outofdate ? Color(0xFF6B43A4) : Color(0xFF0A6900),
|
||||
),
|
||||
onPressed: package.outofdate
|
||||
? () {
|
||||
// todo open build info with logs
|
||||
}
|
||||
: null,
|
||||
)),
|
||||
DataCell(IconButton(
|
||||
icon: Icon(
|
||||
switchSuccessIcon(package.status),
|
||||
color: switchSuccessColor(package.status),
|
||||
),
|
||||
onPressed: () {
|
||||
// todo open build info with logs
|
||||
//context.push("/build/${package.latest_version_id}");
|
||||
},
|
||||
)),
|
||||
DataCell(
|
||||
|
@ -3,17 +3,22 @@ class Build {
|
||||
final String pkg_name;
|
||||
final String version;
|
||||
final int status;
|
||||
final int? start_time, end_time;
|
||||
|
||||
Build(
|
||||
{required this.id,
|
||||
required this.pkg_name,
|
||||
required this.version,
|
||||
required this.start_time,
|
||||
required this.end_time,
|
||||
required this.status});
|
||||
|
||||
factory Build.fromJson(Map<String, dynamic> json) {
|
||||
return Build(
|
||||
id: json["id"] as int,
|
||||
status: json["status"] as int,
|
||||
start_time: json["start_time"] as int?,
|
||||
end_time: json["end_time"] as int?,
|
||||
pkg_name: json["pkg_name"] as String,
|
||||
version: json["version"] as String,
|
||||
);
|
||||
|
@ -1,21 +1,28 @@
|
||||
class Package {
|
||||
final int id;
|
||||
final int id, latest_version_id;
|
||||
final String name;
|
||||
final int count;
|
||||
final bool outofdate;
|
||||
final int status;
|
||||
final String latest_version, latest_aur_version;
|
||||
|
||||
Package(
|
||||
{required this.id,
|
||||
required this.latest_version_id,
|
||||
required this.name,
|
||||
required this.count,
|
||||
required this.status});
|
||||
required this.status,
|
||||
required this.latest_version,
|
||||
required this.latest_aur_version,
|
||||
required this.outofdate});
|
||||
|
||||
factory Package.fromJson(Map<String, dynamic> json) {
|
||||
return Package(
|
||||
id: json["id"] as int,
|
||||
count: json["count"] as int,
|
||||
outofdate: json["outofdate"] as bool,
|
||||
status: json["status"] as int,
|
||||
name: json["name"] as String,
|
||||
latest_version: json["latest_version"] as String,
|
||||
latest_version_id: json["latest_version_id"] as int,
|
||||
latest_aur_version: json["latest_aur_version"] as String,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -1,14 +1,11 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:aurcache/api/builds.dart';
|
||||
import 'package:aurcache/components/build_output.dart';
|
||||
import 'package:aurcache/models/build.dart';
|
||||
import 'package:aurcache/components/api/APIBuilder.dart';
|
||||
import 'package:aurcache/providers/build_provider.dart';
|
||||
import 'package:aurcache/utils/time_formatter.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
|
||||
import '../api/API.dart';
|
||||
import '../components/dashboard/your_packages.dart';
|
||||
|
||||
class BuildScreen extends StatefulWidget {
|
||||
@ -29,6 +26,9 @@ class _BuildScreenState extends State<BuildScreen> {
|
||||
interval: const Duration(seconds: 10),
|
||||
onLoad: () => const Text("no data"),
|
||||
onData: (buildData) {
|
||||
final start_time = DateTime.fromMillisecondsSinceEpoch(
|
||||
(buildData.start_time ?? 0) * 1000);
|
||||
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
@ -58,7 +58,7 @@ class _BuildScreenState extends State<BuildScreen> {
|
||||
const SizedBox(
|
||||
width: 10,
|
||||
),
|
||||
const Text("triggered 2 months ago")
|
||||
Text("triggered ${start_time.readableDuration()}")
|
||||
],
|
||||
),
|
||||
const SizedBox(
|
||||
|
@ -23,6 +23,7 @@ class _DashboardScreenState extends State<DashboardScreen> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return APIBuilder<StatsProvider, Stats, Object>(
|
||||
interval: const Duration(seconds: 10),
|
||||
onData: (stats) {
|
||||
return SafeArea(
|
||||
child: SingleChildScrollView(
|
||||
|
20
frontend/lib/utils/time_formatter.dart
Normal file
20
frontend/lib/utils/time_formatter.dart
Normal file
@ -0,0 +1,20 @@
|
||||
extension TimeFormatter on DateTime {
|
||||
String readableDuration() {
|
||||
final now = DateTime.now();
|
||||
final duration = now.difference(this);
|
||||
|
||||
if (duration.inSeconds < 60) {
|
||||
return '${duration.inSeconds} seconds ago';
|
||||
} else if (duration.inMinutes < 60) {
|
||||
return '${duration.inMinutes} minutes ago';
|
||||
} else if (duration.inHours < 24) {
|
||||
return '${duration.inHours} hours ago';
|
||||
} else if (duration.inDays < 30) {
|
||||
return '${duration.inDays} days ago';
|
||||
} else if ((duration.inDays / 30) < 12) {
|
||||
return '${duration.inDays ~/ 30} months ago';
|
||||
} else {
|
||||
return '${duration.inDays ~/ 365} years ago';
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user