223 lines
5.8 KiB
Dart
223 lines
5.8 KiB
Dart
import 'dart:convert';
|
|
|
|
import 'package:badges/badges.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter_markdown/flutter_markdown.dart';
|
|
import 'package:gitea_client/model/repository.dart';
|
|
import 'package:gitea_client/model/user.dart';
|
|
import 'package:gitea_client/service/gitea_service.dart';
|
|
|
|
import '../model/File.dart';
|
|
|
|
class RepoPage extends StatefulWidget {
|
|
final Repository repo;
|
|
final SavedUser user;
|
|
|
|
const RepoPage({Key? key, required this.repo, required this.user})
|
|
: super(key: key);
|
|
|
|
@override
|
|
_RepoPage createState() => _RepoPage();
|
|
}
|
|
|
|
class _RepoPage extends State<RepoPage> {
|
|
int _currentIndex = 0;
|
|
|
|
late final List _screens;
|
|
|
|
@override
|
|
void initState() {
|
|
_screens = [
|
|
RepoHome(
|
|
repo: widget.repo,
|
|
user: widget.user,
|
|
),
|
|
RepoFiles(
|
|
repo: widget.repo,
|
|
user: widget.user,
|
|
),
|
|
RepoIssues(
|
|
repo: widget.repo,
|
|
user: widget.user,
|
|
),
|
|
RepoPullRequests(
|
|
repo: widget.repo,
|
|
user: widget.user,
|
|
)
|
|
];
|
|
}
|
|
|
|
void _updateIndex(int value) {
|
|
setState(() {
|
|
_currentIndex = value;
|
|
});
|
|
}
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Scaffold(
|
|
appBar: AppBar(
|
|
title: Text(widget.repo.name),
|
|
),
|
|
body: _screens[_currentIndex],
|
|
bottomNavigationBar: BottomNavigationBar(
|
|
type: BottomNavigationBarType.fixed,
|
|
currentIndex: _currentIndex,
|
|
onTap: _updateIndex,
|
|
selectedItemColor: Colors.green[700],
|
|
selectedFontSize: 13,
|
|
unselectedFontSize: 13,
|
|
iconSize: 30,
|
|
items: [
|
|
const BottomNavigationBarItem(
|
|
label: "Home",
|
|
icon: Icon(Icons.home),
|
|
),
|
|
const BottomNavigationBarItem(
|
|
label: "Files",
|
|
icon: Icon(Icons.folder),
|
|
),
|
|
if (widget.repo.hasIssues!)
|
|
BottomNavigationBarItem(
|
|
label: "Issues",
|
|
icon: (widget.repo.openIssuesCount! > 0)
|
|
? Badge(
|
|
badgeContent:
|
|
Text(widget.repo.openIssuesCount!.toString()),
|
|
child: const Icon(Icons.error_outline),
|
|
)
|
|
: const Icon(Icons.error_outline),
|
|
),
|
|
if (widget.repo.hasPullRequests!)
|
|
BottomNavigationBarItem(
|
|
label: "Pull requests",
|
|
icon: (widget.repo.openPrCounter! > 0)
|
|
? Badge(
|
|
badgeContent: Text(widget.repo.openPrCounter!.toString()),
|
|
child: const Icon(Icons.mediation_rounded),
|
|
)
|
|
: const Icon(Icons.mediation_rounded),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
class RepoHome extends StatefulWidget {
|
|
final Repository repo;
|
|
final SavedUser user;
|
|
|
|
const RepoHome({Key? key, required this.repo, required this.user})
|
|
: super(key: key);
|
|
|
|
@override
|
|
_RepoHome createState() => _RepoHome();
|
|
}
|
|
|
|
class _RepoHome extends State<RepoHome> {
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final media = MediaQuery.of(context).size;
|
|
|
|
return Column(children: [
|
|
Text(widget.repo.fullName!,
|
|
style: Theme.of(context).textTheme.headline3,),
|
|
FutureBuilder<RepoFile>(
|
|
future: readmeRequest,
|
|
builder: (context, snapshot) {
|
|
if (snapshot.hasError) {
|
|
return Center(
|
|
child: Column(
|
|
children: [
|
|
Text("No Readme file found!",
|
|
style: Theme.of(context).textTheme.headline6),
|
|
],
|
|
),
|
|
);
|
|
} else if (snapshot.hasData) {
|
|
var file = snapshot.data!;
|
|
final content = utf8.decode(base64.decode(file.content!));
|
|
|
|
return SingleChildScrollView(child: Center(
|
|
child: SizedBox(
|
|
width: (media.width > 600) ? media.width * 0.6 : media.width*0.9,
|
|
height: media.height*0.7,
|
|
child: Markdown(selectable: true, data: content)),
|
|
));
|
|
} else {
|
|
return const Center(
|
|
child: CircularProgressIndicator(),
|
|
);
|
|
}
|
|
})
|
|
]);
|
|
}
|
|
|
|
Future<RepoFile>? readmeRequest;
|
|
late final GiteaService giteaService;
|
|
|
|
@override
|
|
void initState() {
|
|
giteaService = GiteaService(apiAccess: widget.user.apiAccess);
|
|
readmeRequest = giteaService.getFile(
|
|
widget.repo.owner.username!, widget.repo.name, "README.md");
|
|
}
|
|
}
|
|
|
|
class RepoFiles extends StatefulWidget {
|
|
final Repository repo;
|
|
final SavedUser user;
|
|
|
|
const RepoFiles({Key? key, required this.repo, required this.user})
|
|
: super(key: key);
|
|
|
|
@override
|
|
_RepoFiles createState() => _RepoFiles();
|
|
}
|
|
|
|
class _RepoFiles extends State<RepoFiles> {
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
// TODO: implement build
|
|
throw UnimplementedError();
|
|
}
|
|
}
|
|
|
|
class RepoIssues extends StatefulWidget {
|
|
final Repository repo;
|
|
final SavedUser user;
|
|
|
|
const RepoIssues({Key? key, required this.repo, required this.user})
|
|
: super(key: key);
|
|
|
|
@override
|
|
_RepoIssues createState() => _RepoIssues();
|
|
}
|
|
|
|
class _RepoIssues extends State<RepoIssues> {
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
// TODO: implement build
|
|
throw UnimplementedError();
|
|
}
|
|
}
|
|
|
|
class RepoPullRequests extends StatefulWidget {
|
|
final Repository repo;
|
|
final SavedUser user;
|
|
|
|
const RepoPullRequests({Key? key, required this.repo, required this.user})
|
|
: super(key: key);
|
|
|
|
@override
|
|
_RepoPullRequests createState() => _RepoPullRequests();
|
|
}
|
|
|
|
class _RepoPullRequests extends State<RepoPullRequests> {
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
// TODO: implement build
|
|
throw UnimplementedError();
|
|
}
|
|
}
|