You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			170 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			Dart
		
	
			
		
		
	
	
			170 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			Dart
		
	
import 'package:flutter/material.dart';
 | 
						|
 | 
						|
import 'package:matrix/matrix.dart';
 | 
						|
 | 
						|
import 'package:fluffychat/config/themes.dart';
 | 
						|
import 'package:fluffychat/l10n/l10n.dart';
 | 
						|
import 'package:fluffychat/pages/settings_notifications/push_rule_extensions.dart';
 | 
						|
import 'package:fluffychat/widgets/layouts/max_width_body.dart';
 | 
						|
import '../../utils/localized_exception_extension.dart';
 | 
						|
import '../../widgets/matrix.dart';
 | 
						|
import 'settings_notifications.dart';
 | 
						|
 | 
						|
class SettingsNotificationsView extends StatelessWidget {
 | 
						|
  final SettingsNotificationsController controller;
 | 
						|
 | 
						|
  const SettingsNotificationsView(this.controller, {super.key});
 | 
						|
 | 
						|
  @override
 | 
						|
  Widget build(BuildContext context) {
 | 
						|
    final pushRules = Matrix.of(context).client.globalPushRules;
 | 
						|
    final pushCategories = [
 | 
						|
      if (pushRules?.override?.isNotEmpty ?? false)
 | 
						|
        (rules: pushRules?.override ?? [], kind: PushRuleKind.override),
 | 
						|
      if (pushRules?.content?.isNotEmpty ?? false)
 | 
						|
        (rules: pushRules?.content ?? [], kind: PushRuleKind.content),
 | 
						|
      if (pushRules?.sender?.isNotEmpty ?? false)
 | 
						|
        (rules: pushRules?.sender ?? [], kind: PushRuleKind.sender),
 | 
						|
      if (pushRules?.underride?.isNotEmpty ?? false)
 | 
						|
        (rules: pushRules?.underride ?? [], kind: PushRuleKind.underride),
 | 
						|
    ];
 | 
						|
    return Scaffold(
 | 
						|
      appBar: AppBar(
 | 
						|
        automaticallyImplyLeading: !FluffyThemes.isColumnMode(context),
 | 
						|
        centerTitle: FluffyThemes.isColumnMode(context),
 | 
						|
        title: Text(L10n.of(context).notifications),
 | 
						|
      ),
 | 
						|
      body: MaxWidthBody(
 | 
						|
        child: StreamBuilder(
 | 
						|
          stream: Matrix.of(context).client.onSync.stream.where(
 | 
						|
                (syncUpdate) =>
 | 
						|
                    syncUpdate.accountData?.any(
 | 
						|
                      (accountData) => accountData.type == 'm.push_rules',
 | 
						|
                    ) ??
 | 
						|
                    false,
 | 
						|
              ),
 | 
						|
          builder: (BuildContext context, _) {
 | 
						|
            final theme = Theme.of(context);
 | 
						|
            return SelectionArea(
 | 
						|
              child: Column(
 | 
						|
                children: [
 | 
						|
                  if (pushRules != null)
 | 
						|
                    for (final category in pushCategories) ...[
 | 
						|
                      ListTile(
 | 
						|
                        title: Text(
 | 
						|
                          category.kind.localized(L10n.of(context)),
 | 
						|
                          style: TextStyle(
 | 
						|
                            color: theme.colorScheme.secondary,
 | 
						|
                            fontWeight: FontWeight.bold,
 | 
						|
                          ),
 | 
						|
                        ),
 | 
						|
                      ),
 | 
						|
                      for (final rule in category.rules)
 | 
						|
                        ListTile(
 | 
						|
                          title: Text(rule.getPushRuleName(L10n.of(context))),
 | 
						|
                          subtitle: Text.rich(
 | 
						|
                            TextSpan(
 | 
						|
                              children: [
 | 
						|
                                TextSpan(
 | 
						|
                                  text: rule.getPushRuleDescription(
 | 
						|
                                    L10n.of(context),
 | 
						|
                                  ),
 | 
						|
                                ),
 | 
						|
                                const TextSpan(text: ' '),
 | 
						|
                                WidgetSpan(
 | 
						|
                                  child: InkWell(
 | 
						|
                                    onTap: () => controller.editPushRule(
 | 
						|
                                      rule,
 | 
						|
                                      category.kind,
 | 
						|
                                    ),
 | 
						|
                                    child: Text(
 | 
						|
                                      L10n.of(context).more,
 | 
						|
                                      style: TextStyle(
 | 
						|
                                        color: theme.colorScheme.primary,
 | 
						|
                                        decoration: TextDecoration.underline,
 | 
						|
                                        decorationColor:
 | 
						|
                                            theme.colorScheme.primary,
 | 
						|
                                      ),
 | 
						|
                                    ),
 | 
						|
                                  ),
 | 
						|
                                ),
 | 
						|
                              ],
 | 
						|
                            ),
 | 
						|
                          ),
 | 
						|
                          trailing: Switch.adaptive(
 | 
						|
                            value: rule.enabled,
 | 
						|
                            onChanged: controller.isLoading
 | 
						|
                                ? null
 | 
						|
                                : rule.ruleId != '.m.rule.master' &&
 | 
						|
                                        Matrix.of(context)
 | 
						|
                                            .client
 | 
						|
                                            .allPushNotificationsMuted
 | 
						|
                                    ? null
 | 
						|
                                    : (_) => controller.togglePushRule(
 | 
						|
                                          category.kind,
 | 
						|
                                          rule,
 | 
						|
                                        ),
 | 
						|
                          ),
 | 
						|
                        ),
 | 
						|
                      Divider(color: theme.dividerColor),
 | 
						|
                    ],
 | 
						|
                  ListTile(
 | 
						|
                    title: Text(
 | 
						|
                      L10n.of(context).devices,
 | 
						|
                      style: TextStyle(
 | 
						|
                        color: theme.colorScheme.secondary,
 | 
						|
                        fontWeight: FontWeight.bold,
 | 
						|
                      ),
 | 
						|
                    ),
 | 
						|
                  ),
 | 
						|
                  FutureBuilder<List<Pusher>?>(
 | 
						|
                    future: controller.pusherFuture ??=
 | 
						|
                        Matrix.of(context).client.getPushers(),
 | 
						|
                    builder: (context, snapshot) {
 | 
						|
                      if (snapshot.hasError) {
 | 
						|
                        Center(
 | 
						|
                          child: Text(
 | 
						|
                            snapshot.error!.toLocalizedString(context),
 | 
						|
                          ),
 | 
						|
                        );
 | 
						|
                      }
 | 
						|
                      if (snapshot.connectionState != ConnectionState.done) {
 | 
						|
                        const Center(
 | 
						|
                          child: CircularProgressIndicator.adaptive(
 | 
						|
                            strokeWidth: 2,
 | 
						|
                          ),
 | 
						|
                        );
 | 
						|
                      }
 | 
						|
                      final pushers = snapshot.data ?? [];
 | 
						|
                      if (pushers.isEmpty) {
 | 
						|
                        return Center(
 | 
						|
                          child: Padding(
 | 
						|
                            padding: const EdgeInsets.only(bottom: 16.0),
 | 
						|
                            child: Text(L10n.of(context).noOtherDevicesFound),
 | 
						|
                          ),
 | 
						|
                        );
 | 
						|
                      }
 | 
						|
                      return ListView.builder(
 | 
						|
                        physics: const NeverScrollableScrollPhysics(),
 | 
						|
                        shrinkWrap: true,
 | 
						|
                        itemCount: pushers.length,
 | 
						|
                        itemBuilder: (_, i) => ListTile(
 | 
						|
                          title: Text(
 | 
						|
                            '${pushers[i].appDisplayName} - ${pushers[i].appId}',
 | 
						|
                          ),
 | 
						|
                          subtitle: Text(pushers[i].data.url.toString()),
 | 
						|
                          onTap: () => controller.onPusherTap(pushers[i]),
 | 
						|
                        ),
 | 
						|
                      );
 | 
						|
                    },
 | 
						|
                  ),
 | 
						|
                ],
 | 
						|
              ),
 | 
						|
            );
 | 
						|
          },
 | 
						|
        ),
 | 
						|
      ),
 | 
						|
    );
 | 
						|
  }
 | 
						|
}
 |