Merge pull request #110 from pangeachat/usability-testing

refresh button tooltip + message explaining archive, direct chat with…
pull/1011/head
ggurdin 2 years ago committed by GitHub
commit 1f081888ca
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -3790,7 +3790,7 @@
} }
}, },
"freeTrialDesc": "New users recieve a one week free trial of Pangea Chat", "freeTrialDesc": "New users recieve a one week free trial of Pangea Chat",
"activateTrial": "Activate Trial", "activateTrial": "Activate Free Trial",
"inNoSpaces": "You are not a member of any classes or exchanges", "inNoSpaces": "You are not a member of any classes or exchanges",
"successfullySubscribed": "You have successfully subscribed!", "successfullySubscribed": "You have successfully subscribed!",
"clickToManageSubscription": "Click here to manage your subscription.", "clickToManageSubscription": "Click here to manage your subscription.",
@ -3948,5 +3948,6 @@
"age": {} "age": {}
} }
}, },
"kickBotWarning": "Kicking Pangea Bot will remove the conversation bot from this chat." "kickBotWarning": "Kicking Pangea Bot will remove the conversation bot from this chat.",
"refresh": "Refresh"
} }

@ -4469,7 +4469,6 @@
} }
}, },
"freeTrialDesc": "Los nuevos usuarios reciben una semana de prueba gratuita de Pangea Chat", "freeTrialDesc": "Los nuevos usuarios reciben una semana de prueba gratuita de Pangea Chat",
"activateTrial": "Activar prueba",
"successfullySubscribed": "Se ha suscrito correctamente.", "successfullySubscribed": "Se ha suscrito correctamente.",
"clickToManageSubscription": "Haga clic aquí para gestionar su suscripción.", "clickToManageSubscription": "Haga clic aquí para gestionar su suscripción.",
"emptyInviteWarning": "Añade este chat a una clase o intercambio para invitar a otros usuarios.", "emptyInviteWarning": "Añade este chat a una clase o intercambio para invitar a otros usuarios.",
@ -4582,5 +4581,7 @@
} }
}, },
"selectToDefine": "Haga doble clic en una palabra para ver su definición.", "selectToDefine": "Haga doble clic en una palabra para ver su definición.",
"kickBotWarning": "Patear Pangea Bot eliminará el bot de conversación de este chat." "kickBotWarning": "Patear Pangea Bot eliminará el bot de conversación de este chat.",
"activateTrial": "Activar prueba gratuita",
"refresh": "Actualizar"
} }

