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 createState() => _GithubCardState(); } class _GithubCardState extends State { final GithubService _githubService = GithubService(); late Future> _eventsFuture; @override void initState() { super.initState(); _loadEvents(); } void _loadEvents() { final authService = Provider.of(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(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>( 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} 操作'; } } }