Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions assets/l10n/intl_en.arb
Original file line number Diff line number Diff line change
Expand Up @@ -3483,6 +3483,17 @@
"count": {}
}
},
"contactsVisibility": "Contacts visibility",
"whoCanFindMeByMyContacts": "Who can find me by my contacts",
"whoCanSeeMyPhoneEmail": "WHO CAN SEE MY PHONE/EMAIL",
"everyOne": "Everyone",
"myContacts": "My Contacts",
"nobody": "Nobody",
"chooseWhichDetailsAreVisibleToOtherUsers": "CHOOSE WHICH DETAILS ARE VISIBLE TO OTHER USERS",
"youNumberIsVisibleAccordingToTheSettingAbove": "Your number is visible according to the setting above",
"youEmailIsVisibleAccordingToTheSettingAbove": "Your email is visible according to the setting above",
"failedToChangeContactsVisibility": "Failed to change contacts visibility",
"failedToGetContactsVisibility": "Failed to get contacts visibility",
"unblockUserToSendMessages": "Unblock user to send messages",
"supportChat": "Support Chat",
"supportChatDescription": "I’ve got your back! If you encounter bugs or need any help using Twake Workplace, send a message, I will reply to you swiftly"
Expand Down
7 changes: 4 additions & 3 deletions integration_test/robots/home_robot.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import 'package:fluffychat/widgets/twake_components/twake_navigation_icon/twake_navigation_icon.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/material.dart';
import 'package:patrol/patrol.dart';
import '../base/core_robot.dart';
import 'chat_list_robot.dart';
Expand All @@ -18,7 +18,7 @@ class HomeRobot extends CoreRobot {
}

Future<PatrolFinder> getSettingTab() async {
return $('Settings');
return $(const Key('settings_navigation_destination'));
}

