feat: wip contributors screen.

This commit is contained in:
Aunali321
2022-08-12 23:37:16 +05:30
parent 4d3ea65d7f
commit 739673dd8f
13 changed files with 271 additions and 7 deletions

View File

@ -0,0 +1,56 @@
import 'package:flutter/material.dart';
import 'package:revanced_manager/ui/views/contributors/contributors_viewmodel.dart';
import 'package:revanced_manager/ui/widgets/contributors_card.dart';
import 'package:stacked/stacked.dart';
class ContributorsView extends StatelessWidget {
const ContributorsView({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return ViewModelBuilder<ContributorsViewModel>.reactive(
disposeViewModel: false,
viewModelBuilder: () => ContributorsViewModel(),
onModelReady: (model) => model.getContributors(),
builder: (context, model, child) => Scaffold(
floatingActionButton: FloatingActionButton(
onPressed: () => model.getContributors(),
child: const Icon(Icons.refresh),
),
body: SafeArea(
child: SingleChildScrollView(
child: Column(
children: [
ContributorsCard(
title: "Patcher Contributors",
contributors: model.patcherContributors,
height: 60,
),
ContributorsCard(
title: "Patches Contributors",
contributors: model.patchesContributors,
height: 230,
),
ContributorsCard(
title: "Integrations Contributors",
contributors: model.integrationsContributors,
height: 230,
),
ContributorsCard(
title: "CLI Contributors",
contributors: model.cliContributors,
height: 180,
),
ContributorsCard(
title: "Manager Contributors",
contributors: model.managerContributors,
height: 130,
),
],
),
),
),
),
);
}
}

View File

@ -0,0 +1,27 @@
import 'package:github/github.dart';
import 'package:revanced_manager/services/github_api.dart';
import 'package:stacked/stacked.dart';
class ContributorsViewModel extends BaseViewModel {
final GithubAPI githubAPI = GithubAPI();
List<Contributor> patchesContributors = [];
List<Contributor> integrationsContributors = [];
List<Contributor> patcherContributors = [];
List<Contributor> cliContributors = [];
List<Contributor> managerContributors = [];
Future<List<Contributor>> getContributors() async {
patchesContributors =
await githubAPI.getContributors('revanced', 'revanced-patches');
integrationsContributors =
await githubAPI.getContributors('revanced', 'revanced-integrations');
patcherContributors =
await githubAPI.getContributors('revanced', 'revanced-patcher');
cliContributors =
await githubAPI.getContributors('revanced', 'revanced-cli');
managerContributors =
await githubAPI.getContributors('revanced', 'revanced-manager');
return [];
}
}

View File

@ -77,6 +77,7 @@ class SettingsView extends StatelessWidget {
),
ListTile(
title: I18nText('settingsView.contributorsLabel'),
onTap: model.navigateToContributors,
),
],
),

View File

@ -1,7 +1,16 @@
import 'package:revanced_manager/app/app.locator.dart';
import 'package:revanced_manager/app/app.router.dart';
import 'package:stacked/stacked.dart';
import 'package:stacked_services/stacked_services.dart';
class SettingsViewModel extends BaseViewModel {
final _navigationService = locator<NavigationService>();
void setLanguage(String language) {
notifyListeners();
}
void navigateToContributors() {
_navigationService.navigateTo(Routes.contributorsView);
}
}

View File

@ -0,0 +1,74 @@
import 'package:flutter/material.dart';
import 'package:github/github.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:revanced_manager/constants.dart';
import 'package:url_launcher/url_launcher.dart';
class ContributorsCard extends StatefulWidget {
final String title;
final List<Contributor> contributors;
final double height;
const ContributorsCard({
Key? key,
required this.title,
required this.contributors,
this.height = 200,
}) : super(key: key);
@override
State<ContributorsCard> createState() => _ContributorsCardState();
}
class _ContributorsCardState extends State<ContributorsCard> {
@override
Widget build(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: const EdgeInsets.symmetric(vertical: 4.0, horizontal: 4.0),
child: Text(
widget.title,
style: GoogleFonts.poppins(
fontSize: 20,
fontWeight: FontWeight.w600,
),
),
),
Container(
margin: const EdgeInsets.all(8.0),
padding: const EdgeInsets.all(4.0),
decoration: BoxDecoration(
color: Theme.of(context).colorScheme.tertiary,
borderRadius: BorderRadius.circular(8.0),
),
height: widget.height,
child: GridView.builder(
physics: const NeverScrollableScrollPhysics(),
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 7,
mainAxisSpacing: 8,
crossAxisSpacing: 8,
),
itemCount: widget.contributors.length,
itemBuilder: (context, index) {
return ClipRRect(
borderRadius: BorderRadius.circular(100),
child: GestureDetector(
onTap: () =>
launchUrl(Uri.parse(widget.contributors[index].htmlUrl!)),
child: Image.network(
widget.contributors[index].avatarUrl!,
height: 40,
width: 40,
),
),
);
},
),
),
],
);
}
}