@ -1,3 +1,4 @@
import 'package:adaptive_dialog/adaptive_dialog.dart';
import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/config/app_config.dart';
import 'package:fluffychat/pages/chat_details/chat_details.dart'; import 'package:fluffychat/pages/chat_details/chat_details.dart';
import 'package:fluffychat/pages/chat_details/participant_list_item.dart'; import 'package:fluffychat/pages/chat_details/participant_list_item.dart';
@ -531,7 +532,18 @@ class ChatDetailsView extends StatelessWidget {
Icons.archive_outlined, Icons.archive_outlined,
), ),
), ),
onTap: () => showFutureLoadingDialog( onTap: () async {
final confirmed = await showOkCancelAlertDialog(
useRootNavigator: false,
context: context,
title: L10n.of(context)!.areYouSure,
okLabel: L10n.of(context)!.ok,
cancelLabel: L10n.of(context)!.cancel,
message:
L10n.of(context)!.archiveRoomDescription,
);
if (confirmed == OkCancelResult.ok) {
final success = await showFutureLoadingDialog(
context: context, context: context,
future: () async { future: () async {
room.isSpace room.isSpace
@ -540,10 +552,14 @@ class ChatDetailsView extends StatelessWidget {
Matrix.of(context).client, Matrix.of(context).client,
) )
: await room.leave(); : await room.leave();
},
);
if (success.error == null) {
context.go('/rooms'); context.go('/rooms');
}
}
}, },
), ),
),
if (room.isRoomAdmin && !room.isDirectChat) if (room.isRoomAdmin && !room.isDirectChat)
SwitchListTile.adaptive( SwitchListTile.adaptive(
activeColor: AppConfig.activeToggleColor, activeColor: AppConfig.activeToggleColor,

@ -523,13 +523,26 @@ class _SpaceViewState extends State<SpaceView> {
MatrixLocals(L10n.of(context)!), MatrixLocals(L10n.of(context)!),
), ),
), ),
trailing: IconButton( // #Pangea
// trailing: IconButton(
// icon: loading
// ? const CircularProgressIndicator.adaptive(strokeWidth: 2)
// : const Icon(Icons.refresh_outlined),
// onPressed: loading ? null : _refresh,
// ),
trailing: Tooltip(
message: L10n.of(context)!.refresh,
child: IconButton(
icon: loading icon: loading
? const CircularProgressIndicator.adaptive(strokeWidth: 2) ? const CircularProgressIndicator.adaptive(
strokeWidth: 2,
)
: const Icon(Icons.refresh_outlined), : const Icon(Icons.refresh_outlined),
onPressed: loading ? null : _refresh, onPressed: loading ? null : _refresh,
), ),
), ),
// Pangea#
),
), ),
Builder( Builder(
builder: (context) { builder: (context) {

@ -1,15 +1,15 @@
import 'package:fluffychat/config/app_config.dart';
import 'package:fluffychat/pangea/config/environment.dart';
import 'package:fluffychat/utils/fluffy_share.dart';
import 'package:fluffychat/widgets/avatar.dart';
import 'package:fluffychat/widgets/matrix.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/l10n.dart'; import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:future_loading_dialog/future_loading_dialog.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import 'package:matrix/matrix.dart'; import 'package:matrix/matrix.dart';
import 'package:url_launcher/url_launcher_string.dart'; import 'package:url_launcher/url_launcher_string.dart';
import 'package:fluffychat/config/app_config.dart';
import 'package:fluffychat/pangea/config/environment.dart';
import 'package:fluffychat/utils/fluffy_share.dart';
import 'package:fluffychat/widgets/avatar.dart';
import 'package:fluffychat/widgets/matrix.dart';
import 'settings.dart'; import 'settings.dart';
class SettingsView extends StatelessWidget { class SettingsView extends StatelessWidget {
@ -208,7 +208,22 @@ class SettingsView extends StatelessWidget {
ListTile( ListTile(
leading: const Icon(Icons.help_outline_outlined), leading: const Icon(Icons.help_outline_outlined),
title: Text(L10n.of(context)!.help), title: Text(L10n.of(context)!.help),
onTap: () => launchUrlString(AppConfig.supportUrl), // #Pangea
// onTap: () => launchUrlString(AppConfig.supportUrl),
onTap: () async {
await showFutureLoadingDialog(
context: context,
future: () async {
final String roomId =
await Matrix.of(context).client.startDirectChat(
Environment.supportUserId,
enableEncryption: false,
);
context.go('/rooms/$roomId');
},
);
},
// Pangea#
trailing: const Icon(Icons.open_in_new_outlined), trailing: const Icon(Icons.open_in_new_outlined),
), ),
ListTile( ListTile(

@ -68,4 +68,8 @@ class Environment {
return dotenv.env["STRIPE_MANAGEMENT_LINK"] ?? return dotenv.env["STRIPE_MANAGEMENT_LINK"] ??
'https://billing.stripe.com/p/login/dR6dSkf5p6rBc4EcMM'; 'https://billing.stripe.com/p/login/dR6dSkf5p6rBc4EcMM';
} }
static String get supportUserId {
return isStaging ? '@support:staging.pangea.chat' : '@support:pangea.chat';
}
} }

@ -260,6 +260,7 @@ class UserController extends BaseController {
final PUserModel newUserModel = await PUserRepo.repoCreatePangeaUser( final PUserModel newUserModel = await PUserRepo.repoCreatePangeaUser(
userID: userId!, userID: userId!,
fullName: fullname, fullName: fullname,
dob: dob,
matrixAccessToken: _matrixAccessToken!, matrixAccessToken: _matrixAccessToken!,
); );
await _savePUserModel(newUserModel); await _savePUserModel(newUserModel);

@ -85,7 +85,7 @@ class SubscriptionManagementController extends State<SubscriptionManagement> {
""; "";
bool get showManagementOptions { bool get showManagementOptions {
if (!currentSubscriptionAvailable) { if (!currentSubscriptionAvailable || isNewUserTrial) {
return false; return false;
} }
if (subscriptionController.subscription!.purchasedOnWeb) { if (subscriptionController.subscription!.purchasedOnWeb) {
@ -102,7 +102,9 @@ class SubscriptionManagementController extends State<SubscriptionManagement> {
context, context,
isPromo: isPromo, isPromo: isPromo,
); );
setState(() {}); setState(() {
selectedSubscription = null;
});
} catch (err) { } catch (err) {
showOkAlertDialog( showOkAlertDialog(
context: context, context: context,
@ -164,6 +166,11 @@ class SubscriptionManagementController extends State<SubscriptionManagement> {
setState(() => selectedSubscription = subscription); setState(() => selectedSubscription = subscription);
} }
bool isCurrentSubscription(SubscriptionDetails subscription) =>
subscriptionController.subscription?.currentSubscription ==
subscription ||
isNewUserTrial && subscription.isTrial;
@override @override
Widget build(BuildContext context) => SettingsSubscriptionView(this); Widget build(BuildContext context) => SettingsSubscriptionView(this);
} }

@ -13,20 +13,7 @@ class SettingsSubscriptionView extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( final List<Widget> managementButtons = [
appBar: AppBar(
centerTitle: true,
title: Text(
L10n.of(context)!.subscriptionManagement,
),
),
body: ListTileTheme(
iconColor: Theme.of(context).textTheme.bodyLarge!.color,
child: MaxWidthBody(
child: !(controller.subscriptionController.isSubscribed)
? ChangeSubscription(controller: controller)
: Column(
children: [
if (controller.currentSubscriptionAvailable) if (controller.currentSubscriptionAvailable)
ListTile( ListTile(
title: Text(L10n.of(context)!.currentSubscription), title: Text(L10n.of(context)!.currentSubscription),
@ -54,8 +41,7 @@ class SettingsSubscriptionView extends StatelessWidget {
), ),
ListTile( ListTile(
title: Text(L10n.of(context)!.paymentHistory), title: Text(L10n.of(context)!.paymentHistory),
trailing: trailing: const Icon(Icons.keyboard_arrow_right_outlined),
const Icon(Icons.keyboard_arrow_right_outlined),
onTap: () => controller.launchMangementUrl( onTap: () => controller.launchMangementUrl(
ManagementOption.history, ManagementOption.history,
), ),
@ -63,11 +49,29 @@ class SettingsSubscriptionView extends StatelessWidget {
), ),
], ],
), ),
const SizedBox(height: 50), ];
if (!(controller.showManagementOptions))
return Scaffold(
appBar: AppBar(
centerTitle: true,
title: Text(
L10n.of(context)!.subscriptionManagement,
),
),
body: ListTileTheme(
iconColor: Theme.of(context).textTheme.bodyLarge!.color,
child: MaxWidthBody(
child: Column(
children: [
if (controller.subscriptionController.isSubscribed &&
!controller.showManagementOptions)
ManagementNotAvailableWarning( ManagementNotAvailableWarning(
controller: controller, controller: controller,
), ),
if (!(controller.subscriptionController.isSubscribed) ||
controller.isNewUserTrial)
ChangeSubscription(controller: controller),
if (controller.showManagementOptions) ...managementButtons,
], ],
), ),
), ),

@ -13,6 +13,7 @@ import '../network/urls.dart';
class PUserRepo { class PUserRepo {
static Future<PUserModel> repoCreatePangeaUser({ static Future<PUserModel> repoCreatePangeaUser({
required String userID, required String userID,
required String dob,
required fullName, required fullName,
required String matrixAccessToken, required String matrixAccessToken,
}) async { }) async {
@ -24,6 +25,7 @@ class PUserRepo {
final Map<String, dynamic> body = { final Map<String, dynamic> body = {
ModelKey.userFullName: fullName, ModelKey.userFullName: fullName,
ModelKey.userPangeaUserId: userID, ModelKey.userPangeaUserId: userID,
ModelKey.userDateOfBirth: dob,
}; };
final Response res = await req.post( final Response res = await req.post(
url: PApiUrls.createUser, url: PApiUrls.createUser,

@ -40,7 +40,8 @@ class SubscriptionButtons extends StatelessWidget {
selected: controller.selectedSubscription == subscription, selected: controller.selectedSubscription == subscription,
selectedTileColor: selectedTileColor:
Theme.of(context).colorScheme.secondary.withAlpha(16), Theme.of(context).colorScheme.secondary.withAlpha(16),
enabled: !subscription.isTrial || inTrialWindow, enabled: (!subscription.isTrial || inTrialWindow) &&
!controller.isCurrentSubscription(subscription),
onTap: () { onTap: () {
controller.selectSubscription(subscription); controller.selectSubscription(subscription);
}, },

Loading…
Cancel
Save