Remade frontend dashboard as flutter dashboard, still WIP
This commit is contained in:
@@ -0,0 +1,32 @@
|
||||
import 'package:json_annotation/json_annotation.dart';
|
||||
|
||||
part 'achievement.g.dart';
|
||||
|
||||
@JsonSerializable()
|
||||
class Achievement {
|
||||
final int id;
|
||||
final String name;
|
||||
final String description;
|
||||
@JsonKey(name: 'xp_reward')
|
||||
final int xpReward;
|
||||
@JsonKey(name: 'achieved_at')
|
||||
final String? achievedAt;
|
||||
@JsonKey(name: 'level_at_achievement')
|
||||
final int? levelAtAchievement;
|
||||
|
||||
Achievement({
|
||||
required this.id,
|
||||
required this.name,
|
||||
required this.description,
|
||||
required this.xpReward,
|
||||
this.achievedAt,
|
||||
this.levelAtAchievement,
|
||||
});
|
||||
|
||||
factory Achievement.fromJson(Map<String, dynamic> json) =>
|
||||
_$AchievementFromJson(json);
|
||||
|
||||
Map<String, dynamic> toJson() => _$AchievementToJson(this);
|
||||
|
||||
bool get isAchieved => achievedAt != null;
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||
|
||||
part of 'achievement.dart';
|
||||
|
||||
// **************************************************************************
|
||||
// JsonSerializableGenerator
|
||||
// **************************************************************************
|
||||
|
||||
Achievement _$AchievementFromJson(Map<String, dynamic> json) => Achievement(
|
||||
id: (json['id'] as num).toInt(),
|
||||
name: json['name'] as String,
|
||||
description: json['description'] as String,
|
||||
xpReward: (json['xp_reward'] as num).toInt(),
|
||||
achievedAt: json['achieved_at'] as String?,
|
||||
levelAtAchievement: (json['level_at_achievement'] as num?)?.toInt(),
|
||||
);
|
||||
|
||||
Map<String, dynamic> _$AchievementToJson(Achievement instance) =>
|
||||
<String, dynamic>{
|
||||
'id': instance.id,
|
||||
'name': instance.name,
|
||||
'description': instance.description,
|
||||
'xp_reward': instance.xpReward,
|
||||
'achieved_at': instance.achievedAt,
|
||||
'level_at_achievement': instance.levelAtAchievement,
|
||||
};
|
||||
@@ -0,0 +1,28 @@
|
||||
import 'package:json_annotation/json_annotation.dart';
|
||||
|
||||
part 'activity.g.dart';
|
||||
|
||||
@JsonSerializable()
|
||||
class Activity {
|
||||
final int id;
|
||||
final String type;
|
||||
final String application;
|
||||
final Map<String, dynamic>? metadata;
|
||||
final String timestamp;
|
||||
@JsonKey(name: 'duration_seconds')
|
||||
final int durationSeconds;
|
||||
|
||||
Activity({
|
||||
required this.id,
|
||||
required this.type,
|
||||
required this.application,
|
||||
this.metadata,
|
||||
required this.timestamp,
|
||||
required this.durationSeconds,
|
||||
});
|
||||
|
||||
factory Activity.fromJson(Map<String, dynamic> json) =>
|
||||
_$ActivityFromJson(json);
|
||||
|
||||
Map<String, dynamic> toJson() => _$ActivityToJson(this);
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||
|
||||
part of 'activity.dart';
|
||||
|
||||
// **************************************************************************
|
||||
// JsonSerializableGenerator
|
||||
// **************************************************************************
|
||||
|
||||
Activity _$ActivityFromJson(Map<String, dynamic> json) => Activity(
|
||||
id: (json['id'] as num).toInt(),
|
||||
type: json['type'] as String,
|
||||
application: json['application'] as String,
|
||||
metadata: json['metadata'] as Map<String, dynamic>?,
|
||||
timestamp: json['timestamp'] as String,
|
||||
durationSeconds: (json['duration_seconds'] as num).toInt(),
|
||||
);
|
||||
|
||||
Map<String, dynamic> _$ActivityToJson(Activity instance) => <String, dynamic>{
|
||||
'id': instance.id,
|
||||
'type': instance.type,
|
||||
'application': instance.application,
|
||||
'metadata': instance.metadata,
|
||||
'timestamp': instance.timestamp,
|
||||
'duration_seconds': instance.durationSeconds,
|
||||
};
|
||||
@@ -0,0 +1,170 @@
|
||||
import 'package:json_annotation/json_annotation.dart';
|
||||
|
||||
part 'activity_event.g.dart';
|
||||
|
||||
@JsonSerializable()
|
||||
class ActivityEvent {
|
||||
final ActivityEventType type;
|
||||
final String application;
|
||||
final String? metadata;
|
||||
final DateTime timestamp;
|
||||
|
||||
ActivityEvent({
|
||||
required this.type,
|
||||
required this.application,
|
||||
this.metadata,
|
||||
required this.timestamp,
|
||||
});
|
||||
|
||||
factory ActivityEvent.fromJson(Map<String, dynamic> json) =>
|
||||
_$ActivityEventFromJson(json);
|
||||
|
||||
Map<String, dynamic> toJson() => _$ActivityEventToJson(this);
|
||||
}
|
||||
|
||||
enum ActivityEventType {
|
||||
@JsonValue('coding')
|
||||
coding,
|
||||
@JsonValue('focused_browsing')
|
||||
focusedBrowsing,
|
||||
@JsonValue('collaboration')
|
||||
collaboration,
|
||||
@JsonValue('meetings')
|
||||
meetings,
|
||||
@JsonValue('misc')
|
||||
misc,
|
||||
@JsonValue('uncategorized')
|
||||
uncategorized;
|
||||
|
||||
String get id {
|
||||
switch (this) {
|
||||
case ActivityEventType.coding:
|
||||
return 'coding';
|
||||
case ActivityEventType.focusedBrowsing:
|
||||
return 'focused_browsing';
|
||||
case ActivityEventType.collaboration:
|
||||
return 'collaboration';
|
||||
case ActivityEventType.meetings:
|
||||
return 'meetings';
|
||||
case ActivityEventType.misc:
|
||||
return 'misc';
|
||||
case ActivityEventType.uncategorized:
|
||||
return 'uncategorized';
|
||||
}
|
||||
}
|
||||
|
||||
String get displayName {
|
||||
switch (this) {
|
||||
case ActivityEventType.coding:
|
||||
return 'Coding';
|
||||
case ActivityEventType.focusedBrowsing:
|
||||
return 'Focused Browsing';
|
||||
case ActivityEventType.collaboration:
|
||||
return 'Collaboration';
|
||||
case ActivityEventType.meetings:
|
||||
return 'Meetings';
|
||||
case ActivityEventType.misc:
|
||||
return 'Miscellaneous';
|
||||
case ActivityEventType.uncategorized:
|
||||
return 'Uncategorized';
|
||||
}
|
||||
}
|
||||
|
||||
String get icon {
|
||||
switch (this) {
|
||||
case ActivityEventType.coding:
|
||||
return '💻';
|
||||
case ActivityEventType.focusedBrowsing:
|
||||
return '🔍';
|
||||
case ActivityEventType.collaboration:
|
||||
return '🤝';
|
||||
case ActivityEventType.meetings:
|
||||
return '📅';
|
||||
case ActivityEventType.misc:
|
||||
return '📝';
|
||||
case ActivityEventType.uncategorized:
|
||||
return '❓';
|
||||
}
|
||||
}
|
||||
|
||||
static ActivityEventType categorize({
|
||||
String? eventId,
|
||||
String? applicationId,
|
||||
String? applicationTitle,
|
||||
}) {
|
||||
// Direct type mappings
|
||||
if (eventId != null) {
|
||||
final matchType = ActivityEventType.values
|
||||
.where((e) => e.id == eventId)
|
||||
.firstOrNull;
|
||||
if (matchType != null) {
|
||||
return matchType;
|
||||
}
|
||||
}
|
||||
|
||||
if (applicationId != null) {
|
||||
// Fallback to application-based categorization for 'other' type
|
||||
switch (applicationId.toLowerCase()) {
|
||||
case 'codium':
|
||||
case 'code':
|
||||
case 'vscode':
|
||||
case 'nvim':
|
||||
case 'vim':
|
||||
case 'emacs':
|
||||
return coding;
|
||||
case 'com.slack.slack':
|
||||
case 'slack':
|
||||
case 'discord':
|
||||
case 'teams':
|
||||
case 'mattermost':
|
||||
return collaboration;
|
||||
// terminals
|
||||
case 'com.mitchellh.ghostty':
|
||||
case 'alacritty':
|
||||
case 'kitty':
|
||||
case 'gnome-terminal':
|
||||
case 'konsole':
|
||||
case 'foot':
|
||||
switch (applicationTitle) {
|
||||
case String s when s.contains('git'):
|
||||
case String s when s == 'hx' || s == 'helix':
|
||||
return coding;
|
||||
case null:
|
||||
default:
|
||||
return misc;
|
||||
}
|
||||
case 'org.keepassxc.keepassxc':
|
||||
case 'keepassxc':
|
||||
case 'bitwarden':
|
||||
case '1password':
|
||||
return misc; // security tools now categorized as misc
|
||||
case 'firefox':
|
||||
case 'chrome':
|
||||
case 'safari':
|
||||
case 'edge':
|
||||
return focusedBrowsing;
|
||||
case 'zoom':
|
||||
case 'zoom.us':
|
||||
case 'us.zoom.xos':
|
||||
return meetings;
|
||||
default:
|
||||
return uncategorized;
|
||||
}
|
||||
}
|
||||
|
||||
return uncategorized;
|
||||
}
|
||||
}
|
||||
|
||||
enum ZoomStatus {
|
||||
@JsonValue('none')
|
||||
none,
|
||||
@JsonValue('zoom_focused')
|
||||
zoomFocused, // Zoom window active, no media
|
||||
@JsonValue('zoom_background')
|
||||
zoomBackground, // Zoom running, not focused, no media
|
||||
@JsonValue('background_meeting')
|
||||
backgroundMeeting, // Meeting active but Zoom not focused
|
||||
@JsonValue('active_meeting')
|
||||
activeMeeting, // Meeting active and Zoom focused
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||
|
||||
part of 'activity_event.dart';
|
||||
|
||||
// **************************************************************************
|
||||
// JsonSerializableGenerator
|
||||
// **************************************************************************
|
||||
|
||||
ActivityEvent _$ActivityEventFromJson(Map<String, dynamic> json) =>
|
||||
ActivityEvent(
|
||||
type: $enumDecode(_$ActivityEventTypeEnumMap, json['type']),
|
||||
application: json['application'] as String,
|
||||
metadata: json['metadata'] as String?,
|
||||
timestamp: DateTime.parse(json['timestamp'] as String),
|
||||
);
|
||||
|
||||
Map<String, dynamic> _$ActivityEventToJson(ActivityEvent instance) =>
|
||||
<String, dynamic>{
|
||||
'type': _$ActivityEventTypeEnumMap[instance.type]!,
|
||||
'application': instance.application,
|
||||
'metadata': instance.metadata,
|
||||
'timestamp': instance.timestamp.toIso8601String(),
|
||||
};
|
||||
|
||||
const _$ActivityEventTypeEnumMap = {
|
||||
ActivityEventType.coding: 'coding',
|
||||
ActivityEventType.focusedBrowsing: 'focused_browsing',
|
||||
ActivityEventType.collaboration: 'collaboration',
|
||||
ActivityEventType.meetings: 'meetings',
|
||||
ActivityEventType.misc: 'misc',
|
||||
ActivityEventType.uncategorized: 'uncategorized',
|
||||
};
|
||||
@@ -0,0 +1,73 @@
|
||||
import 'package:json_annotation/json_annotation.dart';
|
||||
|
||||
part 'classification.g.dart';
|
||||
|
||||
@JsonSerializable()
|
||||
class ApplicationClassification {
|
||||
final int id;
|
||||
@JsonKey(name: 'application_name')
|
||||
final String applicationName;
|
||||
@JsonKey(name: 'category_id')
|
||||
final String categoryId;
|
||||
@JsonKey(name: 'created_at')
|
||||
final String createdAt;
|
||||
@JsonKey(name: 'updated_at')
|
||||
final String updatedAt;
|
||||
|
||||
ApplicationClassification({
|
||||
required this.id,
|
||||
required this.applicationName,
|
||||
required this.categoryId,
|
||||
required this.createdAt,
|
||||
required this.updatedAt,
|
||||
});
|
||||
|
||||
factory ApplicationClassification.fromJson(Map<String, dynamic> json) =>
|
||||
_$ApplicationClassificationFromJson(json);
|
||||
|
||||
Map<String, dynamic> toJson() => _$ApplicationClassificationToJson(this);
|
||||
}
|
||||
|
||||
@JsonSerializable()
|
||||
class UnclassifiedApplication {
|
||||
final int id;
|
||||
@JsonKey(name: 'application_name')
|
||||
final String applicationName;
|
||||
@JsonKey(name: 'first_seen')
|
||||
final String firstSeen;
|
||||
@JsonKey(name: 'last_seen')
|
||||
final String lastSeen;
|
||||
@JsonKey(name: 'occurrence_count')
|
||||
final int occurrenceCount;
|
||||
|
||||
UnclassifiedApplication({
|
||||
required this.id,
|
||||
required this.applicationName,
|
||||
required this.firstSeen,
|
||||
required this.lastSeen,
|
||||
required this.occurrenceCount,
|
||||
});
|
||||
|
||||
factory UnclassifiedApplication.fromJson(Map<String, dynamic> json) =>
|
||||
_$UnclassifiedApplicationFromJson(json);
|
||||
|
||||
Map<String, dynamic> toJson() => _$UnclassifiedApplicationToJson(this);
|
||||
}
|
||||
|
||||
@JsonSerializable()
|
||||
class ClassificationRequest {
|
||||
@JsonKey(name: 'application_name')
|
||||
final String applicationName;
|
||||
@JsonKey(name: 'category_id')
|
||||
final String categoryId;
|
||||
|
||||
ClassificationRequest({
|
||||
required this.applicationName,
|
||||
required this.categoryId,
|
||||
});
|
||||
|
||||
factory ClassificationRequest.fromJson(Map<String, dynamic> json) =>
|
||||
_$ClassificationRequestFromJson(json);
|
||||
|
||||
Map<String, dynamic> toJson() => _$ClassificationRequestToJson(this);
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||
|
||||
part of 'classification.dart';
|
||||
|
||||
// **************************************************************************
|
||||
// JsonSerializableGenerator
|
||||
// **************************************************************************
|
||||
|
||||
ApplicationClassification _$ApplicationClassificationFromJson(
|
||||
Map<String, dynamic> json,
|
||||
) => ApplicationClassification(
|
||||
id: (json['id'] as num).toInt(),
|
||||
applicationName: json['application_name'] as String,
|
||||
categoryId: json['category_id'] as String,
|
||||
createdAt: json['created_at'] as String,
|
||||
updatedAt: json['updated_at'] as String,
|
||||
);
|
||||
|
||||
Map<String, dynamic> _$ApplicationClassificationToJson(
|
||||
ApplicationClassification instance,
|
||||
) => <String, dynamic>{
|
||||
'id': instance.id,
|
||||
'application_name': instance.applicationName,
|
||||
'category_id': instance.categoryId,
|
||||
'created_at': instance.createdAt,
|
||||
'updated_at': instance.updatedAt,
|
||||
};
|
||||
|
||||
UnclassifiedApplication _$UnclassifiedApplicationFromJson(
|
||||
Map<String, dynamic> json,
|
||||
) => UnclassifiedApplication(
|
||||
id: (json['id'] as num).toInt(),
|
||||
applicationName: json['application_name'] as String,
|
||||
firstSeen: json['first_seen'] as String,
|
||||
lastSeen: json['last_seen'] as String,
|
||||
occurrenceCount: (json['occurrence_count'] as num).toInt(),
|
||||
);
|
||||
|
||||
Map<String, dynamic> _$UnclassifiedApplicationToJson(
|
||||
UnclassifiedApplication instance,
|
||||
) => <String, dynamic>{
|
||||
'id': instance.id,
|
||||
'application_name': instance.applicationName,
|
||||
'first_seen': instance.firstSeen,
|
||||
'last_seen': instance.lastSeen,
|
||||
'occurrence_count': instance.occurrenceCount,
|
||||
};
|
||||
|
||||
ClassificationRequest _$ClassificationRequestFromJson(
|
||||
Map<String, dynamic> json,
|
||||
) => ClassificationRequest(
|
||||
applicationName: json['application_name'] as String,
|
||||
categoryId: json['category_id'] as String,
|
||||
);
|
||||
|
||||
Map<String, dynamic> _$ClassificationRequestToJson(
|
||||
ClassificationRequest instance,
|
||||
) => <String, dynamic>{
|
||||
'application_name': instance.applicationName,
|
||||
'category_id': instance.categoryId,
|
||||
};
|
||||
@@ -0,0 +1,112 @@
|
||||
import 'package:json_annotation/json_annotation.dart';
|
||||
|
||||
part 'dashboard_stats.g.dart';
|
||||
|
||||
@JsonSerializable()
|
||||
class DashboardStats {
|
||||
final TodayStats today;
|
||||
final StreakStats streaks;
|
||||
@JsonKey(name: 'recent_activity')
|
||||
final List<RecentActivity> recentActivity;
|
||||
final int timestamp;
|
||||
|
||||
DashboardStats({
|
||||
required this.today,
|
||||
required this.streaks,
|
||||
required this.recentActivity,
|
||||
required this.timestamp,
|
||||
});
|
||||
|
||||
factory DashboardStats.fromJson(Map<String, dynamic> json) =>
|
||||
_$DashboardStatsFromJson(json);
|
||||
|
||||
Map<String, dynamic> toJson() => _$DashboardStatsToJson(this);
|
||||
}
|
||||
|
||||
@JsonSerializable()
|
||||
class TodayStats {
|
||||
final int level;
|
||||
final int xp;
|
||||
@JsonKey(name: 'focus_time')
|
||||
final int focusTime;
|
||||
@JsonKey(name: 'meeting_time')
|
||||
final int meetingTime;
|
||||
@JsonKey(name: 'focus_sessions')
|
||||
final int focusSessions;
|
||||
|
||||
TodayStats({
|
||||
required this.level,
|
||||
required this.xp,
|
||||
required this.focusTime,
|
||||
required this.meetingTime,
|
||||
required this.focusSessions,
|
||||
});
|
||||
|
||||
factory TodayStats.fromJson(Map<String, dynamic> json) =>
|
||||
_$TodayStatsFromJson(json);
|
||||
|
||||
Map<String, dynamic> toJson() => _$TodayStatsToJson(this);
|
||||
}
|
||||
|
||||
@JsonSerializable()
|
||||
class StreakStats {
|
||||
@JsonKey(name: 'current_streak')
|
||||
final int currentStreak;
|
||||
@JsonKey(name: 'longest_streak')
|
||||
final int longestStreak;
|
||||
|
||||
StreakStats({
|
||||
required this.currentStreak,
|
||||
required this.longestStreak,
|
||||
});
|
||||
|
||||
factory StreakStats.fromJson(Map<String, dynamic> json) =>
|
||||
_$StreakStatsFromJson(json);
|
||||
|
||||
Map<String, dynamic> toJson() => _$StreakStatsToJson(this);
|
||||
}
|
||||
|
||||
@JsonSerializable()
|
||||
class RecentActivity {
|
||||
final String type;
|
||||
final String application;
|
||||
final String timestamp;
|
||||
@JsonKey(name: 'duration_seconds')
|
||||
final int durationSeconds;
|
||||
|
||||
RecentActivity({
|
||||
required this.type,
|
||||
required this.application,
|
||||
required this.timestamp,
|
||||
required this.durationSeconds,
|
||||
});
|
||||
|
||||
factory RecentActivity.fromJson(Map<String, dynamic> json) =>
|
||||
_$RecentActivityFromJson(json);
|
||||
|
||||
Map<String, dynamic> toJson() => _$RecentActivityToJson(this);
|
||||
}
|
||||
|
||||
@JsonSerializable()
|
||||
class StatsHistory {
|
||||
final String date;
|
||||
final int level;
|
||||
final int xp;
|
||||
@JsonKey(name: 'focus_time')
|
||||
final int focusTime;
|
||||
@JsonKey(name: 'meeting_time')
|
||||
final int meetingTime;
|
||||
|
||||
StatsHistory({
|
||||
required this.date,
|
||||
required this.level,
|
||||
required this.xp,
|
||||
required this.focusTime,
|
||||
required this.meetingTime,
|
||||
});
|
||||
|
||||
factory StatsHistory.fromJson(Map<String, dynamic> json) =>
|
||||
_$StatsHistoryFromJson(json);
|
||||
|
||||
Map<String, dynamic> toJson() => _$StatsHistoryToJson(this);
|
||||
}
|
||||
@@ -0,0 +1,86 @@
|
||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||
|
||||
part of 'dashboard_stats.dart';
|
||||
|
||||
// **************************************************************************
|
||||
// JsonSerializableGenerator
|
||||
// **************************************************************************
|
||||
|
||||
DashboardStats _$DashboardStatsFromJson(Map<String, dynamic> json) =>
|
||||
DashboardStats(
|
||||
today: TodayStats.fromJson(json['today'] as Map<String, dynamic>),
|
||||
streaks: StreakStats.fromJson(json['streaks'] as Map<String, dynamic>),
|
||||
recentActivity: (json['recent_activity'] as List<dynamic>)
|
||||
.map((e) => RecentActivity.fromJson(e as Map<String, dynamic>))
|
||||
.toList(),
|
||||
timestamp: (json['timestamp'] as num).toInt(),
|
||||
);
|
||||
|
||||
Map<String, dynamic> _$DashboardStatsToJson(DashboardStats instance) =>
|
||||
<String, dynamic>{
|
||||
'today': instance.today,
|
||||
'streaks': instance.streaks,
|
||||
'recent_activity': instance.recentActivity,
|
||||
'timestamp': instance.timestamp,
|
||||
};
|
||||
|
||||
TodayStats _$TodayStatsFromJson(Map<String, dynamic> json) => TodayStats(
|
||||
level: (json['level'] as num).toInt(),
|
||||
xp: (json['xp'] as num).toInt(),
|
||||
focusTime: (json['focus_time'] as num).toInt(),
|
||||
meetingTime: (json['meeting_time'] as num).toInt(),
|
||||
focusSessions: (json['focus_sessions'] as num).toInt(),
|
||||
);
|
||||
|
||||
Map<String, dynamic> _$TodayStatsToJson(TodayStats instance) =>
|
||||
<String, dynamic>{
|
||||
'level': instance.level,
|
||||
'xp': instance.xp,
|
||||
'focus_time': instance.focusTime,
|
||||
'meeting_time': instance.meetingTime,
|
||||
'focus_sessions': instance.focusSessions,
|
||||
};
|
||||
|
||||
StreakStats _$StreakStatsFromJson(Map<String, dynamic> json) => StreakStats(
|
||||
currentStreak: (json['current_streak'] as num).toInt(),
|
||||
longestStreak: (json['longest_streak'] as num).toInt(),
|
||||
);
|
||||
|
||||
Map<String, dynamic> _$StreakStatsToJson(StreakStats instance) =>
|
||||
<String, dynamic>{
|
||||
'current_streak': instance.currentStreak,
|
||||
'longest_streak': instance.longestStreak,
|
||||
};
|
||||
|
||||
RecentActivity _$RecentActivityFromJson(Map<String, dynamic> json) =>
|
||||
RecentActivity(
|
||||
type: json['type'] as String,
|
||||
application: json['application'] as String,
|
||||
timestamp: json['timestamp'] as String,
|
||||
durationSeconds: (json['duration_seconds'] as num).toInt(),
|
||||
);
|
||||
|
||||
Map<String, dynamic> _$RecentActivityToJson(RecentActivity instance) =>
|
||||
<String, dynamic>{
|
||||
'type': instance.type,
|
||||
'application': instance.application,
|
||||
'timestamp': instance.timestamp,
|
||||
'duration_seconds': instance.durationSeconds,
|
||||
};
|
||||
|
||||
StatsHistory _$StatsHistoryFromJson(Map<String, dynamic> json) => StatsHistory(
|
||||
date: json['date'] as String,
|
||||
level: (json['level'] as num).toInt(),
|
||||
xp: (json['xp'] as num).toInt(),
|
||||
focusTime: (json['focus_time'] as num).toInt(),
|
||||
meetingTime: (json['meeting_time'] as num).toInt(),
|
||||
);
|
||||
|
||||
Map<String, dynamic> _$StatsHistoryToJson(StatsHistory instance) =>
|
||||
<String, dynamic>{
|
||||
'date': instance.date,
|
||||
'level': instance.level,
|
||||
'xp': instance.xp,
|
||||
'focus_time': instance.focusTime,
|
||||
'meeting_time': instance.meetingTime,
|
||||
};
|
||||
@@ -0,0 +1,37 @@
|
||||
import 'package:json_annotation/json_annotation.dart';
|
||||
|
||||
part 'focus_session.g.dart';
|
||||
|
||||
@JsonSerializable()
|
||||
class FocusSession {
|
||||
final int id;
|
||||
@JsonKey(name: 'start_time')
|
||||
final String startTime;
|
||||
@JsonKey(name: 'end_time')
|
||||
final String? endTime;
|
||||
@JsonKey(name: 'duration_seconds')
|
||||
final int? durationSeconds;
|
||||
@JsonKey(name: 'xp_earned')
|
||||
final int xpEarned;
|
||||
final String status;
|
||||
@JsonKey(name: 'created_at')
|
||||
final String createdAt;
|
||||
@JsonKey(name: 'updated_at')
|
||||
final String updatedAt;
|
||||
|
||||
FocusSession({
|
||||
required this.id,
|
||||
required this.startTime,
|
||||
this.endTime,
|
||||
this.durationSeconds,
|
||||
required this.xpEarned,
|
||||
required this.status,
|
||||
required this.createdAt,
|
||||
required this.updatedAt,
|
||||
});
|
||||
|
||||
factory FocusSession.fromJson(Map<String, dynamic> json) =>
|
||||
_$FocusSessionFromJson(json);
|
||||
|
||||
Map<String, dynamic> toJson() => _$FocusSessionToJson(this);
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||
|
||||
part of 'focus_session.dart';
|
||||
|
||||
// **************************************************************************
|
||||
// JsonSerializableGenerator
|
||||
// **************************************************************************
|
||||
|
||||
FocusSession _$FocusSessionFromJson(Map<String, dynamic> json) => FocusSession(
|
||||
id: (json['id'] as num).toInt(),
|
||||
startTime: json['start_time'] as String,
|
||||
endTime: json['end_time'] as String?,
|
||||
durationSeconds: (json['duration_seconds'] as num?)?.toInt(),
|
||||
xpEarned: (json['xp_earned'] as num).toInt(),
|
||||
status: json['status'] as String,
|
||||
createdAt: json['created_at'] as String,
|
||||
updatedAt: json['updated_at'] as String,
|
||||
);
|
||||
|
||||
Map<String, dynamic> _$FocusSessionToJson(FocusSession instance) =>
|
||||
<String, dynamic>{
|
||||
'id': instance.id,
|
||||
'start_time': instance.startTime,
|
||||
'end_time': instance.endTime,
|
||||
'duration_seconds': instance.durationSeconds,
|
||||
'xp_earned': instance.xpEarned,
|
||||
'status': instance.status,
|
||||
'created_at': instance.createdAt,
|
||||
'updated_at': instance.updatedAt,
|
||||
};
|
||||
@@ -0,0 +1,41 @@
|
||||
import 'package:json_annotation/json_annotation.dart';
|
||||
|
||||
part 'system_log.g.dart';
|
||||
|
||||
@JsonSerializable()
|
||||
class SystemLogResponse {
|
||||
final List<String> logs;
|
||||
|
||||
SystemLogResponse({
|
||||
required this.logs,
|
||||
});
|
||||
|
||||
factory SystemLogResponse.fromJson(Map<String, dynamic> json) =>
|
||||
_$SystemLogResponseFromJson(json);
|
||||
|
||||
Map<String, dynamic> toJson() => _$SystemLogResponseToJson(this);
|
||||
}
|
||||
|
||||
enum LogLevel {
|
||||
@JsonValue('debug')
|
||||
debug,
|
||||
@JsonValue('info')
|
||||
info,
|
||||
@JsonValue('warn')
|
||||
warn,
|
||||
@JsonValue('error')
|
||||
error;
|
||||
|
||||
String get name {
|
||||
switch (this) {
|
||||
case LogLevel.debug:
|
||||
return 'debug';
|
||||
case LogLevel.info:
|
||||
return 'info';
|
||||
case LogLevel.warn:
|
||||
return 'warn';
|
||||
case LogLevel.error:
|
||||
return 'error';
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||
|
||||
part of 'system_log.dart';
|
||||
|
||||
// **************************************************************************
|
||||
// JsonSerializableGenerator
|
||||
// **************************************************************************
|
||||
|
||||
SystemLogResponse _$SystemLogResponseFromJson(Map<String, dynamic> json) =>
|
||||
SystemLogResponse(
|
||||
logs: (json['logs'] as List<dynamic>).map((e) => e as String).toList(),
|
||||
);
|
||||
|
||||
Map<String, dynamic> _$SystemLogResponseToJson(SystemLogResponse instance) =>
|
||||
<String, dynamic>{'logs': instance.logs};
|
||||
@@ -0,0 +1,79 @@
|
||||
import 'package:json_annotation/json_annotation.dart';
|
||||
import 'dashboard_stats.dart';
|
||||
|
||||
part 'websocket_message.g.dart';
|
||||
|
||||
@JsonSerializable()
|
||||
class WebSocketMessage {
|
||||
final WebSocketMessageType type;
|
||||
final Map<String, dynamic>? data;
|
||||
final int timestamp;
|
||||
|
||||
WebSocketMessage({required this.type, this.data, required this.timestamp});
|
||||
|
||||
factory WebSocketMessage.fromJson(Map<String, dynamic> json) => _$WebSocketMessageFromJson(json);
|
||||
|
||||
Map<String, dynamic> toJson() => _$WebSocketMessageToJson(this);
|
||||
|
||||
// Factory constructors for specific message types
|
||||
factory WebSocketMessage.statsUpdate(DashboardStats stats) {
|
||||
return WebSocketMessage(
|
||||
type: WebSocketMessageType.statsUpdate,
|
||||
data: stats.toJson(),
|
||||
timestamp: DateTime.now().millisecondsSinceEpoch,
|
||||
);
|
||||
}
|
||||
|
||||
factory WebSocketMessage.xpBreakdownUpdate(Map<String, int> breakdown) {
|
||||
return WebSocketMessage(
|
||||
type: WebSocketMessageType.xpBreakdownUpdate,
|
||||
data: breakdown,
|
||||
timestamp: DateTime.now().millisecondsSinceEpoch,
|
||||
);
|
||||
}
|
||||
|
||||
factory WebSocketMessage.achievementUnlocked(Map<String, dynamic> achievement) {
|
||||
return WebSocketMessage(
|
||||
type: WebSocketMessageType.achievementUnlocked,
|
||||
data: achievement,
|
||||
timestamp: DateTime.now().millisecondsSinceEpoch,
|
||||
);
|
||||
}
|
||||
|
||||
factory WebSocketMessage.levelUp(int newLevel) {
|
||||
return WebSocketMessage(
|
||||
type: WebSocketMessageType.levelUp,
|
||||
data: {'level': newLevel},
|
||||
timestamp: DateTime.now().millisecondsSinceEpoch,
|
||||
);
|
||||
}
|
||||
|
||||
factory WebSocketMessage.focusSessionComplete(Map<String, dynamic> session) {
|
||||
return WebSocketMessage(
|
||||
type: WebSocketMessageType.focusSessionComplete,
|
||||
data: session,
|
||||
timestamp: DateTime.now().millisecondsSinceEpoch,
|
||||
);
|
||||
}
|
||||
|
||||
factory WebSocketMessage.ping() {
|
||||
return WebSocketMessage(type: WebSocketMessageType.ping, timestamp: DateTime.now().millisecondsSinceEpoch);
|
||||
}
|
||||
|
||||
factory WebSocketMessage.pong() {
|
||||
return WebSocketMessage(type: WebSocketMessageType.pong, timestamp: DateTime.now().millisecondsSinceEpoch);
|
||||
}
|
||||
}
|
||||
|
||||
enum WebSocketMessageType {
|
||||
statsUpdate('stats_update'),
|
||||
xpBreakdownUpdate('xp_breakdown_update'),
|
||||
achievementUnlocked('achievement_unlocked'),
|
||||
levelUp('level_up'),
|
||||
focusSessionComplete('focus_session_complete'),
|
||||
ping('ping'),
|
||||
pong('pong');
|
||||
|
||||
const WebSocketMessageType(this.value);
|
||||
final String value;
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
// GENERATED CODE - DO NOT MODIFY BY HAND
|
||||
|
||||
part of 'websocket_message.dart';
|
||||
|
||||
// **************************************************************************
|
||||
// JsonSerializableGenerator
|
||||
// **************************************************************************
|
||||
|
||||
WebSocketMessage _$WebSocketMessageFromJson(Map<String, dynamic> json) =>
|
||||
WebSocketMessage(
|
||||
type: $enumDecode(_$WebSocketMessageTypeEnumMap, json['type']),
|
||||
data: json['data'] as Map<String, dynamic>?,
|
||||
timestamp: (json['timestamp'] as num).toInt(),
|
||||
);
|
||||
|
||||
Map<String, dynamic> _$WebSocketMessageToJson(WebSocketMessage instance) =>
|
||||
<String, dynamic>{
|
||||
'type': _$WebSocketMessageTypeEnumMap[instance.type]!,
|
||||
'data': instance.data,
|
||||
'timestamp': instance.timestamp,
|
||||
};
|
||||
|
||||
const _$WebSocketMessageTypeEnumMap = {
|
||||
WebSocketMessageType.statsUpdate: 'statsUpdate',
|
||||
WebSocketMessageType.xpBreakdownUpdate: 'xpBreakdownUpdate',
|
||||
WebSocketMessageType.achievementUnlocked: 'achievementUnlocked',
|
||||
WebSocketMessageType.levelUp: 'levelUp',
|
||||
WebSocketMessageType.focusSessionComplete: 'focusSessionComplete',
|
||||
WebSocketMessageType.ping: 'ping',
|
||||
WebSocketMessageType.pong: 'pong',
|
||||
};
|
||||
@@ -0,0 +1,11 @@
|
||||
library xp_models;
|
||||
|
||||
// Models
|
||||
export 'src/models/activity_event.dart';
|
||||
export 'src/models/dashboard_stats.dart';
|
||||
export 'src/models/achievement.dart';
|
||||
export 'src/models/activity.dart';
|
||||
export 'src/models/classification.dart';
|
||||
export 'src/models/focus_session.dart';
|
||||
export 'src/models/system_log.dart';
|
||||
export 'src/models/websocket_message.dart';
|
||||
@@ -0,0 +1,557 @@
|
||||
# Generated by pub
|
||||
# See https://dart.dev/tools/pub/glossary#lockfile
|
||||
packages:
|
||||
_fe_analyzer_shared:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: _fe_analyzer_shared
|
||||
sha256: e55636ed79578b9abca5fecf9437947798f5ef7456308b5cb85720b793eac92f
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "82.0.0"
|
||||
analyzer:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: analyzer
|
||||
sha256: "904ae5bb474d32c38fb9482e2d925d5454cda04ddd0e55d2e6826bc72f6ba8c0"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "7.4.5"
|
||||
args:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: args
|
||||
sha256: d0481093c50b1da8910eb0bb301626d4d8eb7284aa739614d2b394ee09e3ea04
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.7.0"
|
||||
async:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: async
|
||||
sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.13.0"
|
||||
boolean_selector:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: boolean_selector
|
||||
sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.2"
|
||||
build:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: build
|
||||
sha256: cef23f1eda9b57566c81e2133d196f8e3df48f244b317368d65c5943d91148f0
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.4.2"
|
||||
build_config:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: build_config
|
||||
sha256: "4ae2de3e1e67ea270081eaee972e1bd8f027d459f249e0f1186730784c2e7e33"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.2"
|
||||
build_daemon:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: build_daemon
|
||||
sha256: "8e928697a82be082206edb0b9c99c5a4ad6bc31c9e9b8b2f291ae65cd4a25daa"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.0.4"
|
||||
build_resolvers:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: build_resolvers
|
||||
sha256: b9e4fda21d846e192628e7a4f6deda6888c36b5b69ba02ff291a01fd529140f0
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.4.4"
|
||||
build_runner:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
name: build_runner
|
||||
sha256: "058fe9dce1de7d69c4b84fada934df3e0153dd000758c4d65964d0166779aa99"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.4.15"
|
||||
build_runner_core:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: build_runner_core
|
||||
sha256: "22e3aa1c80e0ada3722fe5b63fd43d9c8990759d0a2cf489c8c5d7b2bdebc021"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "8.0.0"
|
||||
built_collection:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: built_collection
|
||||
sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.1.1"
|
||||
built_value:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: built_value
|
||||
sha256: "082001b5c3dc495d4a42f1d5789990505df20d8547d42507c29050af6933ee27"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "8.10.1"
|
||||
checked_yaml:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: checked_yaml
|
||||
sha256: "959525d3162f249993882720d52b7e0c833978df229be20702b33d48d91de70f"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.4"
|
||||
cli_config:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: cli_config
|
||||
sha256: ac20a183a07002b700f0c25e61b7ee46b23c309d76ab7b7640a028f18e4d99ec
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.2.0"
|
||||
code_builder:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: code_builder
|
||||
sha256: "0ec10bf4a89e4c613960bf1e8b42c64127021740fb21640c29c909826a5eea3e"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.10.1"
|
||||
collection:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: collection
|
||||
sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.19.1"
|
||||
convert:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: convert
|
||||
sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.1.2"
|
||||
coverage:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: coverage
|
||||
sha256: aa07dbe5f2294c827b7edb9a87bba44a9c15a3cc81bc8da2ca19b37322d30080
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.14.1"
|
||||
crypto:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: crypto
|
||||
sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.6"
|
||||
dart_style:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: dart_style
|
||||
sha256: "5b236382b47ee411741447c1f1e111459c941ea1b3f2b540dde54c210a3662af"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.1.0"
|
||||
file:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: file
|
||||
sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "7.0.1"
|
||||
fixnum:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: fixnum
|
||||
sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.1"
|
||||
frontend_server_client:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: frontend_server_client
|
||||
sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.0.0"
|
||||
glob:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: glob
|
||||
sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.3"
|
||||
graphs:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: graphs
|
||||
sha256: "741bbf84165310a68ff28fe9e727332eef1407342fca52759cb21ad8177bb8d0"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.3.2"
|
||||
http:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: http
|
||||
sha256: "2c11f3f94c687ee9bad77c171151672986360b2b001d109814ee7140b2cf261b"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.4.0"
|
||||
http_multi_server:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: http_multi_server
|
||||
sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.2.2"
|
||||
http_parser:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: http_parser
|
||||
sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.1.2"
|
||||
io:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: io
|
||||
sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.5"
|
||||
js:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: js
|
||||
sha256: "53385261521cc4a0c4658fd0ad07a7d14591cf8fc33abbceae306ddb974888dc"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.7.2"
|
||||
json_annotation:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: json_annotation
|
||||
sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.9.0"
|
||||
json_serializable:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
name: json_serializable
|
||||
sha256: c50ef5fc083d5b5e12eef489503ba3bf5ccc899e487d691584699b4bdefeea8c
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.9.5"
|
||||
logging:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: logging
|
||||
sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.3.0"
|
||||
matcher:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: matcher
|
||||
sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.12.17"
|
||||
meta:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: meta
|
||||
sha256: "23f08335362185a5ea2ad3a4e597f1375e78bce8a040df5c600c8d3552ef2394"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.17.0"
|
||||
mime:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: mime
|
||||
sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.0"
|
||||
node_preamble:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: node_preamble
|
||||
sha256: "6e7eac89047ab8a8d26cf16127b5ed26de65209847630400f9aefd7cd5c730db"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.2"
|
||||
package_config:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: package_config
|
||||
sha256: f096c55ebb7deb7e384101542bfba8c52696c1b56fca2eb62827989ef2353bbc
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.2.0"
|
||||
path:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: path
|
||||
sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.9.1"
|
||||
pool:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: pool
|
||||
sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.5.1"
|
||||
pub_semver:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: pub_semver
|
||||
sha256: "5bfcf68ca79ef689f8990d1160781b4bad40a3bd5e5218ad4076ddb7f4081585"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.2.0"
|
||||
pubspec_parse:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: pubspec_parse
|
||||
sha256: "0560ba233314abbed0a48a2956f7f022cce7c3e1e73df540277da7544cad4082"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.5.0"
|
||||
shelf:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: shelf
|
||||
sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.4.2"
|
||||
shelf_packages_handler:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: shelf_packages_handler
|
||||
sha256: "89f967eca29607c933ba9571d838be31d67f53f6e4ee15147d5dc2934fee1b1e"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.2"
|
||||
shelf_static:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: shelf_static
|
||||
sha256: c87c3875f91262785dade62d135760c2c69cb217ac759485334c5857ad89f6e3
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.3"
|
||||
shelf_web_socket:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: shelf_web_socket
|
||||
sha256: "3632775c8e90d6c9712f883e633716432a27758216dfb61bd86a8321c0580925"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.0"
|
||||
source_gen:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: source_gen
|
||||
sha256: "35c8150ece9e8c8d263337a265153c3329667640850b9304861faea59fc98f6b"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.0"
|
||||
source_helper:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: source_helper
|
||||
sha256: "86d247119aedce8e63f4751bd9626fc9613255935558447569ad42f9f5b48b3c"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.3.5"
|
||||
source_map_stack_trace:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: source_map_stack_trace
|
||||
sha256: c0713a43e323c3302c2abe2a1cc89aa057a387101ebd280371d6a6c9fa68516b
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.2"
|
||||
source_maps:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: source_maps
|
||||
sha256: "190222579a448b03896e0ca6eca5998fa810fda630c1d65e2f78b3f638f54812"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.10.13"
|
||||
source_span:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: source_span
|
||||
sha256: "254ee5351d6cb365c859e20ee823c3bb479bf4a293c22d17a9f1bf144ce86f7c"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.10.1"
|
||||
stack_trace:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: stack_trace
|
||||
sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.12.1"
|
||||
stream_channel:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: stream_channel
|
||||
sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.4"
|
||||
stream_transform:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: stream_transform
|
||||
sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.1"
|
||||
string_scanner:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: string_scanner
|
||||
sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.4.1"
|
||||
term_glyph:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: term_glyph
|
||||
sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.2.2"
|
||||
test:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
name: test
|
||||
sha256: "65e29d831719be0591f7b3b1a32a3cda258ec98c58c7b25f7b84241bc31215bb"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.26.2"
|
||||
test_api:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: test_api
|
||||
sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.7.6"
|
||||
test_core:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: test_core
|
||||
sha256: "80bf5a02b60af04b09e14f6fe68b921aad119493e26e490deaca5993fef1b05a"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.6.11"
|
||||
timing:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: timing
|
||||
sha256: "62ee18aca144e4a9f29d212f5a4c6a053be252b895ab14b5821996cff4ed90fe"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.2"
|
||||
typed_data:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: typed_data
|
||||
sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.4.0"
|
||||
vm_service:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: vm_service
|
||||
sha256: "45caa6c5917fa127b5dbcfbd1fa60b14e583afdc08bfc96dda38886ca252eb60"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "15.0.2"
|
||||
watcher:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: watcher
|
||||
sha256: "0b7fd4a0bbc4b92641dbf20adfd7e3fd1398fe17102d94b674234563e110088a"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.2"
|
||||
web:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: web
|
||||
sha256: "868d88a33d8a87b18ffc05f9f030ba328ffefba92d6c127917a2ba740f9cfe4a"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.1"
|
||||
web_socket:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: web_socket
|
||||
sha256: "34d64019aa8e36bf9842ac014bb5d2f5586ca73df5e4d9bf5c936975cae6982c"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.1"
|
||||
web_socket_channel:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: web_socket_channel
|
||||
sha256: d645757fb0f4773d602444000a8131ff5d48c9e47adfe9772652dd1a4f2d45c8
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.3"
|
||||
webkit_inspection_protocol:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: webkit_inspection_protocol
|
||||
sha256: "87d3f2333bb240704cd3f1c6b5b7acd8a10e7f0bc28c28dcf14e782014f4a572"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.2.1"
|
||||
yaml:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: yaml
|
||||
sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.1.3"
|
||||
sdks:
|
||||
dart: ">=3.8.0 <4.0.0"
|
||||
@@ -0,0 +1,15 @@
|
||||
name: xp_models
|
||||
description: Shared data models for XP Nix productivity tracker
|
||||
version: 1.0.0
|
||||
publish_to: 'none'
|
||||
|
||||
environment:
|
||||
sdk: ^3.8.0
|
||||
|
||||
dependencies:
|
||||
json_annotation: ^4.8.1
|
||||
|
||||
dev_dependencies:
|
||||
build_runner: ^2.4.7
|
||||
json_serializable: ^6.7.1
|
||||
test: ^1.24.0
|
||||
Reference in New Issue
Block a user