190 lines
6.0 KiB
Dart
190 lines
6.0 KiB
Dart
import 'dart:async';
|
|
|
|
import 'package:auto_route/auto_route.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:immich_mobile/domain/services/login.service.dart';
|
|
import 'package:immich_mobile/i18n/strings.g.dart';
|
|
import 'package:immich_mobile/presentation/components/common/user_avatar.widget.dart';
|
|
import 'package:immich_mobile/presentation/components/image/immich_logo.widget.dart';
|
|
import 'package:immich_mobile/presentation/router/router.dart';
|
|
import 'package:immich_mobile/presentation/states/app_info.state.dart';
|
|
import 'package:immich_mobile/presentation/states/current_user.state.dart';
|
|
import 'package:immich_mobile/presentation/states/server_info.state.dart';
|
|
import 'package:immich_mobile/presentation/theme/app_typography.dart';
|
|
import 'package:immich_mobile/service_locator.dart';
|
|
import 'package:immich_mobile/utils/constants/size_constants.dart';
|
|
import 'package:immich_mobile/utils/extensions/build_context.extension.dart';
|
|
import 'package:immich_mobile/utils/extensions/color.extension.dart';
|
|
import 'package:immich_mobile/utils/extensions/number.extension.dart';
|
|
import 'package:immich_mobile/utils/immich_api_client.dart';
|
|
import 'package:material_symbols_icons/material_symbols_icons.dart';
|
|
import 'package:url_launcher/url_launcher.dart';
|
|
|
|
part 'app_bar_dialog_actions.widget.dart';
|
|
part 'app_bar_dialog_server.widget.dart';
|
|
part 'app_bar_dialog_storage.widget.dart';
|
|
part 'app_bar_dialog_version.widget.dart';
|
|
|
|
class ImAppBarDialog extends StatelessWidget {
|
|
const ImAppBarDialog({super.key});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Dialog(
|
|
insetPadding: EdgeInsets.only(
|
|
left: context.isTablet ? 100 : 15,
|
|
top: context.isTablet ? 15 : 0,
|
|
right: context.isTablet ? 100 : 15,
|
|
bottom: context.isTablet ? 15 : 100,
|
|
),
|
|
shape: const RoundedRectangleBorder(
|
|
borderRadius: BorderRadius.all(Radius.circular(SizeConstants.xm)),
|
|
),
|
|
alignment: Alignment.center,
|
|
child: const Padding(
|
|
padding: EdgeInsets.all(SizeConstants.xs),
|
|
child: SingleChildScrollView(
|
|
child: Column(
|
|
mainAxisSize: MainAxisSize.min,
|
|
children: [
|
|
Padding(
|
|
padding: EdgeInsets.only(bottom: SizeConstants.xm),
|
|
child: _DialogTitleSection(),
|
|
),
|
|
_DialogProfileSection(),
|
|
_DialogStorageSection(),
|
|
_DialogServerSection(),
|
|
_DialogVersionMessage(),
|
|
Padding(
|
|
padding: EdgeInsets.only(top: 3),
|
|
child: _DialogActionLogs(),
|
|
),
|
|
_DialogActionSettings(),
|
|
_DialogActionSignOut(),
|
|
_DialogFooter(),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
class _DialogTitleSection extends StatelessWidget {
|
|
const _DialogTitleSection();
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Padding(
|
|
padding: EdgeInsets.only(left: SizeConstants.xs, top: SizeConstants.xs),
|
|
child: Stack(
|
|
children: [
|
|
Align(
|
|
alignment: Alignment.topLeft,
|
|
child: InkWell(
|
|
onTap: () => unawaited(context.maybePop()),
|
|
child: Icon(Symbols.close_rounded, size: SizeConstants.xm),
|
|
),
|
|
),
|
|
Center(child: ImLogoText(fontSize: SizeConstants.m)),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
class _DialogHighlightedSection extends StatelessWidget {
|
|
final BorderRadiusGeometry? borderRadius;
|
|
final Widget child;
|
|
|
|
const _DialogHighlightedSection({this.borderRadius, required this.child});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
// ignore: avoid-wrapping-in-padding
|
|
return Padding(
|
|
padding: EdgeInsets.only(bottom: 3),
|
|
child: Container(
|
|
padding: EdgeInsets.symmetric(horizontal: SizeConstants.s),
|
|
decoration: BoxDecoration(
|
|
color: context.colorScheme.surface,
|
|
borderRadius: borderRadius,
|
|
),
|
|
child: child,
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
class _DialogProfileSection extends StatelessWidget {
|
|
const _DialogProfileSection();
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final user = di<CurrentUserProvider>().value;
|
|
|
|
return _DialogHighlightedSection(
|
|
borderRadius: const BorderRadius.only(
|
|
topLeft: Radius.circular(SizeConstants.xxs),
|
|
topRight: Radius.circular(SizeConstants.xxs),
|
|
),
|
|
child: ListTile(
|
|
leading: ImUserAvatar(user: user),
|
|
title: Text(
|
|
user.name,
|
|
style: AppTypography.titleMedium.copyWith(
|
|
color: context.colorScheme.primary,
|
|
fontWeight: FontWeight.w500,
|
|
),
|
|
),
|
|
subtitle: Text(
|
|
user.email,
|
|
style: AppTypography.titleMedium.copyWith(
|
|
color: context.colorScheme.onSurface.darken(
|
|
amount: RatioConstants.oneThird,
|
|
),
|
|
fontSize: 12,
|
|
fontWeight: FontWeight.w500,
|
|
),
|
|
),
|
|
minLeadingWidth: SizeConstants.xl,
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
class _DialogFooter extends StatelessWidget {
|
|
const _DialogFooter();
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Padding(
|
|
padding: const EdgeInsets.symmetric(vertical: SizeConstants.s),
|
|
child: Row(
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
children: [
|
|
InkWell(
|
|
onTap: () => unawaited(launchUrl(
|
|
Uri.parse('https://immich.app'),
|
|
mode: LaunchMode.externalApplication,
|
|
)),
|
|
child:
|
|
Text(context.t.common.components.appbar.footer_documentation),
|
|
),
|
|
const SizedBox(
|
|
width: 20,
|
|
child: Text("•", textAlign: TextAlign.center),
|
|
),
|
|
InkWell(
|
|
onTap: () => unawaited(launchUrl(
|
|
Uri.parse('https://github.com/immich-app/immich'),
|
|
mode: LaunchMode.externalApplication,
|
|
)),
|
|
child: Text(context.t.common.components.appbar.footer_github),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
}
|