selfprivacy.org.app/lib/ui/components/jobs_content/jobs_content.dart

186 lines
6.8 KiB
Dart
Raw Normal View History

2021-05-25 21:53:54 +00:00
import 'package:easy_localization/easy_localization.dart';
2024-01-31 05:14:23 +00:00
import 'package:flutter/material.dart';
2021-07-29 05:24:42 +00:00
import 'package:flutter_bloc/flutter_bloc.dart';
2021-06-20 21:08:52 +00:00
import 'package:selfprivacy/config/brand_theme.dart';
2022-08-30 03:09:09 +00:00
import 'package:selfprivacy/logic/cubit/client_jobs/client_jobs_cubit.dart';
import 'package:selfprivacy/logic/cubit/server_installation/server_installation_cubit.dart';
2022-08-30 03:09:09 +00:00
import 'package:selfprivacy/logic/cubit/server_jobs/server_jobs_cubit.dart';
import 'package:selfprivacy/logic/models/json/server_job.dart';
2021-07-29 05:24:42 +00:00
import 'package:selfprivacy/ui/components/brand_loader/brand_loader.dart';
2024-01-31 05:14:23 +00:00
import 'package:selfprivacy/ui/components/buttons/brand_button.dart';
2022-08-26 02:34:25 +00:00
import 'package:selfprivacy/ui/components/jobs_content/server_job_card.dart';
import 'package:selfprivacy/ui/helpers/modals.dart';
2021-05-25 21:53:54 +00:00
class JobsContent extends StatelessWidget {
const JobsContent({
required this.controller,
super.key,
});
final ScrollController controller;
2021-05-25 21:53:54 +00:00
@override
Widget build(final BuildContext context) {
final List<ServerJob> serverJobs =
context.watch<ServerJobsCubit>().state.serverJobList;
final bool hasRemovableJobs =
context.watch<ServerJobsCubit>().state.hasRemovableJobs;
return BlocBuilder<JobsCubit, JobsState>(
builder: (final context, final state) {
late List<Widget> widgets;
final ServerInstallationState installationState =
context.read<ServerInstallationCubit>().state;
if (state is JobsStateEmpty) {
widgets = [
const SizedBox(height: 80),
Center(
child: Text(
'jobs.empty'.tr(),
style: Theme.of(context).textTheme.bodyLarge,
),
),
];
if (installationState is ServerInstallationFinished) {
widgets = [
...widgets,
const SizedBox(height: 80),
BrandButton.rised(
onPressed: () => context.read<JobsCubit>().upgradeServer(),
text: 'jobs.upgrade_server'.tr(),
),
const SizedBox(height: 10),
BrandButton.text(
title: 'jobs.reboot_server'.tr(),
onPressed: () {
showPopUpAlert(
alertTitle: 'jobs.reboot_server'.tr(),
description: 'modals.are_you_sure'.tr(),
actionButtonTitle: 'modals.reboot'.tr(),
actionButtonOnPressed: () =>
{context.read<JobsCubit>().rebootServer()},
);
},
),
];
}
} else if (state is JobsStateLoading) {
widgets = [
const SizedBox(height: 80),
BrandLoader.horizontal(),
];
} else if (state is JobsStateWithJobs) {
widgets = [
2023-03-27 17:29:02 +00:00
...state.clientJobList.map(
(final j) => Row(
children: [
Expanded(
2023-04-05 10:33:53 +00:00
child: Card(
color: Theme.of(context).colorScheme.surfaceVariant,
child: Padding(
padding: const EdgeInsets.symmetric(
horizontal: 15,
vertical: 10,
),
child: Text(
j.title,
style:
Theme.of(context).textTheme.labelLarge?.copyWith(
color: Theme.of(context)
.colorScheme
.onSurfaceVariant,
),
),
),
2023-03-27 17:29:02 +00:00
),
),
const SizedBox(width: 10),
ElevatedButton(
style: ElevatedButton.styleFrom(
backgroundColor:
Theme.of(context).colorScheme.errorContainer,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(10),
),
2023-03-27 17:29:02 +00:00
),
onPressed: () => context.read<JobsCubit>().removeJob(j.id),
child: Text(
'basis.remove'.tr(),
style: TextStyle(
color: Theme.of(context).colorScheme.onErrorContainer,
),
2023-03-27 17:29:02 +00:00
),
),
2023-03-27 17:29:02 +00:00
],
),
),
const SizedBox(height: 20),
BrandButton.rised(
onPressed: () => context.read<JobsCubit>().applyAll(),
text: 'jobs.start'.tr(),
),
];
}
return ListView(
controller: controller,
padding: paddingH15V0,
children: [
const SizedBox(height: 16),
Center(
child: Text(
'jobs.title'.tr(),
style: Theme.of(context).textTheme.headlineSmall,
),
),
const SizedBox(height: 20),
...widgets,
const SizedBox(height: 8),
const Divider(height: 0),
const SizedBox(height: 8),
2022-09-19 00:21:08 +00:00
if (serverJobs.isNotEmpty)
Padding(
padding: const EdgeInsets.all(8.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
'jobs.server_jobs'.tr(),
style: Theme.of(context).textTheme.titleMedium,
),
IconButton(
onPressed: hasRemovableJobs
? () => context
.read<ServerJobsCubit>()
.removeAllFinishedJobs()
: null,
icon: const Icon(Icons.clear_all),
color: Theme.of(context).colorScheme.onBackground,
),
],
2022-09-19 00:21:08 +00:00
),
),
...serverJobs.map(
(final job) => Dismissible(
key: ValueKey(job.uid),
direction: job.status == JobStatusEnum.finished ||
job.status == JobStatusEnum.error
? DismissDirection.horizontal
: DismissDirection.none,
child: ServerJobCard(
serverJob: job,
),
onDismissed: (final direction) {
context.read<ServerJobsCubit>().removeServerJob(job.uid);
},
2021-07-29 05:24:42 +00:00
),
),
const SizedBox(height: 24),
],
);
},
);
}
2021-05-25 21:53:54 +00:00
}