GiteaClient/lib/widget/repo_overview.dart
2022-05-15 13:17:53 +02:00

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();
}
}