Future<ContactListRobot> gotoContactListAndGrantContactPermission() async {
Expand All @@ -37,7 +37,8 @@ class HomeRobot extends CoreRobot {
}

Future<SettingRobot> gotoSettingScreen() async {
await (await getSettingTab()).tap();
final settingTab = await getSettingTab();
await settingTab.tap();
await $.pumpAndSettle();
return SettingRobot($);
}
Expand Down
7 changes: 4 additions & 3 deletions integration_test/robots/setting/setting_robot.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import 'package:fluffychat/pages/settings_dashboard/settings_app_language/settin
import 'package:fluffychat/pages/settings_dashboard/settings_chat/settings_chat_view.dart';
import 'package:fluffychat/pages/settings_dashboard/settings_notifications/settings_notifications_view.dart';
import 'package:fluffychat/pages/settings_dashboard/settings_security/settings_security_view.dart';
import 'package:fluffychat/presentation/enum/settings/settings_enum.dart';
import 'package:flutter/material.dart';
import 'package:linagora_design_flutter/dialog/confirmation_dialog_builder.dart';
import 'package:patrol/patrol.dart';
Expand All @@ -20,8 +21,8 @@ class SettingRobot extends HomeRobot {
return $("Chat");
}

PatrolFinder privateAndSecuritySetting() {
return $("Privacy & Security");
PatrolFinder privacyAndSecuritySetting() {
return $(Key(SettingEnum.privacyAndSecurity.name));
}

PatrolFinder notificationsSetting() {
Expand Down Expand Up @@ -54,7 +55,7 @@ class SettingRobot extends HomeRobot {
}

Future<void> openPrivacyAndSecuritySetting() async {
await privateAndSecuritySetting().tap();
await privacyAndSecuritySetting().tap();
await $.waitUntilVisible($(SettingsSecurityView));
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
import 'package:fluffychat/domain/model/user_info/user_info_visibility.dart';
import 'package:fluffychat/pages/settings_dashboard/settings_contacts_visibility/settings_contacts_visibility_enum.dart';
import 'package:fluffychat/pages/settings_dashboard/settings_contacts_visibility/settings_contacts_visibility_view.dart';
import 'package:flutter/material.dart';
import 'package:patrol/patrol.dart';
import '../home_robot.dart';

class SettingsContactsVisibilityRobot extends HomeRobot {
SettingsContactsVisibilityRobot(super.$);

// Visibility option finders
PatrolFinder visibilityOption(
SettingsContactsVisibilityEnum visibilityOption,
) {
return $(Key('visibility_option_${visibilityOption.name}'));
}

PatrolFinder visibilityOptionSelected(
SettingsContactsVisibilityEnum visibilityOption,
) {
return $(Key('visibility_option_selected_${visibilityOption.name}'));
}

// Specific visibility options
PatrolFinder everyoneOption() {
return visibilityOption(SettingsContactsVisibilityEnum.public);
}

PatrolFinder contactsOption() {
return visibilityOption(SettingsContactsVisibilityEnum.contacts);
}

PatrolFinder nobodyOption() {
return visibilityOption(SettingsContactsVisibilityEnum.private);
}

// Selected state finders
PatrolFinder everyoneSelected() {
return visibilityOptionSelected(SettingsContactsVisibilityEnum.public);
}

PatrolFinder contactsSelected() {
return visibilityOptionSelected(SettingsContactsVisibilityEnum.contacts);
}

PatrolFinder nobodySelected() {
return visibilityOptionSelected(SettingsContactsVisibilityEnum.private);
}

// Visible field option finders
PatrolFinder visibleFieldOption(VisibleEnum visibleEnum) {
return $(Key('visible_field_option_${visibleEnum.name}'));
}

PatrolFinder visibleFieldOptionSelected(VisibleEnum visibleEnum) {
return $(Key('visible_field_option_selected_${visibleEnum.name}'));
}

// Specific visible field options
PatrolFinder emailFieldOption() {
return visibleFieldOption(VisibleEnum.email);
}

PatrolFinder phoneNumberFieldOption() {
return visibleFieldOption(VisibleEnum.phone);
}

// Selected state finders for fields
PatrolFinder emailFieldSelected() {
return visibleFieldOptionSelected(VisibleEnum.email);
}

PatrolFinder phoneNumberFieldSelected() {
return visibleFieldOptionSelected(VisibleEnum.phone);
}

// Actions
Future<void> selectEveryoneOption() async {
await everyoneOption().tap();
await $.waitUntilVisible(everyoneSelected());
}

Future<void> selectContactsOption() async {
await contactsOption().tap();
await $.waitUntilVisible(contactsSelected());
}

Future<void> selectNobodyOption() async {
await nobodyOption().tap();
await $.waitUntilVisible(nobodySelected());
}

Future<void> toggleEmailField() async {
await emailFieldOption().tap();
await $.pumpAndSettle();
}

Future<void> togglePhoneNumberField() async {
await phoneNumberFieldOption().tap();
await $.pumpAndSettle();
}

// Helper methods to check states
bool isEveryoneSelected() {
return everyoneSelected().exists;
}

bool isContactsSelected() {
return contactsSelected().exists;
}

bool isNobodySelected() {
return nobodySelected().exists;
}

bool isEmailFieldSelected() {
return emailFieldSelected().exists;
}

bool isPhoneNumberFieldSelected() {
return phoneNumberFieldSelected().exists;
}

Future<void> waitForView() async {
await $.waitUntilVisible($(SettingsContactsVisibilityView));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import 'package:fluffychat/pages/settings_dashboard/settings_contacts_visibility/settings_contacts_visibility_view.dart';
import 'package:flutter/cupertino.dart';
import 'package:patrol/patrol.dart';

import '../home_robot.dart';

class SettingsPrivacyAndSecurityRobot extends HomeRobot {
SettingsPrivacyAndSecurityRobot(super.$);

PatrolFinder contactVisibilitySetting() {
return $(const Key('contacts_visibility_settings_item'));
}

Future<void> openContactVisibilitySetting() async {
await contactVisibilitySetting().tap();
await $.waitUntilVisible($(SettingsContactsVisibilityView));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
import 'package:flutter_test/flutter_test.dart';

import '../../base/test_base.dart';
import '../../robots/home_robot.dart';
import '../../robots/setting/settings_contacts_visibility_robot.dart';
import '../../robots/setting/settings_privacy_and_security_robot.dart';

void main() {
TestBase().twakePatrolTest(
description:
'Open settings contact visibility screen test and verify everyone option is present',
test: ($) async {
final settingsRobot = await HomeRobot($).gotoSettingScreen();

await settingsRobot.openPrivacyAndSecuritySetting();

await SettingsPrivacyAndSecurityRobot($).openContactVisibilitySetting();

final contactsVisibilityRobot = SettingsContactsVisibilityRobot($);
await contactsVisibilityRobot.waitForView();

// Verify everyone option is present
await contactsVisibilityRobot.everyoneOption().waitUntilVisible();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please verify no fields display when use everyone option


// Select every one option
await contactsVisibilityRobot.selectEveryoneOption();

// Wait for UI to settle after selection
await $.pumpAndSettle();

// Verify email and phone fields are NOT visible when everyone is selected
expect(
contactsVisibilityRobot.emailFieldOption(),
findsNothing,
);
expect(
contactsVisibilityRobot.phoneNumberFieldOption(),
findsNothing,
);
},
);

TestBase().twakePatrolTest(
description:
'Open settings contact visibility screen test and my contacts option is present',
test: ($) async {
final settingsRobot = await HomeRobot($).gotoSettingScreen();

await settingsRobot.openPrivacyAndSecuritySetting();

await SettingsPrivacyAndSecurityRobot($).openContactVisibilitySetting();

final contactsVisibilityRobot = SettingsContactsVisibilityRobot($);
await contactsVisibilityRobot.waitForView();

// Verify contacts option is present
await contactsVisibilityRobot.contactsOption().waitUntilVisible();

// Select contacts option
await contactsVisibilityRobot.selectContactsOption();

// Wait for UI to settle after selection
await $.pumpAndSettle();

// Verify email and phone visible fields are present
await contactsVisibilityRobot.emailFieldOption().waitUntilVisible();

await contactsVisibilityRobot.phoneNumberFieldOption().waitUntilVisible();
},
);

TestBase().twakePatrolTest(
description:
'Open settings contact visibility screen test and nobody option is present',
test: ($) async {
final settingsRobot = await HomeRobot($).gotoSettingScreen();

await settingsRobot.openPrivacyAndSecuritySetting();

await SettingsPrivacyAndSecurityRobot($).openContactVisibilitySetting();

final contactsVisibilityRobot = SettingsContactsVisibilityRobot($);
await contactsVisibilityRobot.waitForView();

// Verify nobody option is present
await contactsVisibilityRobot.nobodyOption().waitUntilVisible();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please verify no fields display when use nobody option


// Select nobody option
await contactsVisibilityRobot.selectNobodyOption();

// Wait for UI to settle after selection
await $.pumpAndSettle();

// Verify email and phone fields are NOT visible when nobody is selected
expect(
contactsVisibilityRobot.emailFieldOption(),
findsNothing,
);
expect(
contactsVisibilityRobot.phoneNumberFieldOption(),
findsNothing,
);
},
);
}
11 changes: 11 additions & 0 deletions lib/config/go_routes/app_route_paths.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
/// Route path constants for the application.
///
/// This file contains all route paths used in go_router configuration
/// and navigation calls to ensure consistency and prevent typos.
abstract class AppRoutePaths {
// Security routes
static const String roomsSecurityFull = '/rooms/security';
static const String contactsVisibilitySegment = 'contactsVisibility';
static const String contactsVisibilityFull =
'$roomsSecurityFull/$contactsVisibilitySegment';
}
10 changes: 10 additions & 0 deletions lib/config/go_routes/go_router.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import 'dart:async';

import 'package:fluffychat/config/first_column_inner_routes.dart';
import 'package:fluffychat/config/go_routes/app_route_paths.dart';
import 'package:fluffychat/di/global/get_it_initializer.dart';
import 'package:fluffychat/pages/add_story/add_story.dart';
import 'package:fluffychat/pages/archive/archive.dart';
Expand All @@ -17,6 +18,7 @@ import 'package:fluffychat/pages/login/on_auth_redirect.dart';
import 'package:fluffychat/pages/new_group/new_group_chat_info.dart';
import 'package:fluffychat/pages/settings_dashboard/settings_app_language/settings_app_language.dart';
import 'package:fluffychat/pages/settings_dashboard/settings_blocked_users/settings_blocked_user.dart';
import 'package:fluffychat/pages/settings_dashboard/settings_contacts_visibility/settings_contacts_visibility.dart';
import 'package:fluffychat/pages/settings_dashboard/settings_profile/settings_profile.dart';
import 'package:fluffychat/pages/share/share.dart';
import 'package:fluffychat/pages/splash/splash.dart';
Expand Down Expand Up @@ -448,6 +450,14 @@ abstract class AppRoutes {
),
redirect: loggedOutRedirect,
),
GoRoute(
path: AppRoutePaths.contactsVisibilitySegment,
pageBuilder: (context, state) => defaultPageBuilder(
context,
const SettingsContactsVisibility(),
),
redirect: loggedOutRedirect,
),
],
),
GoRoute(
Expand Down
9 changes: 9 additions & 0 deletions lib/data/datasource/user_info/user_info_datasource.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
import 'package:fluffychat/domain/model/user_info/user_info.dart';
import 'package:fluffychat/domain/model/user_info/user_info_visibility.dart';
import 'package:fluffychat/domain/model/user_info/user_info_visibility_request.dart';

abstract class UserInfoDatasource {
Future<UserInfo> getUserInfo(String userId);

Future<UserInfoVisibility> getUserVisibility(String userId);

Future<UserInfoVisibility> updateUserInfoVisibility(
String userId,
UserInfoVisibilityRequest userInfoVisibility,
);
}
Loading