Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TF-3042 Public asset with create and edit identity #3067

Merged
14 changes: 14 additions & 0 deletions core/lib/utils/file_utils.dart
Original file line number Diff line number Diff line change
Expand Up @@ -121,4 +121,18 @@ class FileUtils {
final base64Data = base64Encode(Uint8List.view(buffer));
return base64Data;
}

Future<void> deleteCompressedFileOnMobile(String filePath, {required String pathContains}) async {
log('$runtimeType::deleteCompressedFileOnMobile: filePath: $filePath');
if (!PlatformInfo.isMobile) return;

try {
final File file = File(filePath);
if (await file.exists() && file.path.contains(pathContains)) {
await file.delete();
}
} catch (e) {
logError('$runtimeType::deleteCompressedFileOnMobile: error: $e');
}
}
}
36 changes: 36 additions & 0 deletions core/test/utils/file_utils_test.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import 'package:core/utils/file_utils.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:path_provider_platform_interface/path_provider_platform_interface.dart';
import 'package:plugin_platform_interface/plugin_platform_interface.dart';
Expand Down Expand Up @@ -38,6 +39,41 @@ void main() {

file.delete();
});

test(
'Should delete file '
'when deleteCompressedFileOnMobile is called '
'and file exists '
'and Platform is mobile',
() async {
// arrange
final file = await FileUtils().saveToFile(nameFile: fileName, content: fileContent);

// act
await FileUtils().deleteCompressedFileOnMobile(file.path, pathContains: fileName);

// assert
expect(await file.exists(), equals(false));
});

test(
'Should not delete file '
'when deleteCompressedFileOnMobile is called '
'and file exists '
'and Platform is not mobile',
() async {
// arrange
debugDefaultTargetPlatformOverride = TargetPlatform.macOS;
dab246 marked this conversation as resolved.
Show resolved Hide resolved
final file = await FileUtils().saveToFile(nameFile: fileName, content: fileContent);
expect(await file.exists(), equals(true));

// act
await FileUtils().deleteCompressedFileOnMobile(file.path, pathContains: fileName);

// assert
expect(await file.exists(), equals(true));
debugDefaultTargetPlatformOverride = null;
});
});
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import 'dart:async';
import 'dart:io';
import 'dart:math' as math;
import 'dart:typed_data';
Expand All @@ -6,6 +7,7 @@ import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:core/presentation/utils/keyboard_utils.dart';
import 'package:core/utils/app_logger.dart';
import 'package:core/utils/file_utils.dart';
import 'package:core/utils/platform_info.dart';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/cupertino.dart';
Expand Down Expand Up @@ -45,6 +47,11 @@ import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_id
import 'package:tmail_ui_user/features/manage_account/presentation/extensions/identity_extension.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/model/identity_action_type.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/utils/identity_utils.dart';
import 'package:tmail_ui_user/features/public_asset/domain/model/public_assets_in_identity_arguments.dart';
import 'package:tmail_ui_user/features/public_asset/presentation/model/public_asset_arguments.dart';
import 'package:tmail_ui_user/features/public_asset/presentation/public_asset_bindings.dart';
import 'package:tmail_ui_user/features/public_asset/presentation/public_asset_controller.dart';
import 'package:tmail_ui_user/main/bindings/network/binding_tag.dart';
import 'package:tmail_ui_user/main/error/capability_validator.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
Expand Down Expand Up @@ -83,6 +90,7 @@ class IdentityCreatorController extends BaseController {
Session? session;
Identity? identity;
IdentityCreatorArguments? arguments;
PublicAssetController? publicAssetController;

final GlobalKey htmlKey = GlobalKey();
final htmlEditorMinHeight = 150;
Expand Down Expand Up @@ -131,11 +139,19 @@ class IdentityCreatorController extends BaseController {
identity = arguments!.identity;
actionType.value = arguments!.actionType;
_checkDefaultIdentityIsSupported();
_checkPublicAssetCapability();
_setUpValueFromIdentity();
_getAllIdentities();
}
}

void _checkPublicAssetCapability() {
if (CapabilityIdentifier.jmapPublicAsset.isSupported(session!, accountId!)) {
PublicAssetBindings(PublicAssetArguments(session!, accountId!, identity: identity)).dependencies();
publicAssetController = Get.find<PublicAssetController>(tag: BindingTag.publicAssetBindingsTag);
}
}

@override
void onClose() {
log('IdentityCreatorController::onClose():');
Expand All @@ -152,6 +168,8 @@ class IdentityCreatorController extends BaseController {
richTextMobileTabletController?.onClose();
richTextMobileTabletController = null;
}
Get.delete<PublicAssetController>(tag: BindingTag.publicAssetBindingsTag);
publicAssetController = null;
super.onClose();
}

