flutter_dashboard/lib/widgets/github_card.dart
jdysya bfedef58f4 feat(platform): 添加 GitHub 平台支持
- 在 HomeScreen 中添加 GitHub 卡片组件
- 在 SettingsScreen 中添加 GitHub 设置选项
- 在 AuthService 中添加 GitHub 用户名和 token 的存储和读取逻辑
- 删除未使用的 TimeUtils 类
2025-06-09 20:39:11 +08:00

115 lines
3.8 KiB
Dart

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import '../services/auth_service.dart';
import '../services/github_service.dart';
import '../models/github_event.dart';
import 'package:timeago/timeago.dart' as timeago;
class GithubCard extends StatefulWidget {
const GithubCard({super.key});
@override
State<GithubCard> createState() => _GithubCardState();
}
class _GithubCardState extends State<GithubCard> {
final GithubService _githubService = GithubService();
late Future<List<GithubEvent>> _eventsFuture;
@override
void initState() {
super.initState();
_loadEvents();
}
void _loadEvents() {
final authService = Provider.of<AuthService>(context, listen: false);
final username = authService.credentials['github_username'];
final token = authService.credentials['github_token'];
if (username != null && token != null) {
_eventsFuture = _githubService.getUserEvents(username, token);
}
}
@override
Widget build(BuildContext context) {
final authService = Provider.of<AuthService>(context);
final username = authService.credentials['github_username'];
final token = authService.credentials['github_token'];
if (username == null || token == null) {
return const Center(child: Text('请在设置中配置 GitHub 用户名和 Token'));
}
return FutureBuilder<List<GithubEvent>>(
future: _eventsFuture,
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return const Center(child: CircularProgressIndicator());
}
if (snapshot.hasError) {
return Center(child: Text('加载失败: ${snapshot.error}'));
}
if (!snapshot.hasData || snapshot.data!.isEmpty) {
return const Center(child: Text('暂无活动数据'));
}
return ListView.builder(
itemCount: snapshot.data!.length,
itemBuilder: (context, index) {
final event = snapshot.data![index];
return Card(
margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
child: ListTile(
leading: CircleAvatar(
backgroundImage: NetworkImage(event.actor.avatarUrl),
),
title: Text(
_getEventTitle(event),
style: const TextStyle(fontWeight: FontWeight.bold),
),
subtitle: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('仓库: ${event.repo.name}'),
Text(
'时间: ${timeago.format(event.createdAt, locale: "zh_CN")}',
),
if (event.type == 'PushEvent' &&
event.payload.commits != null)
...event.payload.commits!.map(
(commit) => Text(
'提交: ${commit.message}',
style: const TextStyle(fontSize: 12),
),
),
],
),
isThreeLine: true,
),
);
},
);
},
);
}
String _getEventTitle(GithubEvent event) {
switch (event.type) {
case 'WatchEvent':
return '${event.actor.login} 关注了 ${event.repo.name}';
case 'PushEvent':
return '${event.actor.login} 推送了代码到 ${event.repo.name}';
case 'CreateEvent':
return '${event.actor.login} 创建了 ${event.repo.name}';
case 'ForkEvent':
return '${event.actor.login} Fork 了 ${event.repo.name}';
default:
return '${event.actor.login}${event.repo.name} 进行了 ${event.type} 操作';
}
}
}