Expand Down Expand Up @@ -186,6 +204,7 @@ class IdentityCreatorController extends BaseController {
if (PlatformInfo.isWeb) {
richTextWebController?.editorController.setText(arguments?.identity?.signatureAsString ?? '');
}
publicAssetController?.getOldPublicAssetFromHtmlContent(arguments!.identity!.signatureAsString);
}
}

Expand Down Expand Up @@ -359,6 +378,12 @@ class IdentityCreatorController extends BaseController {
final sortOrder = isDefaultIdentitySupported.isTrue
? UnsignedInt(isDefaultIdentity.value ? 0 : 100)
: null;

final publicAssetsInIdentityArguments = PublicAssetsInIdentityArguments(
htmlSignature: signatureHtmlText ?? '',
preExistingPublicAssetIds: List.from(publicAssetController?.preExistingPublicAssetIds ?? []),
newlyPickedPublicAssetIds: List.from(publicAssetController?.newlyPickedPublicAssetIds ?? []),
);

final newIdentity = Identity(
name: _nameIdentity,
Expand All @@ -374,12 +399,14 @@ class IdentityCreatorController extends BaseController {
final identityRequest = CreateNewIdentityRequest(
generateCreateId,
newIdentity,
publicAssetsInIdentityArguments: publicAssetsInIdentityArguments,
isDefaultIdentity: isDefaultIdentity.value);
popBack(result: identityRequest);
} else {
final identityRequest = EditIdentityRequest(
identityId: identity!.id!,
identityRequest: newIdentity.toIdentityRequest(),
publicAssetsInIdentityArguments: publicAssetsInIdentityArguments,
isDefaultIdentity: isDefaultIdentity.value);
popBack(result: identityRequest);
}
Expand Down Expand Up @@ -452,6 +479,7 @@ class IdentityCreatorController extends BaseController {
void closeView(BuildContext context) {
isCompressingInlineImage.value = false;
clearFocusEditor(context);
publicAssetController?.discardChanges();
hoangdat marked this conversation as resolved.
Show resolved Hide resolved
popBack();
}

Expand Down Expand Up @@ -567,13 +595,17 @@ class IdentityCreatorController extends BaseController {
} else {
logError("IdentityCreatorController::_insertInlineImage: context is unmounted");
}
} else if (publicAssetController != null) {
publicAssetController!.uploadFileToBlob(file);
} else {
if (PlatformInfo.isWeb) {
richTextWebController?.insertImageAsBase64(platformFile: file, maxWidth: maxWidth);
} else if (PlatformInfo.isMobile) {
richTextMobileTabletController?.insertImageData(platformFile: file, maxWidth: maxWidth);
if (file.path != null) {
_deleteCompressedFileOnMobile(file.path!);
getBinding<FileUtils>()?.deleteCompressedFileOnMobile(
file.path!,
pathContains: IdentityCreatorConstants.prefixCompressedInlineImageTemp);
}
} else {
logError("IdentityCreatorController::_insertInlineImage: Platform not supported");
Expand Down Expand Up @@ -643,18 +675,6 @@ class IdentityCreatorController extends BaseController {
return compressedFilePath;
}

Future<void> _deleteCompressedFileOnMobile(String filePath) async {
log('IdentityCreatorController::_deleteCompressedFileOnMobile: filePath: $filePath');
try {
final File file = File(filePath);
if (await file.exists() && file.path.contains(IdentityCreatorConstants.prefixCompressedInlineImageTemp)) {
await file.delete();
}
} catch (e) {
logError('IdentityCreatorController::_deleteCompressedFileOnMobile: error: $e');
}
}

bool isMobile(BuildContext context) =>
responsiveUtils.isPortraitMobile(context) ||
responsiveUtils.isLandscapeMobile(context);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,12 @@ class CreateNewDefaultIdentityRequest extends CreateNewIdentityRequest {
super.creationId,
super.newIdentity,
{
this.oldDefaultIdentityIds
this.oldDefaultIdentityIds,
super.publicAssetsInIdentityArguments,
});

@override
List<Object?> get props => [
super.creationId,
super.newIdentity,
...super.props,
oldDefaultIdentityIds];
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,23 @@
import 'package:equatable/equatable.dart';
import 'package:jmap_dart_client/jmap/core/id.dart';
import 'package:jmap_dart_client/jmap/identities/identity.dart';
import 'package:tmail_ui_user/features/public_asset/domain/model/public_assets_in_identity_arguments.dart';

class CreateNewIdentityRequest with EquatableMixin {

final Identity newIdentity;
final Id creationId;
final bool isDefaultIdentity;
final PublicAssetsInIdentityArguments? publicAssetsInIdentityArguments;

CreateNewIdentityRequest(
this.creationId,
this.newIdentity,
{
this.isDefaultIdentity = false
this.isDefaultIdentity = false,
this.publicAssetsInIdentityArguments,
});

@override
List<Object?> get props => [creationId, newIdentity, isDefaultIdentity];
List<Object?> get props => [creationId, newIdentity, isDefaultIdentity, publicAssetsInIdentityArguments];
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,13 @@ class EditDefaultIdentityRequest extends EditIdentityRequest {
required super.identityId,
required super.identityRequest,
required super.isDefaultIdentity,
this.oldDefaultIdentityIds
this.oldDefaultIdentityIds,
super.publicAssetsInIdentityArguments
});

@override
List<Object?> get props => [
super.identityId,
super.identityRequest,
super.isDefaultIdentity,
...super.props,
oldDefaultIdentityIds
];
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,27 @@
import 'package:equatable/equatable.dart';
import 'package:jmap_dart_client/jmap/identities/identity.dart';
import 'package:model/model.dart';
import 'package:tmail_ui_user/features/public_asset/domain/model/public_assets_in_identity_arguments.dart';

class EditIdentityRequest with EquatableMixin {

final IdentityRequestDto identityRequest;
final IdentityId identityId;
final bool isDefaultIdentity;
final PublicAssetsInIdentityArguments? publicAssetsInIdentityArguments;

EditIdentityRequest({
required this.identityId,
required this.identityRequest,
this.isDefaultIdentity = false
this.isDefaultIdentity = false,
this.publicAssetsInIdentityArguments
});

@override
List<Object?> get props => [
identityId,
identityRequest,
isDefaultIdentity
isDefaultIdentity,
publicAssetsInIdentityArguments
];
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,20 @@
import 'package:core/core.dart';
import 'package:jmap_dart_client/jmap/identities/identity.dart';
import 'package:tmail_ui_user/features/public_asset/domain/model/public_assets_in_identity_arguments.dart';

class CreateNewDefaultIdentityLoading extends UIState {}

class CreateNewDefaultIdentitySuccess extends UIState {

final Identity newIdentity;
final PublicAssetsInIdentityArguments? publicAssetsInIdentityArguments;

CreateNewDefaultIdentitySuccess(this.newIdentity);
CreateNewDefaultIdentitySuccess(
this.newIdentity,
{this.publicAssetsInIdentityArguments});

@override
List<Object?> get props => [newIdentity];
List<Object?> get props => [newIdentity, publicAssetsInIdentityArguments];
}

class CreateNewDefaultIdentityFailure extends FeatureFailure {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,20 @@
import 'package:core/core.dart';
import 'package:jmap_dart_client/jmap/identities/identity.dart';
import 'package:tmail_ui_user/features/public_asset/domain/model/public_assets_in_identity_arguments.dart';

class CreateNewIdentityLoading extends UIState {}

class CreateNewIdentitySuccess extends UIState {

final Identity newIdentity;
final PublicAssetsInIdentityArguments? publicAssetsInIdentityArguments;

CreateNewIdentitySuccess(this.newIdentity);
CreateNewIdentitySuccess(
this.newIdentity,
{this.publicAssetsInIdentityArguments});

@override
List<Object?> get props => [newIdentity];
List<Object?> get props => [newIdentity, publicAssetsInIdentityArguments];
}

class CreateNewIdentityFailure extends FeatureFailure {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,11 @@ import 'package:tmail_ui_user/features/manage_account/domain/state/edit_identity

class EditDefaultIdentityLoading extends UIState {}

class EditDefaultIdentitySuccess extends EditIdentitySuccess {}
class EditDefaultIdentitySuccess extends EditIdentitySuccess {
EditDefaultIdentitySuccess(
super.identityId,
{super.publicAssetsInIdentityArguments});
}

class EditDefaultIdentityFailure extends FeatureFailure {

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,21 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:jmap_dart_client/jmap/identities/identity.dart';
import 'package:tmail_ui_user/features/public_asset/domain/model/public_assets_in_identity_arguments.dart';

class EditIdentityLoading extends UIState {}

class EditIdentitySuccess extends UIState {}
class EditIdentitySuccess extends UIState {
final IdentityId identityId;
final PublicAssetsInIdentityArguments? publicAssetsInIdentityArguments;

EditIdentitySuccess(
this.identityId,
{this.publicAssetsInIdentityArguments});

@override
List<Object?> get props => [identityId, publicAssetsInIdentityArguments];
}

class EditIdentityFailure extends FeatureFailure {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,9 @@ class CreateNewDefaultIdentityInteractor {
final defaultRequest = _createNewIdentityDefault(identityRequest, listDefaultIdentities);

final newIdentity = await _identityRepository.createNewIdentity(session, accountId, defaultRequest);
yield Right(CreateNewDefaultIdentitySuccess(newIdentity));
yield Right(CreateNewDefaultIdentitySuccess(
newIdentity,
publicAssetsInIdentityArguments: identityRequest.publicAssetsInIdentityArguments));
} catch (exception) {
yield Left(CreateNewDefaultIdentityFailure(exception));
}
Expand Down
Loading
Loading