mirror of
https://github.com/cypherstack/stack_wallet.git
synced 2024-12-22 19:39:22 +00:00
add contacts migration from hive to isar and remove contact class conversion
This commit is contained in:
parent
06020319fc
commit
52bffbac08
31 changed files with 1096 additions and 669 deletions
|
@ -41,7 +41,6 @@ class DB {
|
|||
String boxNameUsedSerialsCache({required Coin coin}) =>
|
||||
"${coin.name}_usedSerialsCache";
|
||||
|
||||
Box<dynamic>? _boxAddressBook;
|
||||
Box<String>? _boxDebugInfo;
|
||||
Box<NodeModel>? _boxNodeModels;
|
||||
Box<NodeModel>? _boxPrimaryNodes;
|
||||
|
@ -100,7 +99,6 @@ class DB {
|
|||
_boxPrefs = await Hive.openBox<dynamic>(boxNamePrefs);
|
||||
}
|
||||
|
||||
_boxAddressBook = await Hive.openBox<dynamic>(boxNameAddressBook);
|
||||
_boxDebugInfo = await Hive.openBox<String>(boxNameDebugInfo);
|
||||
|
||||
if (Hive.isBoxOpen(boxNameNodeModels)) {
|
||||
|
|
|
@ -3,6 +3,7 @@ import 'dart:convert';
|
|||
import 'package:stackwallet/models/contact_address_entry.dart';
|
||||
import 'package:uuid/uuid.dart';
|
||||
|
||||
@Deprecated("Use lib/models/isar/models/contact_entry.dart instead")
|
||||
class Contact {
|
||||
final String? emojiChar;
|
||||
final String name;
|
||||
|
|
|
@ -2,6 +2,7 @@ import 'dart:convert';
|
|||
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
||||
|
||||
@Deprecated("Use lib/models/isar/models/contact_entry.dart instead")
|
||||
class ContactAddressEntry {
|
||||
final Coin coin;
|
||||
final String address;
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:stackwallet/models/contact_address_entry.dart';
|
||||
import 'package:stackwallet/models/isar/models/contact_entry.dart';
|
||||
import 'package:stackwallet/utilities/address_utils.dart';
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
||||
|
||||
|
@ -57,7 +57,7 @@ class AddressEntryData extends ChangeNotifier {
|
|||
}
|
||||
|
||||
bool get isValidAddress {
|
||||
if ( coin == null) {
|
||||
if (coin == null) {
|
||||
return true;
|
||||
}
|
||||
if (_address == null) {
|
||||
|
@ -67,8 +67,11 @@ class AddressEntryData extends ChangeNotifier {
|
|||
}
|
||||
|
||||
ContactAddressEntry buildAddressEntry() {
|
||||
return ContactAddressEntry(
|
||||
coin: coin!, address: address!, label: addressLabel!);
|
||||
return ContactAddressEntry()
|
||||
..coinName = coin!.name
|
||||
..address = address!
|
||||
..other = null
|
||||
..label = addressLabel!;
|
||||
}
|
||||
|
||||
@override
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import 'package:isar/isar.dart';
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
||||
|
||||
part 'contact_entry.g.dart';
|
||||
|
||||
|
@ -16,9 +17,92 @@ class ContactEntry {
|
|||
|
||||
late final String? emojiChar;
|
||||
late final String name;
|
||||
late final List<String> addresses;
|
||||
late final List<ContactAddressEntry> addresses;
|
||||
late final bool isFavorite;
|
||||
|
||||
@Index(unique: true, replace: true)
|
||||
late final String customId;
|
||||
}
|
||||
|
||||
ContactEntry copyWith({
|
||||
bool shouldCopyEmojiWithNull = false,
|
||||
String? emojiChar,
|
||||
String? name,
|
||||
List<ContactAddressEntry>? addresses,
|
||||
bool? isFavorite,
|
||||
}) {
|
||||
List<ContactAddressEntry> _addresses = [];
|
||||
if (addresses == null) {
|
||||
for (var e in this.addresses) {
|
||||
_addresses.add(e.copyWith());
|
||||
}
|
||||
} else {
|
||||
for (var e in addresses) {
|
||||
_addresses.add(e.copyWith());
|
||||
}
|
||||
}
|
||||
String? newEmoji;
|
||||
if (shouldCopyEmojiWithNull) {
|
||||
newEmoji = emojiChar;
|
||||
} else {
|
||||
newEmoji = emojiChar ?? this.emojiChar;
|
||||
}
|
||||
|
||||
return ContactEntry(
|
||||
emojiChar: newEmoji,
|
||||
name: name ?? this.name,
|
||||
addresses: _addresses,
|
||||
isFavorite: isFavorite ?? this.isFavorite,
|
||||
customId: customId,
|
||||
);
|
||||
}
|
||||
|
||||
Map<String, dynamic> toMap() {
|
||||
return {
|
||||
"emoji": emojiChar,
|
||||
"name": name,
|
||||
"addresses": addresses.map((e) => e.toMap()).toList(),
|
||||
"id": customId,
|
||||
"isFavorite": isFavorite,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@embedded
|
||||
class ContactAddressEntry {
|
||||
late final String coinName;
|
||||
late final String address;
|
||||
late final String label;
|
||||
late final String? other;
|
||||
|
||||
@ignore
|
||||
Coin get coin => Coin.values.byName(coinName);
|
||||
|
||||
ContactAddressEntry();
|
||||
|
||||
ContactAddressEntry copyWith({
|
||||
Coin? coin,
|
||||
String? address,
|
||||
String? label,
|
||||
String? other,
|
||||
}) {
|
||||
return ContactAddressEntry()
|
||||
..coinName = coin?.name ?? coinName
|
||||
..address = address ?? this.address
|
||||
..label = label ?? this.label
|
||||
..other = other ?? this.other;
|
||||
}
|
||||
|
||||
Map<String, String> toMap() {
|
||||
return {
|
||||
"label": label,
|
||||
"address": address,
|
||||
"coin": coin.name,
|
||||
"other": other ?? "",
|
||||
};
|
||||
}
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return "AddressBookEntry: ${toMap()}";
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,7 +20,8 @@ const ContactEntrySchema = CollectionSchema(
|
|||
r'addresses': PropertySchema(
|
||||
id: 0,
|
||||
name: r'addresses',
|
||||
type: IsarType.stringList,
|
||||
type: IsarType.objectList,
|
||||
target: r'ContactAddressEntry',
|
||||
),
|
||||
r'customId': PropertySchema(
|
||||
id: 1,
|
||||
|
@ -64,7 +65,7 @@ const ContactEntrySchema = CollectionSchema(
|
|||
)
|
||||
},
|
||||
links: {},
|
||||
embeddedSchemas: {},
|
||||
embeddedSchemas: {r'ContactAddressEntry': ContactAddressEntrySchema},
|
||||
getId: _contactEntryGetId,
|
||||
getLinks: _contactEntryGetLinks,
|
||||
attach: _contactEntryAttach,
|
||||
|
@ -79,9 +80,11 @@ int _contactEntryEstimateSize(
|
|||
var bytesCount = offsets.last;
|
||||
bytesCount += 3 + object.addresses.length * 3;
|
||||
{
|
||||
final offsets = allOffsets[ContactAddressEntry]!;
|
||||
for (var i = 0; i < object.addresses.length; i++) {
|
||||
final value = object.addresses[i];
|
||||
bytesCount += value.length * 3;
|
||||
bytesCount +=
|
||||
ContactAddressEntrySchema.estimateSize(value, offsets, allOffsets);
|
||||
}
|
||||
}
|
||||
bytesCount += 3 + object.customId.length * 3;
|
||||
|
@ -101,7 +104,12 @@ void _contactEntrySerialize(
|
|||
List<int> offsets,
|
||||
Map<Type, List<int>> allOffsets,
|
||||
) {
|
||||
writer.writeStringList(offsets[0], object.addresses);
|
||||
writer.writeObjectList<ContactAddressEntry>(
|
||||
offsets[0],
|
||||
allOffsets,
|
||||
ContactAddressEntrySchema.serialize,
|
||||
object.addresses,
|
||||
);
|
||||
writer.writeString(offsets[1], object.customId);
|
||||
writer.writeString(offsets[2], object.emojiChar);
|
||||
writer.writeBool(offsets[3], object.isFavorite);
|
||||
|
@ -115,7 +123,13 @@ ContactEntry _contactEntryDeserialize(
|
|||
Map<Type, List<int>> allOffsets,
|
||||
) {
|
||||
final object = ContactEntry(
|
||||
addresses: reader.readStringList(offsets[0]) ?? [],
|
||||
addresses: reader.readObjectList<ContactAddressEntry>(
|
||||
offsets[0],
|
||||
ContactAddressEntrySchema.deserialize,
|
||||
allOffsets,
|
||||
ContactAddressEntry(),
|
||||
) ??
|
||||
[],
|
||||
customId: reader.readString(offsets[1]),
|
||||
emojiChar: reader.readStringOrNull(offsets[2]),
|
||||
isFavorite: reader.readBool(offsets[3]),
|
||||
|
@ -133,7 +147,13 @@ P _contactEntryDeserializeProp<P>(
|
|||
) {
|
||||
switch (propertyId) {
|
||||
case 0:
|
||||
return (reader.readStringList(offset) ?? []) as P;
|
||||
return (reader.readObjectList<ContactAddressEntry>(
|
||||
offset,
|
||||
ContactAddressEntrySchema.deserialize,
|
||||
allOffsets,
|
||||
ContactAddressEntry(),
|
||||
) ??
|
||||
[]) as P;
|
||||
case 1:
|
||||
return (reader.readString(offset)) as P;
|
||||
case 2:
|
||||
|
@ -341,142 +361,6 @@ extension ContactEntryQueryWhere
|
|||
|
||||
extension ContactEntryQueryFilter
|
||||
on QueryBuilder<ContactEntry, ContactEntry, QFilterCondition> {
|
||||
QueryBuilder<ContactEntry, ContactEntry, QAfterFilterCondition>
|
||||
addressesElementEqualTo(
|
||||
String value, {
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.equalTo(
|
||||
property: r'addresses',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactEntry, ContactEntry, QAfterFilterCondition>
|
||||
addressesElementGreaterThan(
|
||||
String value, {
|
||||
bool include = false,
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.greaterThan(
|
||||
include: include,
|
||||
property: r'addresses',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactEntry, ContactEntry, QAfterFilterCondition>
|
||||
addressesElementLessThan(
|
||||
String value, {
|
||||
bool include = false,
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.lessThan(
|
||||
include: include,
|
||||
property: r'addresses',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactEntry, ContactEntry, QAfterFilterCondition>
|
||||
addressesElementBetween(
|
||||
String lower,
|
||||
String upper, {
|
||||
bool includeLower = true,
|
||||
bool includeUpper = true,
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.between(
|
||||
property: r'addresses',
|
||||
lower: lower,
|
||||
includeLower: includeLower,
|
||||
upper: upper,
|
||||
includeUpper: includeUpper,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactEntry, ContactEntry, QAfterFilterCondition>
|
||||
addressesElementStartsWith(
|
||||
String value, {
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.startsWith(
|
||||
property: r'addresses',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactEntry, ContactEntry, QAfterFilterCondition>
|
||||
addressesElementEndsWith(
|
||||
String value, {
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.endsWith(
|
||||
property: r'addresses',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactEntry, ContactEntry, QAfterFilterCondition>
|
||||
addressesElementContains(String value, {bool caseSensitive = true}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.contains(
|
||||
property: r'addresses',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactEntry, ContactEntry, QAfterFilterCondition>
|
||||
addressesElementMatches(String pattern, {bool caseSensitive = true}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.matches(
|
||||
property: r'addresses',
|
||||
wildcard: pattern,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactEntry, ContactEntry, QAfterFilterCondition>
|
||||
addressesElementIsEmpty() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.equalTo(
|
||||
property: r'addresses',
|
||||
value: '',
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactEntry, ContactEntry, QAfterFilterCondition>
|
||||
addressesElementIsNotEmpty() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.greaterThan(
|
||||
property: r'addresses',
|
||||
value: '',
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactEntry, ContactEntry, QAfterFilterCondition>
|
||||
addressesLengthEqualTo(int length) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
|
@ -1055,7 +939,14 @@ extension ContactEntryQueryFilter
|
|||
}
|
||||
|
||||
extension ContactEntryQueryObject
|
||||
on QueryBuilder<ContactEntry, ContactEntry, QFilterCondition> {}
|
||||
on QueryBuilder<ContactEntry, ContactEntry, QFilterCondition> {
|
||||
QueryBuilder<ContactEntry, ContactEntry, QAfterFilterCondition>
|
||||
addressesElement(FilterQuery<ContactAddressEntry> q) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.object(q, r'addresses');
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
extension ContactEntryQueryLinks
|
||||
on QueryBuilder<ContactEntry, ContactEntry, QFilterCondition> {}
|
||||
|
@ -1178,12 +1069,6 @@ extension ContactEntryQuerySortThenBy
|
|||
|
||||
extension ContactEntryQueryWhereDistinct
|
||||
on QueryBuilder<ContactEntry, ContactEntry, QDistinct> {
|
||||
QueryBuilder<ContactEntry, ContactEntry, QDistinct> distinctByAddresses() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addDistinctBy(r'addresses');
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactEntry, ContactEntry, QDistinct> distinctByCustomId(
|
||||
{bool caseSensitive = true}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
|
@ -1220,7 +1105,7 @@ extension ContactEntryQueryProperty
|
|||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactEntry, List<String>, QQueryOperations>
|
||||
QueryBuilder<ContactEntry, List<ContactAddressEntry>, QQueryOperations>
|
||||
addressesProperty() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addPropertyName(r'addresses');
|
||||
|
@ -1251,3 +1136,673 @@ extension ContactEntryQueryProperty
|
|||
});
|
||||
}
|
||||
}
|
||||
|
||||
// **************************************************************************
|
||||
// IsarEmbeddedGenerator
|
||||
// **************************************************************************
|
||||
|
||||
// coverage:ignore-file
|
||||
// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters
|
||||
|
||||
const ContactAddressEntrySchema = Schema(
|
||||
name: r'ContactAddressEntry',
|
||||
id: 2556413586404997281,
|
||||
properties: {
|
||||
r'address': PropertySchema(
|
||||
id: 0,
|
||||
name: r'address',
|
||||
type: IsarType.string,
|
||||
),
|
||||
r'coinName': PropertySchema(
|
||||
id: 1,
|
||||
name: r'coinName',
|
||||
type: IsarType.string,
|
||||
),
|
||||
r'label': PropertySchema(
|
||||
id: 2,
|
||||
name: r'label',
|
||||
type: IsarType.string,
|
||||
),
|
||||
r'other': PropertySchema(
|
||||
id: 3,
|
||||
name: r'other',
|
||||
type: IsarType.string,
|
||||
)
|
||||
},
|
||||
estimateSize: _contactAddressEntryEstimateSize,
|
||||
serialize: _contactAddressEntrySerialize,
|
||||
deserialize: _contactAddressEntryDeserialize,
|
||||
deserializeProp: _contactAddressEntryDeserializeProp,
|
||||
);
|
||||
|
||||
int _contactAddressEntryEstimateSize(
|
||||
ContactAddressEntry object,
|
||||
List<int> offsets,
|
||||
Map<Type, List<int>> allOffsets,
|
||||
) {
|
||||
var bytesCount = offsets.last;
|
||||
bytesCount += 3 + object.address.length * 3;
|
||||
bytesCount += 3 + object.coinName.length * 3;
|
||||
bytesCount += 3 + object.label.length * 3;
|
||||
{
|
||||
final value = object.other;
|
||||
if (value != null) {
|
||||
bytesCount += 3 + value.length * 3;
|
||||
}
|
||||
}
|
||||
return bytesCount;
|
||||
}
|
||||
|
||||
void _contactAddressEntrySerialize(
|
||||
ContactAddressEntry object,
|
||||
IsarWriter writer,
|
||||
List<int> offsets,
|
||||
Map<Type, List<int>> allOffsets,
|
||||
) {
|
||||
writer.writeString(offsets[0], object.address);
|
||||
writer.writeString(offsets[1], object.coinName);
|
||||
writer.writeString(offsets[2], object.label);
|
||||
writer.writeString(offsets[3], object.other);
|
||||
}
|
||||
|
||||
ContactAddressEntry _contactAddressEntryDeserialize(
|
||||
Id id,
|
||||
IsarReader reader,
|
||||
List<int> offsets,
|
||||
Map<Type, List<int>> allOffsets,
|
||||
) {
|
||||
final object = ContactAddressEntry();
|
||||
object.address = reader.readString(offsets[0]);
|
||||
object.coinName = reader.readString(offsets[1]);
|
||||
object.label = reader.readString(offsets[2]);
|
||||
object.other = reader.readStringOrNull(offsets[3]);
|
||||
return object;
|
||||
}
|
||||
|
||||
P _contactAddressEntryDeserializeProp<P>(
|
||||
IsarReader reader,
|
||||
int propertyId,
|
||||
int offset,
|
||||
Map<Type, List<int>> allOffsets,
|
||||
) {
|
||||
switch (propertyId) {
|
||||
case 0:
|
||||
return (reader.readString(offset)) as P;
|
||||
case 1:
|
||||
return (reader.readString(offset)) as P;
|
||||
case 2:
|
||||
return (reader.readString(offset)) as P;
|
||||
case 3:
|
||||
return (reader.readStringOrNull(offset)) as P;
|
||||
default:
|
||||
throw IsarError('Unknown property with id $propertyId');
|
||||
}
|
||||
}
|
||||
|
||||
extension ContactAddressEntryQueryFilter on QueryBuilder<ContactAddressEntry,
|
||||
ContactAddressEntry, QFilterCondition> {
|
||||
QueryBuilder<ContactAddressEntry, ContactAddressEntry, QAfterFilterCondition>
|
||||
addressEqualTo(
|
||||
String value, {
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.equalTo(
|
||||
property: r'address',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactAddressEntry, ContactAddressEntry, QAfterFilterCondition>
|
||||
addressGreaterThan(
|
||||
String value, {
|
||||
bool include = false,
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.greaterThan(
|
||||
include: include,
|
||||
property: r'address',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactAddressEntry, ContactAddressEntry, QAfterFilterCondition>
|
||||
addressLessThan(
|
||||
String value, {
|
||||
bool include = false,
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.lessThan(
|
||||
include: include,
|
||||
property: r'address',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactAddressEntry, ContactAddressEntry, QAfterFilterCondition>
|
||||
addressBetween(
|
||||
String lower,
|
||||
String upper, {
|
||||
bool includeLower = true,
|
||||
bool includeUpper = true,
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.between(
|
||||
property: r'address',
|
||||
lower: lower,
|
||||
includeLower: includeLower,
|
||||
upper: upper,
|
||||
includeUpper: includeUpper,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactAddressEntry, ContactAddressEntry, QAfterFilterCondition>
|
||||
addressStartsWith(
|
||||
String value, {
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.startsWith(
|
||||
property: r'address',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactAddressEntry, ContactAddressEntry, QAfterFilterCondition>
|
||||
addressEndsWith(
|
||||
String value, {
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.endsWith(
|
||||
property: r'address',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactAddressEntry, ContactAddressEntry, QAfterFilterCondition>
|
||||
addressContains(String value, {bool caseSensitive = true}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.contains(
|
||||
property: r'address',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactAddressEntry, ContactAddressEntry, QAfterFilterCondition>
|
||||
addressMatches(String pattern, {bool caseSensitive = true}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.matches(
|
||||
property: r'address',
|
||||
wildcard: pattern,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactAddressEntry, ContactAddressEntry, QAfterFilterCondition>
|
||||
addressIsEmpty() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.equalTo(
|
||||
property: r'address',
|
||||
value: '',
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactAddressEntry, ContactAddressEntry, QAfterFilterCondition>
|
||||
addressIsNotEmpty() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.greaterThan(
|
||||
property: r'address',
|
||||
value: '',
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactAddressEntry, ContactAddressEntry, QAfterFilterCondition>
|
||||
coinNameEqualTo(
|
||||
String value, {
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.equalTo(
|
||||
property: r'coinName',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactAddressEntry, ContactAddressEntry, QAfterFilterCondition>
|
||||
coinNameGreaterThan(
|
||||
String value, {
|
||||
bool include = false,
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.greaterThan(
|
||||
include: include,
|
||||
property: r'coinName',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactAddressEntry, ContactAddressEntry, QAfterFilterCondition>
|
||||
coinNameLessThan(
|
||||
String value, {
|
||||
bool include = false,
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.lessThan(
|
||||
include: include,
|
||||
property: r'coinName',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactAddressEntry, ContactAddressEntry, QAfterFilterCondition>
|
||||
coinNameBetween(
|
||||
String lower,
|
||||
String upper, {
|
||||
bool includeLower = true,
|
||||
bool includeUpper = true,
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.between(
|
||||
property: r'coinName',
|
||||
lower: lower,
|
||||
includeLower: includeLower,
|
||||
upper: upper,
|
||||
includeUpper: includeUpper,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactAddressEntry, ContactAddressEntry, QAfterFilterCondition>
|
||||
coinNameStartsWith(
|
||||
String value, {
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.startsWith(
|
||||
property: r'coinName',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactAddressEntry, ContactAddressEntry, QAfterFilterCondition>
|
||||
coinNameEndsWith(
|
||||
String value, {
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.endsWith(
|
||||
property: r'coinName',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactAddressEntry, ContactAddressEntry, QAfterFilterCondition>
|
||||
coinNameContains(String value, {bool caseSensitive = true}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.contains(
|
||||
property: r'coinName',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactAddressEntry, ContactAddressEntry, QAfterFilterCondition>
|
||||
coinNameMatches(String pattern, {bool caseSensitive = true}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.matches(
|
||||
property: r'coinName',
|
||||
wildcard: pattern,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactAddressEntry, ContactAddressEntry, QAfterFilterCondition>
|
||||
coinNameIsEmpty() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.equalTo(
|
||||
property: r'coinName',
|
||||
value: '',
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactAddressEntry, ContactAddressEntry, QAfterFilterCondition>
|
||||
coinNameIsNotEmpty() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.greaterThan(
|
||||
property: r'coinName',
|
||||
value: '',
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactAddressEntry, ContactAddressEntry, QAfterFilterCondition>
|
||||
labelEqualTo(
|
||||
String value, {
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.equalTo(
|
||||
property: r'label',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactAddressEntry, ContactAddressEntry, QAfterFilterCondition>
|
||||
labelGreaterThan(
|
||||
String value, {
|
||||
bool include = false,
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.greaterThan(
|
||||
include: include,
|
||||
property: r'label',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactAddressEntry, ContactAddressEntry, QAfterFilterCondition>
|
||||
labelLessThan(
|
||||
String value, {
|
||||
bool include = false,
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.lessThan(
|
||||
include: include,
|
||||
property: r'label',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactAddressEntry, ContactAddressEntry, QAfterFilterCondition>
|
||||
labelBetween(
|
||||
String lower,
|
||||
String upper, {
|
||||
bool includeLower = true,
|
||||
bool includeUpper = true,
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.between(
|
||||
property: r'label',
|
||||
lower: lower,
|
||||
includeLower: includeLower,
|
||||
upper: upper,
|
||||
includeUpper: includeUpper,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactAddressEntry, ContactAddressEntry, QAfterFilterCondition>
|
||||
labelStartsWith(
|
||||
String value, {
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.startsWith(
|
||||
property: r'label',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactAddressEntry, ContactAddressEntry, QAfterFilterCondition>
|
||||
labelEndsWith(
|
||||
String value, {
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.endsWith(
|
||||
property: r'label',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactAddressEntry, ContactAddressEntry, QAfterFilterCondition>
|
||||
labelContains(String value, {bool caseSensitive = true}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.contains(
|
||||
property: r'label',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactAddressEntry, ContactAddressEntry, QAfterFilterCondition>
|
||||
labelMatches(String pattern, {bool caseSensitive = true}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.matches(
|
||||
property: r'label',
|
||||
wildcard: pattern,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactAddressEntry, ContactAddressEntry, QAfterFilterCondition>
|
||||
labelIsEmpty() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.equalTo(
|
||||
property: r'label',
|
||||
value: '',
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactAddressEntry, ContactAddressEntry, QAfterFilterCondition>
|
||||
labelIsNotEmpty() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.greaterThan(
|
||||
property: r'label',
|
||||
value: '',
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactAddressEntry, ContactAddressEntry, QAfterFilterCondition>
|
||||
otherIsNull() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(const FilterCondition.isNull(
|
||||
property: r'other',
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactAddressEntry, ContactAddressEntry, QAfterFilterCondition>
|
||||
otherIsNotNull() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(const FilterCondition.isNotNull(
|
||||
property: r'other',
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactAddressEntry, ContactAddressEntry, QAfterFilterCondition>
|
||||
otherEqualTo(
|
||||
String? value, {
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.equalTo(
|
||||
property: r'other',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactAddressEntry, ContactAddressEntry, QAfterFilterCondition>
|
||||
otherGreaterThan(
|
||||
String? value, {
|
||||
bool include = false,
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.greaterThan(
|
||||
include: include,
|
||||
property: r'other',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactAddressEntry, ContactAddressEntry, QAfterFilterCondition>
|
||||
otherLessThan(
|
||||
String? value, {
|
||||
bool include = false,
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.lessThan(
|
||||
include: include,
|
||||
property: r'other',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactAddressEntry, ContactAddressEntry, QAfterFilterCondition>
|
||||
otherBetween(
|
||||
String? lower,
|
||||
String? upper, {
|
||||
bool includeLower = true,
|
||||
bool includeUpper = true,
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.between(
|
||||
property: r'other',
|
||||
lower: lower,
|
||||
includeLower: includeLower,
|
||||
upper: upper,
|
||||
includeUpper: includeUpper,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactAddressEntry, ContactAddressEntry, QAfterFilterCondition>
|
||||
otherStartsWith(
|
||||
String value, {
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.startsWith(
|
||||
property: r'other',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactAddressEntry, ContactAddressEntry, QAfterFilterCondition>
|
||||
otherEndsWith(
|
||||
String value, {
|
||||
bool caseSensitive = true,
|
||||
}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.endsWith(
|
||||
property: r'other',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactAddressEntry, ContactAddressEntry, QAfterFilterCondition>
|
||||
otherContains(String value, {bool caseSensitive = true}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.contains(
|
||||
property: r'other',
|
||||
value: value,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactAddressEntry, ContactAddressEntry, QAfterFilterCondition>
|
||||
otherMatches(String pattern, {bool caseSensitive = true}) {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.matches(
|
||||
property: r'other',
|
||||
wildcard: pattern,
|
||||
caseSensitive: caseSensitive,
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactAddressEntry, ContactAddressEntry, QAfterFilterCondition>
|
||||
otherIsEmpty() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.equalTo(
|
||||
property: r'other',
|
||||
value: '',
|
||||
));
|
||||
});
|
||||
}
|
||||
|
||||
QueryBuilder<ContactAddressEntry, ContactAddressEntry, QAfterFilterCondition>
|
||||
otherIsNotEmpty() {
|
||||
return QueryBuilder.apply(this, (query) {
|
||||
return query.addFilterCondition(FilterCondition.greaterThan(
|
||||
property: r'other',
|
||||
value: '',
|
||||
));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
extension ContactAddressEntryQueryObject on QueryBuilder<ContactAddressEntry,
|
||||
ContactAddressEntry, QFilterCondition> {}
|
||||
|
|
|
@ -1,8 +1,7 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
import 'package:stackwallet/models/contact.dart';
|
||||
import 'package:stackwallet/models/contact_address_entry.dart';
|
||||
import 'package:stackwallet/models/isar/models/contact_entry.dart';
|
||||
import 'package:stackwallet/pages/address_book_views/subviews/add_address_book_entry_view.dart';
|
||||
import 'package:stackwallet/pages/address_book_views/subviews/address_book_filter_view.dart';
|
||||
import 'package:stackwallet/providers/global/address_book_service_provider.dart';
|
||||
|
@ -73,19 +72,18 @@ class _AddressBookViewState extends ConsumerState<AddressBookView> {
|
|||
final managers = ref.read(walletsChangeNotifierProvider).managers;
|
||||
for (final manager in managers) {
|
||||
addresses.add(
|
||||
ContactAddressEntry(
|
||||
coin: manager.coin,
|
||||
address: await manager.currentReceivingAddress,
|
||||
label: "Current Receiving",
|
||||
other: manager.walletName,
|
||||
),
|
||||
ContactAddressEntry()
|
||||
..coinName = manager.coin.name
|
||||
..address = await manager.currentReceivingAddress
|
||||
..label = "Current Receiving"
|
||||
..other = manager.walletName,
|
||||
);
|
||||
}
|
||||
final self = Contact(
|
||||
final self = ContactEntry(
|
||||
name: "My Stack",
|
||||
addresses: addresses,
|
||||
isFavorite: true,
|
||||
id: "default",
|
||||
customId: "default",
|
||||
);
|
||||
await ref.read(addressBookServiceProvider).editContact(self);
|
||||
});
|
||||
|
@ -102,7 +100,8 @@ class _AddressBookViewState extends ConsumerState<AddressBookView> {
|
|||
@override
|
||||
Widget build(BuildContext context) {
|
||||
debugPrint("BUILD: $runtimeType");
|
||||
final contacts = ref.watch(addressBookServiceProvider.select((value) => value.contacts));
|
||||
final contacts =
|
||||
ref.watch(addressBookServiceProvider.select((value) => value.contacts));
|
||||
|
||||
final isDesktop = Util.isDesktop;
|
||||
return ConditionalParent(
|
||||
|
@ -305,8 +304,8 @@ class _AddressBookViewState extends ConsumerState<AddressBookView> {
|
|||
.where((element) => element.isFavorite)
|
||||
.map(
|
||||
(e) => AddressBookCard(
|
||||
key: Key("favContactCard_${e.id}_key"),
|
||||
contactId: e.id,
|
||||
key: Key("favContactCard_${e.customId}_key"),
|
||||
contactId: e.customId,
|
||||
),
|
||||
),
|
||||
],
|
||||
|
@ -351,8 +350,9 @@ class _AddressBookViewState extends ConsumerState<AddressBookView> {
|
|||
.matches(widget.filterTerm ?? _searchTerm, e))
|
||||
.map(
|
||||
(e) => AddressBookCard(
|
||||
key: Key("desktopContactCard_${e.id}_key"),
|
||||
contactId: e.id,
|
||||
key:
|
||||
Key("desktopContactCard_${e.customId}_key"),
|
||||
contactId: e.customId,
|
||||
),
|
||||
),
|
||||
],
|
||||
|
|
|
@ -2,8 +2,7 @@ import 'package:emojis/emoji.dart';
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:stackwallet/models/contact.dart';
|
||||
import 'package:stackwallet/models/contact_address_entry.dart';
|
||||
import 'package:stackwallet/models/isar/models/contact_entry.dart';
|
||||
import 'package:stackwallet/pages/address_book_views/subviews/new_contact_address_entry_form.dart';
|
||||
import 'package:stackwallet/providers/global/address_book_service_provider.dart';
|
||||
import 'package:stackwallet/providers/ui/address_book_providers/address_entry_data_provider.dart';
|
||||
|
@ -28,6 +27,7 @@ import 'package:stackwallet/widgets/emoji_select_sheet.dart';
|
|||
import 'package:stackwallet/widgets/icon_widgets/x_icon.dart';
|
||||
import 'package:stackwallet/widgets/stack_text_field.dart';
|
||||
import 'package:stackwallet/widgets/textfield_icon_button.dart';
|
||||
import 'package:uuid/uuid.dart';
|
||||
|
||||
class AddAddressBookEntryView extends ConsumerStatefulWidget {
|
||||
const AddAddressBookEntryView({
|
||||
|
@ -688,11 +688,12 @@ class _AddAddressBookEntryViewState
|
|||
forms[i].id))
|
||||
.buildAddressEntry());
|
||||
}
|
||||
Contact contact = Contact(
|
||||
ContactEntry contact = ContactEntry(
|
||||
emojiChar: _selectedEmoji?.char,
|
||||
name: nameController.text,
|
||||
addresses: entries,
|
||||
isFavorite: _isFavorite,
|
||||
customId: const Uuid().v1(),
|
||||
);
|
||||
|
||||
if (await ref
|
||||
|
|
|
@ -1,8 +1,7 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
import 'package:stackwallet/models/contact.dart';
|
||||
import 'package:stackwallet/models/contact_address_entry.dart';
|
||||
import 'package:stackwallet/models/isar/models/contact_entry.dart';
|
||||
import 'package:stackwallet/pages/address_book_views/subviews/new_contact_address_entry_form.dart';
|
||||
import 'package:stackwallet/providers/global/address_book_service_provider.dart';
|
||||
import 'package:stackwallet/providers/ui/address_book_providers/address_entry_data_provider.dart';
|
||||
|
@ -208,7 +207,7 @@ class _AddNewContactAddressViewState
|
|||
.read(addressEntryDataProvider(0))
|
||||
.buildAddressEntry());
|
||||
|
||||
Contact editedContact =
|
||||
ContactEntry editedContact =
|
||||
contact.copyWith(addresses: entries);
|
||||
|
||||
if (await ref
|
||||
|
|
|
@ -13,8 +13,8 @@ import 'package:stackwallet/providers/global/address_book_service_provider.dart'
|
|||
import 'package:stackwallet/providers/providers.dart';
|
||||
import 'package:stackwallet/providers/ui/address_book_providers/address_entry_data_provider.dart';
|
||||
import 'package:stackwallet/services/coins/manager.dart';
|
||||
import 'package:stackwallet/themes/stack_colors.dart';
|
||||
import 'package:stackwallet/themes/coin_icon_provider.dart';
|
||||
import 'package:stackwallet/themes/stack_colors.dart';
|
||||
import 'package:stackwallet/utilities/assets.dart';
|
||||
import 'package:stackwallet/utilities/clipboard_interface.dart';
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
||||
|
@ -197,7 +197,7 @@ class _ContactDetailsViewState extends ConsumerState<ContactDetailsView> {
|
|||
onPressed: () {
|
||||
ref
|
||||
.read(addressBookServiceProvider)
|
||||
.removeContact(_contact.id);
|
||||
.removeContact(_contact.customId);
|
||||
Navigator.of(context).pop();
|
||||
Navigator.of(context).pop();
|
||||
showFloatingFlushBar(
|
||||
|
|
|
@ -1,8 +1,7 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
import 'package:stackwallet/models/contact.dart';
|
||||
import 'package:stackwallet/models/contact_address_entry.dart';
|
||||
import 'package:stackwallet/models/isar/models/contact_entry.dart';
|
||||
import 'package:stackwallet/pages/address_book_views/subviews/new_contact_address_entry_form.dart';
|
||||
import 'package:stackwallet/providers/global/address_book_service_provider.dart';
|
||||
import 'package:stackwallet/providers/ui/address_book_providers/address_entry_data_provider.dart';
|
||||
|
@ -49,7 +48,7 @@ class _EditContactAddressViewState
|
|||
late final BarcodeScannerInterface barcodeScanner;
|
||||
late final ClipboardInterface clipboard;
|
||||
|
||||
Future<void> save(Contact contact) async {
|
||||
Future<void> save(ContactEntry contact) async {
|
||||
if (FocusScope.of(context).hasFocus) {
|
||||
FocusScope.of(context).unfocus();
|
||||
await Future<void>.delayed(
|
||||
|
@ -73,7 +72,7 @@ class _EditContactAddressViewState
|
|||
|
||||
entries.insert(index, editedEntry);
|
||||
|
||||
Contact editedContact = contact.copyWith(addresses: entries);
|
||||
ContactEntry editedContact = contact.copyWith(addresses: entries);
|
||||
|
||||
if (await ref.read(addressBookServiceProvider).editContact(editedContact)) {
|
||||
if (mounted) {
|
||||
|
@ -226,7 +225,8 @@ class _EditContactAddressViewState
|
|||
);
|
||||
|
||||
_addresses.remove(entry);
|
||||
Contact editedContact = contact.copyWith(addresses: _addresses);
|
||||
ContactEntry editedContact =
|
||||
contact.copyWith(addresses: _addresses);
|
||||
if (await ref
|
||||
.read(addressBookServiceProvider)
|
||||
.editContact(editedContact)) {
|
||||
|
|
|
@ -5,10 +5,9 @@ import 'dart:typed_data';
|
|||
|
||||
import 'package:stack_wallet_backup/stack_wallet_backup.dart';
|
||||
import 'package:stackwallet/db/hive/db.dart';
|
||||
import 'package:stackwallet/models/contact.dart';
|
||||
import 'package:stackwallet/models/contact_address_entry.dart';
|
||||
import 'package:stackwallet/models/exchange/change_now/exchange_transaction.dart';
|
||||
import 'package:stackwallet/models/exchange/response_objects/trade.dart';
|
||||
import 'package:stackwallet/models/isar/models/contact_entry.dart';
|
||||
import 'package:stackwallet/models/node_model.dart';
|
||||
import 'package:stackwallet/models/stack_restoring_ui_state.dart';
|
||||
import 'package:stackwallet/models/trade_wallet_lookup.dart';
|
||||
|
@ -266,7 +265,7 @@ abstract class SWB {
|
|||
);
|
||||
|
||||
AddressBookService addressBookService = AddressBookService();
|
||||
var addresses = await addressBookService.addressBookEntries;
|
||||
var addresses = addressBookService.contacts;
|
||||
backupJson['addressBookEntries'] =
|
||||
addresses.map((e) => e.toMap()).toList();
|
||||
|
||||
|
@ -799,7 +798,7 @@ abstract class SWB {
|
|||
|
||||
// contacts
|
||||
final addressBookService = AddressBookService();
|
||||
final allContactIds = addressBookService.contacts.map((e) => e.id);
|
||||
final allContactIds = addressBookService.contacts.map((e) => e.customId);
|
||||
|
||||
if (addressBookEntries == null) {
|
||||
// if no contacts were present before attempted restore then delete any that
|
||||
|
@ -823,21 +822,20 @@ abstract class SWB {
|
|||
List<ContactAddressEntry> addresses = [];
|
||||
for (var address in (contact['addresses'] as List<dynamic>)) {
|
||||
addresses.add(
|
||||
ContactAddressEntry(
|
||||
coin: Coin.values
|
||||
.firstWhere((element) => element.name == address['coin']),
|
||||
address: address['address'] as String,
|
||||
label: address['label'] as String,
|
||||
),
|
||||
ContactAddressEntry()
|
||||
..coinName = address['coin'] as String
|
||||
..address = address['address'] as String
|
||||
..label = address['label'] as String
|
||||
..other = address['other'] as String?,
|
||||
);
|
||||
}
|
||||
await addressBookService.editContact(
|
||||
Contact(
|
||||
ContactEntry(
|
||||
emojiChar: contact['emoji'] as String?,
|
||||
name: contact['name'] as String,
|
||||
addresses: addresses,
|
||||
isFavorite: contact['isFavorite'] as bool,
|
||||
id: contact['id'] as String,
|
||||
customId: contact['id'] as String,
|
||||
),
|
||||
);
|
||||
} else {
|
||||
|
@ -1026,21 +1024,20 @@ abstract class SWB {
|
|||
List<ContactAddressEntry> addresses = [];
|
||||
for (var address in (contact['addresses'] as List<dynamic>)) {
|
||||
addresses.add(
|
||||
ContactAddressEntry(
|
||||
coin: Coin.values
|
||||
.firstWhere((element) => element.name == address['coin']),
|
||||
address: address['address'] as String,
|
||||
label: address['label'] as String,
|
||||
),
|
||||
ContactAddressEntry()
|
||||
..coinName = address['coin'] as String
|
||||
..address = address['address'] as String
|
||||
..label = address['label'] as String
|
||||
..other = address['other'] as String?,
|
||||
);
|
||||
}
|
||||
await addressBookService.addContact(
|
||||
Contact(
|
||||
ContactEntry(
|
||||
emojiChar: contact['emoji'] as String?,
|
||||
name: contact['name'] as String,
|
||||
addresses: addresses,
|
||||
isFavorite: contact['isFavorite'] as bool,
|
||||
id: contact['id'] as String,
|
||||
customId: contact['id'] as String,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
|
|
@ -3,8 +3,8 @@ import 'dart:async';
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
import 'package:stackwallet/models/contact.dart';
|
||||
import 'package:stackwallet/models/isar/models/blockchain_data/transaction.dart';
|
||||
import 'package:stackwallet/models/isar/models/contact_entry.dart';
|
||||
import 'package:stackwallet/models/transaction_filter.dart';
|
||||
import 'package:stackwallet/notifications/show_flush_bar.dart';
|
||||
import 'package:stackwallet/pages/wallet_view/sub_widgets/tx_icon.dart';
|
||||
|
@ -120,8 +120,8 @@ class _TransactionDetailsViewState extends ConsumerState<AllTransactionsView> {
|
|||
}).toList();
|
||||
}
|
||||
|
||||
bool _isKeywordMatch(Transaction tx, String keyword, List<Contact> contacts,
|
||||
Map<String, String> notes) {
|
||||
bool _isKeywordMatch(Transaction tx, String keyword,
|
||||
List<ContactEntry> contacts, Map<String, String> notes) {
|
||||
if (keyword.isEmpty) {
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -1,8 +1,7 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
import 'package:stackwallet/models/contact.dart';
|
||||
import 'package:stackwallet/models/contact_address_entry.dart';
|
||||
import 'package:stackwallet/models/isar/models/contact_entry.dart';
|
||||
import 'package:stackwallet/pages/address_book_views/subviews/add_address_book_entry_view.dart';
|
||||
import 'package:stackwallet/pages/address_book_views/subviews/address_book_filter_view.dart';
|
||||
import 'package:stackwallet/pages_desktop_specific/address_book_view/subwidgets/desktop_address_book_scaffold.dart';
|
||||
|
@ -105,19 +104,18 @@ class _DesktopAddressBook extends ConsumerState<DesktopAddressBook> {
|
|||
final managers = ref.read(walletsChangeNotifierProvider).managers;
|
||||
for (final manager in managers) {
|
||||
addresses.add(
|
||||
ContactAddressEntry(
|
||||
coin: manager.coin,
|
||||
address: await manager.currentReceivingAddress,
|
||||
label: "Current Receiving",
|
||||
other: manager.walletName,
|
||||
),
|
||||
ContactAddressEntry()
|
||||
..coinName = manager.coin.name
|
||||
..address = await manager.currentReceivingAddress
|
||||
..label = "Current Receiving"
|
||||
..other = manager.walletName,
|
||||
);
|
||||
}
|
||||
final self = Contact(
|
||||
final self = ContactEntry(
|
||||
name: "My Stack",
|
||||
addresses: addresses,
|
||||
isFavorite: true,
|
||||
id: "default",
|
||||
customId: "default",
|
||||
);
|
||||
await ref.read(addressBookServiceProvider).editContact(self);
|
||||
});
|
||||
|
@ -323,14 +321,14 @@ class _DesktopAddressBook extends ConsumerState<DesktopAddressBook> {
|
|||
.extension<StackColors>()!
|
||||
.accentColorDark
|
||||
.withOpacity(
|
||||
currentContactId == favorites[i].id
|
||||
currentContactId == favorites[i].customId
|
||||
? 0.08
|
||||
: 0,
|
||||
),
|
||||
child: RawMaterialButton(
|
||||
onPressed: () {
|
||||
setState(() {
|
||||
currentContactId = favorites[i].id;
|
||||
currentContactId = favorites[i].customId;
|
||||
});
|
||||
},
|
||||
padding: const EdgeInsets.symmetric(
|
||||
|
@ -346,8 +344,8 @@ class _DesktopAddressBook extends ConsumerState<DesktopAddressBook> {
|
|||
),
|
||||
child: AddressBookCard(
|
||||
key: Key(
|
||||
"favContactCard_${favorites[i].id}_key"),
|
||||
contactId: favorites[i].id,
|
||||
"favContactCard_${favorites[i].customId}_key"),
|
||||
contactId: favorites[i].customId,
|
||||
desktopSendFrom: false,
|
||||
),
|
||||
),
|
||||
|
@ -393,14 +391,16 @@ class _DesktopAddressBook extends ConsumerState<DesktopAddressBook> {
|
|||
.extension<StackColors>()!
|
||||
.accentColorDark
|
||||
.withOpacity(
|
||||
currentContactId == allContacts[i].id
|
||||
currentContactId ==
|
||||
allContacts[i].customId
|
||||
? 0.08
|
||||
: 0,
|
||||
),
|
||||
child: RawMaterialButton(
|
||||
onPressed: () {
|
||||
setState(() {
|
||||
currentContactId = allContacts[i].id;
|
||||
currentContactId =
|
||||
allContacts[i].customId;
|
||||
});
|
||||
},
|
||||
padding: const EdgeInsets.symmetric(
|
||||
|
@ -416,8 +416,8 @@ class _DesktopAddressBook extends ConsumerState<DesktopAddressBook> {
|
|||
),
|
||||
child: AddressBookCard(
|
||||
key: Key(
|
||||
"favContactCard_${allContacts[i].id}_key"),
|
||||
contactId: allContacts[i].id,
|
||||
"favContactCard_${allContacts[i].customId}_key"),
|
||||
contactId: allContacts[i].customId,
|
||||
desktopSendFrom: false,
|
||||
),
|
||||
),
|
||||
|
|
|
@ -2,12 +2,12 @@ import 'package:flutter/material.dart';
|
|||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:stackwallet/models/contact_address_entry.dart';
|
||||
import 'package:stackwallet/models/isar/models/contact_entry.dart';
|
||||
import 'package:stackwallet/notifications/show_flush_bar.dart';
|
||||
import 'package:stackwallet/pages/address_book_views/subviews/edit_contact_address_view.dart';
|
||||
import 'package:stackwallet/providers/ui/address_book_providers/address_entry_data_provider.dart';
|
||||
import 'package:stackwallet/themes/stack_colors.dart';
|
||||
import 'package:stackwallet/themes/coin_icon_provider.dart';
|
||||
import 'package:stackwallet/themes/stack_colors.dart';
|
||||
import 'package:stackwallet/utilities/assets.dart';
|
||||
import 'package:stackwallet/utilities/clipboard_interface.dart';
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
||||
|
|
|
@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
|
|||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:isar/isar.dart';
|
||||
import 'package:stackwallet/models/contact.dart';
|
||||
import 'package:stackwallet/models/isar/models/contact_entry.dart';
|
||||
import 'package:stackwallet/models/isar/models/isar_models.dart';
|
||||
import 'package:stackwallet/pages/address_book_views/subviews/add_new_contact_address_view.dart';
|
||||
import 'package:stackwallet/pages_desktop_specific/address_book_view/subwidgets/desktop_address_card.dart';
|
||||
|
@ -42,7 +42,7 @@ class DesktopContactDetails extends ConsumerStatefulWidget {
|
|||
class _DesktopContactDetailsState extends ConsumerState<DesktopContactDetails> {
|
||||
List<Tuple2<String, Transaction>> _cachedTransactions = [];
|
||||
|
||||
bool _contactHasAddress(String address, Contact contact) {
|
||||
bool _contactHasAddress(String address, ContactEntry contact) {
|
||||
for (final entry in contact.addresses) {
|
||||
if (entry.address == address) {
|
||||
return true;
|
||||
|
@ -82,7 +82,7 @@ class _DesktopContactDetailsState extends ConsumerState<DesktopContactDetails> {
|
|||
@override
|
||||
Widget build(BuildContext context) {
|
||||
// provider hack to prevent trying to update widget with deleted contact
|
||||
Contact? _contact;
|
||||
ContactEntry? _contact;
|
||||
try {
|
||||
_contact = ref.watch(addressBookServiceProvider
|
||||
.select((value) => value.getContactById(widget.contactId)));
|
||||
|
@ -159,7 +159,7 @@ class _DesktopContactDetailsState extends ConsumerState<DesktopContactDetails> {
|
|||
barrierColor: Colors.transparent,
|
||||
builder: (context) {
|
||||
return DesktopContactOptionsMenuPopup(
|
||||
contactId: contact.id,
|
||||
contactId: contact.customId,
|
||||
);
|
||||
},
|
||||
);
|
||||
|
@ -261,7 +261,7 @@ class _DesktopContactDetailsState extends ConsumerState<DesktopContactDetails> {
|
|||
padding: const EdgeInsets.all(18),
|
||||
child: DesktopAddressCard(
|
||||
entry: contact.addresses[i],
|
||||
contactId: contact.id,
|
||||
contactId: contact.customId,
|
||||
),
|
||||
),
|
||||
],
|
||||
|
|
|
@ -147,7 +147,7 @@ class _DesktopContactOptionsMenuPopupState
|
|||
onPressed: () {
|
||||
ref
|
||||
.read(addressBookServiceProvider)
|
||||
.removeContact(contact.id);
|
||||
.removeContact(contact.customId);
|
||||
Navigator.of(context).pop();
|
||||
showFloatingFlushBar(
|
||||
type: FlushBarType.success,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:stackwallet/models/contact.dart';
|
||||
import 'package:stackwallet/models/isar/models/contact_entry.dart';
|
||||
import 'package:stackwallet/pages_desktop_specific/my_stack_view/wallet_view/sub_widgets/address_book_address_chooser/sub_widgets/contact_list_item.dart';
|
||||
import 'package:stackwallet/providers/global/address_book_service_provider.dart';
|
||||
import 'package:stackwallet/themes/stack_colors.dart';
|
||||
|
@ -34,7 +34,7 @@ class _AddressBookAddressChooserState extends State<AddressBookAddressChooser> {
|
|||
|
||||
String _searchTerm = "";
|
||||
|
||||
int _compareContactFavorite(Contact a, Contact b) {
|
||||
int _compareContactFavorite(ContactEntry a, ContactEntry b) {
|
||||
if (a.isFavorite && b.isFavorite) {
|
||||
return 0;
|
||||
} else if (a.isFavorite) {
|
||||
|
@ -44,8 +44,8 @@ class _AddressBookAddressChooserState extends State<AddressBookAddressChooser> {
|
|||
}
|
||||
}
|
||||
|
||||
List<Contact> pullOutFavorites(List<Contact> contacts) {
|
||||
final List<Contact> favorites = [];
|
||||
List<ContactEntry> pullOutFavorites(List<ContactEntry> contacts) {
|
||||
final List<ContactEntry> favorites = [];
|
||||
contacts.removeWhere((contact) {
|
||||
if (contact.isFavorite) {
|
||||
favorites.add(contact);
|
||||
|
@ -57,7 +57,7 @@ class _AddressBookAddressChooserState extends State<AddressBookAddressChooser> {
|
|||
return favorites;
|
||||
}
|
||||
|
||||
List<Contact> filter(List<Contact> contacts, String searchTerm) {
|
||||
List<ContactEntry> filter(List<ContactEntry> contacts, String searchTerm) {
|
||||
if (widget.coin != null) {
|
||||
contacts.removeWhere(
|
||||
(e) => e.addresses.where((a) => a.coin == widget.coin!).isEmpty);
|
||||
|
@ -75,7 +75,7 @@ class _AddressBookAddressChooserState extends State<AddressBookAddressChooser> {
|
|||
return contacts;
|
||||
}
|
||||
|
||||
bool _matches(String term, Contact contact) {
|
||||
bool _matches(String term, ContactEntry contact) {
|
||||
final text = term.toLowerCase();
|
||||
if (contact.name.toLowerCase().contains(text)) {
|
||||
return true;
|
||||
|
@ -191,7 +191,7 @@ class _AddressBookAddressChooserState extends State<AddressBookAddressChooser> {
|
|||
),
|
||||
child: Consumer(
|
||||
builder: (context, ref, _) {
|
||||
List<Contact> contacts = ref
|
||||
List<ContactEntry> contacts = ref
|
||||
.watch(addressBookServiceProvider
|
||||
.select((value) => value.contacts))
|
||||
.toList();
|
||||
|
@ -228,7 +228,7 @@ class _AddressBookAddressChooserState extends State<AddressBookAddressChooser> {
|
|||
),
|
||||
);
|
||||
} else if (index < favorites.length + 1) {
|
||||
final id = favorites[index - 1].id;
|
||||
final id = favorites[index - 1].customId;
|
||||
return ContactListItem(
|
||||
key: Key("contactContactListItem_${id}_key"),
|
||||
contactId: id,
|
||||
|
@ -248,7 +248,8 @@ class _AddressBookAddressChooserState extends State<AddressBookAddressChooser> {
|
|||
),
|
||||
);
|
||||
} else {
|
||||
final id = contacts[index - favorites.length - 2].id;
|
||||
final id =
|
||||
contacts[index - favorites.length - 2].customId;
|
||||
return ContactListItem(
|
||||
key: Key("contactContactListItem_${id}_key"),
|
||||
contactId: id,
|
||||
|
|
|
@ -5,7 +5,6 @@ import 'package:isar/isar.dart';
|
|||
import 'package:stackwallet/models/add_wallet_list_entity/add_wallet_list_entity.dart';
|
||||
import 'package:stackwallet/models/add_wallet_list_entity/sub_classes/eth_token_entity.dart';
|
||||
import 'package:stackwallet/models/buy/response_objects/quote.dart';
|
||||
import 'package:stackwallet/models/contact_address_entry.dart';
|
||||
import 'package:stackwallet/models/exchange/incomplete_exchange.dart';
|
||||
import 'package:stackwallet/models/exchange/response_objects/trade.dart';
|
||||
import 'package:stackwallet/models/isar/models/isar_models.dart';
|
||||
|
@ -153,6 +152,8 @@ import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
|||
import 'package:stackwallet/widgets/choose_coin_view.dart';
|
||||
import 'package:tuple/tuple.dart';
|
||||
|
||||
import 'models/isar/models/contact_entry.dart';
|
||||
|
||||
class RouteGenerator {
|
||||
static const bool useMaterialPageRoute = true;
|
||||
|
||||
|
|
|
@ -1,107 +1,33 @@
|
|||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:stackwallet/db/isar/main_db.dart';
|
||||
import 'package:stackwallet/models/contact.dart';
|
||||
import 'package:stackwallet/models/contact_address_entry.dart';
|
||||
import 'package:stackwallet/models/isar/models/contact_entry.dart';
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
||||
import 'package:stackwallet/utilities/logger.dart';
|
||||
|
||||
class AddressBookService extends ChangeNotifier {
|
||||
|
||||
ContactEntry turnContactToEntry({required Contact contact}) {
|
||||
String? emojiChar = contact.emojiChar;
|
||||
String name = contact.name;
|
||||
List<String> addresses = [];
|
||||
bool isFavorite = contact.isFavorite;
|
||||
String customId = contact.id;
|
||||
for (ContactAddressEntry contactAddressEntry in contact.addresses) {
|
||||
String coin = contactAddressEntry.coin.ticker;
|
||||
String address = contactAddressEntry.address;
|
||||
String label = contactAddressEntry.label;
|
||||
String? other = contactAddressEntry.other;
|
||||
addresses.add("$coin,$address,$label,$other");
|
||||
}
|
||||
return ContactEntry(
|
||||
emojiChar: emojiChar,
|
||||
name: name,
|
||||
addresses: addresses,
|
||||
isFavorite: isFavorite,
|
||||
customId: customId,
|
||||
);
|
||||
}
|
||||
|
||||
Contact turnEntryToContact({required ContactEntry contactEntry}) {
|
||||
String? emojiChar = contactEntry.emojiChar;
|
||||
String name = contactEntry.name;
|
||||
List<ContactAddressEntry> addresses = [];
|
||||
bool isFavorite = contactEntry.isFavorite;
|
||||
String id = contactEntry.customId;
|
||||
for (String addressEntry in contactEntry.addresses) {
|
||||
List<String> addressEntrySplit = addressEntry.split(",");
|
||||
Coin coin = coinFromTickerCaseInsensitive(addressEntrySplit[0]);
|
||||
String address = addressEntrySplit[1];
|
||||
String label = addressEntrySplit[2];
|
||||
String? other = addressEntrySplit[3];
|
||||
addresses.add(ContactAddressEntry(
|
||||
coin: coin,
|
||||
address: address,
|
||||
label: label,
|
||||
other: other,
|
||||
));
|
||||
}
|
||||
return Contact(
|
||||
emojiChar: emojiChar,
|
||||
name: name,
|
||||
addresses: addresses,
|
||||
isFavorite: isFavorite,
|
||||
id: id,
|
||||
);
|
||||
}
|
||||
|
||||
Contact getContactById(String id) {
|
||||
ContactEntry getContactById(String id) {
|
||||
ContactEntry? contactEntry = MainDB.instance.getContactEntry(id: id);
|
||||
if (contactEntry == null) {
|
||||
return Contact(
|
||||
name: "Contact not found",
|
||||
addresses: [],
|
||||
isFavorite: false,
|
||||
);
|
||||
throw Exception('Contact ID "$id" not found!');
|
||||
} else {
|
||||
return turnEntryToContact(contactEntry: contactEntry);
|
||||
return contactEntry;
|
||||
}
|
||||
}
|
||||
|
||||
List<Contact> get contacts {
|
||||
List<ContactEntry> contactEntries = MainDB.instance.getContactEntries();
|
||||
List<Contact> contactsList = [];
|
||||
for (ContactEntry contactEntry in contactEntries) {
|
||||
contactsList.add(turnEntryToContact(contactEntry: contactEntry));
|
||||
}
|
||||
return contactsList;
|
||||
}
|
||||
|
||||
List<Contact>? _addressBookEntries;
|
||||
List<Contact> get addressBookEntries =>
|
||||
_addressBookEntries ??= _fetchAddressBookEntries();
|
||||
|
||||
// Load address book contact entries
|
||||
List<Contact> _fetchAddressBookEntries() {
|
||||
return contacts;
|
||||
}
|
||||
List<ContactEntry> get contacts => MainDB.instance.getContactEntries();
|
||||
|
||||
/// search address book entries
|
||||
//TODO optimize address book search?
|
||||
Future<List<Contact>> search(String text) async {
|
||||
if (text.isEmpty) return addressBookEntries;
|
||||
var results = (await addressBookEntries).toList();
|
||||
//TODO search using isar queries
|
||||
Future<List<ContactEntry>> search(String text) async {
|
||||
if (text.isEmpty) return contacts;
|
||||
var results = contacts.toList();
|
||||
|
||||
results.retainWhere((contact) => matches(text, contact));
|
||||
|
||||
return results;
|
||||
}
|
||||
|
||||
bool matches(String term, Contact contact) {
|
||||
bool matches(String term, ContactEntry contact) {
|
||||
if (term.isEmpty) {
|
||||
return true;
|
||||
}
|
||||
|
@ -125,33 +51,27 @@ class AddressBookService extends ChangeNotifier {
|
|||
///
|
||||
/// returns false if it provided [contact]'s id already exists in the database
|
||||
/// other true if the [contact] was saved
|
||||
Future<bool> addContact(Contact contact) async {
|
||||
if (await MainDB.instance.isContactEntryExists(id: contact.id)) {
|
||||
Future<bool> addContact(ContactEntry contact) async {
|
||||
if (await MainDB.instance.isContactEntryExists(id: contact.customId)) {
|
||||
return false;
|
||||
} else {
|
||||
await MainDB.instance.putContactEntry(contactEntry: turnContactToEntry(contact: contact));
|
||||
_refreshAddressBookEntries();
|
||||
await MainDB.instance.putContactEntry(contactEntry: contact);
|
||||
notifyListeners();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
/// Edit contact
|
||||
Future<bool> editContact(Contact editedContact) async {
|
||||
Future<bool> editContact(ContactEntry editedContact) async {
|
||||
// over write the contact with edited version
|
||||
await MainDB.instance.putContactEntry(contactEntry: turnContactToEntry(contact: editedContact));
|
||||
_refreshAddressBookEntries();
|
||||
await MainDB.instance.putContactEntry(contactEntry: editedContact);
|
||||
notifyListeners();
|
||||
return true;
|
||||
}
|
||||
|
||||
/// Remove address book contact entry from db if it exists
|
||||
Future<void> removeContact(String id) async {
|
||||
await MainDB.instance.deleteContactEntry(id: id);
|
||||
_refreshAddressBookEntries();
|
||||
}
|
||||
|
||||
void _refreshAddressBookEntries() {
|
||||
final newAddressBookEntries = _fetchAddressBookEntries();
|
||||
_addressBookEntries = newAddressBookEntries;
|
||||
notifyListeners();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,9 +3,12 @@ import 'package:isar/isar.dart';
|
|||
import 'package:stackwallet/db/hive/db.dart';
|
||||
import 'package:stackwallet/db/isar/main_db.dart';
|
||||
import 'package:stackwallet/electrumx_rpc/electrumx.dart';
|
||||
import 'package:stackwallet/models/contact.dart';
|
||||
import 'package:stackwallet/models/exchange/change_now/exchange_transaction.dart';
|
||||
import 'package:stackwallet/models/exchange/response_objects/trade.dart';
|
||||
import 'package:stackwallet/models/isar/models/blockchain_data/address.dart';
|
||||
import 'package:stackwallet/models/isar/models/contact_entry.dart'
|
||||
as isar_contact;
|
||||
import 'package:stackwallet/models/isar/models/isar_models.dart' as isar_models;
|
||||
import 'package:stackwallet/models/models.dart';
|
||||
import 'package:stackwallet/models/node_model.dart';
|
||||
|
@ -290,6 +293,17 @@ class DbVersionMigrator with WalletDB {
|
|||
// try to continue migrating
|
||||
return await migrate(8, secureStore: secureStore);
|
||||
|
||||
case 9:
|
||||
// migrate
|
||||
await _v9();
|
||||
|
||||
// update version
|
||||
await DB.instance.put<dynamic>(
|
||||
boxName: DB.boxNameDBInfo, key: "hive_data_version", value: 10);
|
||||
|
||||
// try to continue migrating
|
||||
return await migrate(10, secureStore: secureStore);
|
||||
|
||||
default:
|
||||
// finally return
|
||||
return;
|
||||
|
@ -447,4 +461,50 @@ class DbVersionMigrator with WalletDB {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _v9() async {
|
||||
final addressBookBox = await Hive.openBox<dynamic>(DB.boxNameAddressBook);
|
||||
await MainDB.instance.initMainDB();
|
||||
|
||||
final keys = List<String>.from(addressBookBox.keys);
|
||||
final contacts = keys
|
||||
.map((id) => Contact.fromJson(
|
||||
Map<String, dynamic>.from(
|
||||
addressBookBox.get(id) as Map,
|
||||
),
|
||||
))
|
||||
.toList(growable: false);
|
||||
|
||||
final List<isar_contact.ContactEntry> newContacts = [];
|
||||
|
||||
for (final contact in contacts) {
|
||||
final List<isar_contact.ContactAddressEntry> newContactAddressEntries =
|
||||
[];
|
||||
|
||||
for (final entry in contact.addresses) {
|
||||
newContactAddressEntries.add(
|
||||
isar_contact.ContactAddressEntry()
|
||||
..coinName = entry.coin.name
|
||||
..address = entry.address
|
||||
..label = entry.label
|
||||
..other = entry.other,
|
||||
);
|
||||
}
|
||||
|
||||
final newContact = isar_contact.ContactEntry(
|
||||
name: contact.name,
|
||||
addresses: newContactAddressEntries,
|
||||
isFavorite: contact.isFavorite,
|
||||
customId: contact.id,
|
||||
);
|
||||
|
||||
newContacts.add(newContact);
|
||||
}
|
||||
|
||||
await MainDB.instance.isar.writeTxn(() async {
|
||||
await MainDB.instance.isar.contactEntrys.putAll(newContacts);
|
||||
});
|
||||
|
||||
await addressBookBox.deleteFromDisk();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
import 'package:stackwallet/models/contact.dart';
|
||||
import 'package:stackwallet/models/isar/models/contact_entry.dart';
|
||||
import 'package:stackwallet/pages/address_book_views/subviews/contact_popup.dart';
|
||||
import 'package:stackwallet/providers/global/address_book_service_provider.dart';
|
||||
import 'package:stackwallet/themes/stack_colors.dart';
|
||||
|
@ -48,7 +48,7 @@ class _AddressBookCardState extends ConsumerState<AddressBookCard> {
|
|||
@override
|
||||
Widget build(BuildContext context) {
|
||||
// provider hack to prevent trying to update widget with deleted contact
|
||||
Contact? _contact;
|
||||
ContactEntry? _contact;
|
||||
try {
|
||||
_contact = ref.watch(addressBookServiceProvider
|
||||
.select((value) => value.getContactById(contactId)));
|
||||
|
@ -81,7 +81,7 @@ class _AddressBookCardState extends ConsumerState<AddressBookCard> {
|
|||
width: 32,
|
||||
height: 32,
|
||||
decoration: BoxDecoration(
|
||||
color: contact.id == "default"
|
||||
color: contact.customId == "default"
|
||||
? Theme.of(context)
|
||||
.extension<StackColors>()!
|
||||
.myStackContactIconBG
|
||||
|
@ -90,7 +90,7 @@ class _AddressBookCardState extends ConsumerState<AddressBookCard> {
|
|||
.textFieldDefaultBG,
|
||||
borderRadius: BorderRadius.circular(32),
|
||||
),
|
||||
child: contact.id == "default"
|
||||
child: contact.customId == "default"
|
||||
? Center(
|
||||
child: SvgPicture.asset(
|
||||
ref.watch(
|
||||
|
@ -176,7 +176,7 @@ class _AddressBookCardState extends ConsumerState<AddressBookCard> {
|
|||
useSafeArea: true,
|
||||
barrierDismissible: true,
|
||||
builder: (_) => ContactPopUp(
|
||||
contactId: contact.id,
|
||||
contactId: contact.customId,
|
||||
),
|
||||
);
|
||||
},
|
||||
|
|
|
@ -1,174 +0,0 @@
|
|||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:hive/hive.dart';
|
||||
import 'package:hive_test/hive_test.dart';
|
||||
import 'package:stackwallet/db/hive/db.dart';
|
||||
import 'package:stackwallet/models/contact.dart';
|
||||
import 'package:stackwallet/models/contact_address_entry.dart';
|
||||
import 'package:stackwallet/services/address_book_service.dart';
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
||||
|
||||
void main() {
|
||||
group("Empty DB tests", () {
|
||||
setUp(() async {
|
||||
await setUpTestHive();
|
||||
await Hive.openBox<dynamic>(DB.boxNameAddressBook);
|
||||
});
|
||||
|
||||
test("get empty contacts", () {
|
||||
final service = AddressBookService();
|
||||
expect(service.contacts, <Contact>[]);
|
||||
});
|
||||
|
||||
test("get empty addressBookEntries", () async {
|
||||
final service = AddressBookService();
|
||||
expect(await service.addressBookEntries, <Contact>[]);
|
||||
});
|
||||
|
||||
test("getContactById from empty db", () {
|
||||
final service = AddressBookService();
|
||||
expect(() => service.getContactById("some id"), throwsException);
|
||||
});
|
||||
|
||||
tearDown(() async {
|
||||
await tearDownTestHive();
|
||||
});
|
||||
});
|
||||
|
||||
group("Preloaded DB tests", () {
|
||||
final contactA = Contact(name: "john", addresses: [], isFavorite: true);
|
||||
final contactB = Contact(
|
||||
name: "JANE",
|
||||
addresses: [
|
||||
const ContactAddressEntry(
|
||||
coin: Coin.bitcoin,
|
||||
address: "some btc address",
|
||||
label: "rent",
|
||||
),
|
||||
],
|
||||
isFavorite: false);
|
||||
final contactC = Contact(
|
||||
name: "Bill",
|
||||
addresses: [
|
||||
const ContactAddressEntry(
|
||||
coin: Coin.monero,
|
||||
address: "some xmr address",
|
||||
label: "market",
|
||||
),
|
||||
const ContactAddressEntry(
|
||||
coin: Coin.epicCash,
|
||||
address: "some epic address",
|
||||
label: "gas",
|
||||
),
|
||||
],
|
||||
isFavorite: true);
|
||||
|
||||
setUp(() async {
|
||||
await setUpTestHive();
|
||||
await Hive.openBox<dynamic>(DB.boxNameAddressBook);
|
||||
|
||||
await DB.instance.put<dynamic>(
|
||||
boxName: DB.boxNameAddressBook,
|
||||
key: contactA.id,
|
||||
value: contactA.toMap());
|
||||
await DB.instance.put<dynamic>(
|
||||
boxName: DB.boxNameAddressBook,
|
||||
key: contactB.id,
|
||||
value: contactB.toMap());
|
||||
await DB.instance.put<dynamic>(
|
||||
boxName: DB.boxNameAddressBook,
|
||||
key: contactC.id,
|
||||
value: contactC.toMap());
|
||||
});
|
||||
|
||||
test("getContactById with non existing ID", () {
|
||||
final service = AddressBookService();
|
||||
expect(() => service.getContactById("some id"), throwsException);
|
||||
});
|
||||
|
||||
test("getContactById with existing ID", () {
|
||||
final service = AddressBookService();
|
||||
expect(
|
||||
service.getContactById(contactA.id).toString(), contactA.toString());
|
||||
});
|
||||
|
||||
test("get contacts", () {
|
||||
final service = AddressBookService();
|
||||
expect(service.contacts.toString(),
|
||||
[contactC, contactB, contactA].toString());
|
||||
});
|
||||
|
||||
test("get addressBookEntries", () async {
|
||||
final service = AddressBookService();
|
||||
expect((await service.addressBookEntries).toString(),
|
||||
[contactC, contactB, contactA].toString());
|
||||
});
|
||||
|
||||
test("search contacts", () async {
|
||||
final service = AddressBookService();
|
||||
final results = await service.search("j");
|
||||
expect(results.toString(), [contactB, contactA].toString());
|
||||
|
||||
final results2 = await service.search("ja");
|
||||
expect(results2.toString(), [contactB].toString());
|
||||
|
||||
final results3 = await service.search("john");
|
||||
expect(results3.toString(), [contactA].toString());
|
||||
|
||||
final results4 = await service.search("po");
|
||||
expect(results4.toString(), <Contact>[].toString());
|
||||
|
||||
final results5 = await service.search("");
|
||||
expect(results5.toString(), [contactC, contactB, contactA].toString());
|
||||
|
||||
final results6 = await service.search("epic address");
|
||||
expect(results6.toString(), [contactC].toString());
|
||||
});
|
||||
|
||||
test("add new contact", () async {
|
||||
final service = AddressBookService();
|
||||
final contactD = Contact(name: "tim", addresses: [], isFavorite: true);
|
||||
final result = await service.addContact(contactD);
|
||||
expect(result, true);
|
||||
expect(service.contacts.length, 4);
|
||||
expect(
|
||||
service.getContactById(contactD.id).toString(), contactD.toString());
|
||||
});
|
||||
|
||||
test("add duplicate contact", () async {
|
||||
final service = AddressBookService();
|
||||
final result = await service.addContact(contactA);
|
||||
expect(result, false);
|
||||
expect(service.contacts.length, 3);
|
||||
expect(service.contacts.toString(),
|
||||
[contactC, contactB, contactA].toString());
|
||||
});
|
||||
|
||||
test("edit contact", () async {
|
||||
final service = AddressBookService();
|
||||
final editedContact = contactB.copyWith(name: "Mike");
|
||||
expect(await service.editContact(editedContact), true);
|
||||
expect(service.contacts.length, 3);
|
||||
expect(service.contacts.toString(),
|
||||
[contactC, contactA, editedContact].toString());
|
||||
});
|
||||
|
||||
test("remove existing contact", () async {
|
||||
final service = AddressBookService();
|
||||
await service.removeContact(contactB.id);
|
||||
expect(service.contacts.length, 2);
|
||||
expect(service.contacts.toString(), [contactC, contactA].toString());
|
||||
});
|
||||
|
||||
test("remove non existing contact", () async {
|
||||
final service = AddressBookService();
|
||||
await service.removeContact("some id");
|
||||
expect(service.contacts.length, 3);
|
||||
expect(service.contacts.toString(),
|
||||
[contactC, contactB, contactA].toString());
|
||||
});
|
||||
|
||||
tearDown(() async {
|
||||
await tearDownTestHive();
|
||||
});
|
||||
});
|
||||
}
|
|
@ -7,7 +7,7 @@ import 'dart:async' as _i4;
|
|||
import 'dart:ui' as _i5;
|
||||
|
||||
import 'package:mockito/mockito.dart' as _i1;
|
||||
import 'package:stackwallet/models/contact.dart' as _i2;
|
||||
import 'package:stackwallet/models/isar/models/contact_entry.dart' as _i2;
|
||||
import 'package:stackwallet/services/address_book_service.dart' as _i3;
|
||||
|
||||
// ignore_for_file: type=lint
|
||||
|
@ -21,8 +21,8 @@ import 'package:stackwallet/services/address_book_service.dart' as _i3;
|
|||
// ignore_for_file: camel_case_types
|
||||
// ignore_for_file: subtype_of_sealed_class
|
||||
|
||||
class _FakeContact_0 extends _i1.SmartFake implements _i2.Contact {
|
||||
_FakeContact_0(
|
||||
class _FakeContactEntry_0 extends _i1.SmartFake implements _i2.ContactEntry {
|
||||
_FakeContactEntry_0(
|
||||
Object parent,
|
||||
Invocation parentInvocation,
|
||||
) : super(
|
||||
|
@ -37,46 +37,43 @@ class _FakeContact_0 extends _i1.SmartFake implements _i2.Contact {
|
|||
class MockAddressBookService extends _i1.Mock
|
||||
implements _i3.AddressBookService {
|
||||
@override
|
||||
List<_i2.Contact> get contacts => (super.noSuchMethod(
|
||||
List<_i2.ContactEntry> get contacts => (super.noSuchMethod(
|
||||
Invocation.getter(#contacts),
|
||||
returnValue: <_i2.Contact>[],
|
||||
) as List<_i2.Contact>);
|
||||
@override
|
||||
_i4.Future<List<_i2.Contact>> get addressBookEntries => (super.noSuchMethod(
|
||||
Invocation.getter(#addressBookEntries),
|
||||
returnValue: _i4.Future<List<_i2.Contact>>.value(<_i2.Contact>[]),
|
||||
) as _i4.Future<List<_i2.Contact>>);
|
||||
returnValue: <_i2.ContactEntry>[],
|
||||
) as List<_i2.ContactEntry>);
|
||||
@override
|
||||
bool get hasListeners => (super.noSuchMethod(
|
||||
Invocation.getter(#hasListeners),
|
||||
returnValue: false,
|
||||
) as bool);
|
||||
@override
|
||||
_i2.Contact getContactById(String? id) => (super.noSuchMethod(
|
||||
_i2.ContactEntry getContactById(String? id) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#getContactById,
|
||||
[id],
|
||||
),
|
||||
returnValue: _FakeContact_0(
|
||||
returnValue: _FakeContactEntry_0(
|
||||
this,
|
||||
Invocation.method(
|
||||
#getContactById,
|
||||
[id],
|
||||
),
|
||||
),
|
||||
) as _i2.Contact);
|
||||
) as _i2.ContactEntry);
|
||||
@override
|
||||
_i4.Future<List<_i2.Contact>> search(String? text) => (super.noSuchMethod(
|
||||
_i4.Future<List<_i2.ContactEntry>> search(String? text) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#search,
|
||||
[text],
|
||||
),
|
||||
returnValue: _i4.Future<List<_i2.Contact>>.value(<_i2.Contact>[]),
|
||||
) as _i4.Future<List<_i2.Contact>>);
|
||||
returnValue:
|
||||
_i4.Future<List<_i2.ContactEntry>>.value(<_i2.ContactEntry>[]),
|
||||
) as _i4.Future<List<_i2.ContactEntry>>);
|
||||
@override
|
||||
bool matches(
|
||||
String? term,
|
||||
_i2.Contact? contact,
|
||||
_i2.ContactEntry? contact,
|
||||
) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
|
@ -89,7 +86,7 @@ class MockAddressBookService extends _i1.Mock
|
|||
returnValue: false,
|
||||
) as bool);
|
||||
@override
|
||||
_i4.Future<bool> addContact(_i2.Contact? contact) => (super.noSuchMethod(
|
||||
_i4.Future<bool> addContact(_i2.ContactEntry? contact) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#addContact,
|
||||
[contact],
|
||||
|
@ -97,7 +94,7 @@ class MockAddressBookService extends _i1.Mock
|
|||
returnValue: _i4.Future<bool>.value(false),
|
||||
) as _i4.Future<bool>);
|
||||
@override
|
||||
_i4.Future<bool> editContact(_i2.Contact? editedContact) =>
|
||||
_i4.Future<bool> editContact(_i2.ContactEntry? editedContact) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#editContact,
|
||||
|
|
|
@ -9,7 +9,7 @@ import 'dart:ui' as _i11;
|
|||
import 'package:barcode_scan2/barcode_scan2.dart' as _i2;
|
||||
import 'package:mockito/mockito.dart' as _i1;
|
||||
import 'package:stackwallet/models/balance.dart' as _i6;
|
||||
import 'package:stackwallet/models/contact.dart' as _i3;
|
||||
import 'package:stackwallet/models/isar/models/contact_entry.dart' as _i3;
|
||||
import 'package:stackwallet/models/isar/models/isar_models.dart' as _i14;
|
||||
import 'package:stackwallet/models/models.dart' as _i5;
|
||||
import 'package:stackwallet/services/address_book_service.dart' as _i10;
|
||||
|
@ -40,8 +40,8 @@ class _FakeScanResult_0 extends _i1.SmartFake implements _i2.ScanResult {
|
|||
);
|
||||
}
|
||||
|
||||
class _FakeContact_1 extends _i1.SmartFake implements _i3.Contact {
|
||||
_FakeContact_1(
|
||||
class _FakeContactEntry_1 extends _i1.SmartFake implements _i3.ContactEntry {
|
||||
_FakeContactEntry_1(
|
||||
Object parent,
|
||||
Invocation parentInvocation,
|
||||
) : super(
|
||||
|
@ -126,46 +126,43 @@ class MockBarcodeScannerWrapper extends _i1.Mock
|
|||
class MockAddressBookService extends _i1.Mock
|
||||
implements _i10.AddressBookService {
|
||||
@override
|
||||
List<_i3.Contact> get contacts => (super.noSuchMethod(
|
||||
List<_i3.ContactEntry> get contacts => (super.noSuchMethod(
|
||||
Invocation.getter(#contacts),
|
||||
returnValue: <_i3.Contact>[],
|
||||
) as List<_i3.Contact>);
|
||||
@override
|
||||
_i9.Future<List<_i3.Contact>> get addressBookEntries => (super.noSuchMethod(
|
||||
Invocation.getter(#addressBookEntries),
|
||||
returnValue: _i9.Future<List<_i3.Contact>>.value(<_i3.Contact>[]),
|
||||
) as _i9.Future<List<_i3.Contact>>);
|
||||
returnValue: <_i3.ContactEntry>[],
|
||||
) as List<_i3.ContactEntry>);
|
||||
@override
|
||||
bool get hasListeners => (super.noSuchMethod(
|
||||
Invocation.getter(#hasListeners),
|
||||
returnValue: false,
|
||||
) as bool);
|
||||
@override
|
||||
_i3.Contact getContactById(String? id) => (super.noSuchMethod(
|
||||
_i3.ContactEntry getContactById(String? id) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#getContactById,
|
||||
[id],
|
||||
),
|
||||
returnValue: _FakeContact_1(
|
||||
returnValue: _FakeContactEntry_1(
|
||||
this,
|
||||
Invocation.method(
|
||||
#getContactById,
|
||||
[id],
|
||||
),
|
||||
),
|
||||
) as _i3.Contact);
|
||||
) as _i3.ContactEntry);
|
||||
@override
|
||||
_i9.Future<List<_i3.Contact>> search(String? text) => (super.noSuchMethod(
|
||||
_i9.Future<List<_i3.ContactEntry>> search(String? text) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#search,
|
||||
[text],
|
||||
),
|
||||
returnValue: _i9.Future<List<_i3.Contact>>.value(<_i3.Contact>[]),
|
||||
) as _i9.Future<List<_i3.Contact>>);
|
||||
returnValue:
|
||||
_i9.Future<List<_i3.ContactEntry>>.value(<_i3.ContactEntry>[]),
|
||||
) as _i9.Future<List<_i3.ContactEntry>>);
|
||||
@override
|
||||
bool matches(
|
||||
String? term,
|
||||
_i3.Contact? contact,
|
||||
_i3.ContactEntry? contact,
|
||||
) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
|
@ -178,7 +175,7 @@ class MockAddressBookService extends _i1.Mock
|
|||
returnValue: false,
|
||||
) as bool);
|
||||
@override
|
||||
_i9.Future<bool> addContact(_i3.Contact? contact) => (super.noSuchMethod(
|
||||
_i9.Future<bool> addContact(_i3.ContactEntry? contact) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#addContact,
|
||||
[contact],
|
||||
|
@ -186,7 +183,7 @@ class MockAddressBookService extends _i1.Mock
|
|||
returnValue: _i9.Future<bool>.value(false),
|
||||
) as _i9.Future<bool>);
|
||||
@override
|
||||
_i9.Future<bool> editContact(_i3.Contact? editedContact) =>
|
||||
_i9.Future<bool> editContact(_i3.ContactEntry? editedContact) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#editContact,
|
||||
|
|
|
@ -8,7 +8,7 @@ import 'dart:ui' as _i9;
|
|||
|
||||
import 'package:mockito/mockito.dart' as _i1;
|
||||
import 'package:stackwallet/models/balance.dart' as _i5;
|
||||
import 'package:stackwallet/models/contact.dart' as _i2;
|
||||
import 'package:stackwallet/models/isar/models/contact_entry.dart' as _i2;
|
||||
import 'package:stackwallet/models/isar/models/isar_models.dart' as _i12;
|
||||
import 'package:stackwallet/models/models.dart' as _i4;
|
||||
import 'package:stackwallet/services/address_book_service.dart' as _i7;
|
||||
|
@ -30,8 +30,8 @@ import 'package:stackwallet/utilities/enums/coin_enum.dart' as _i11;
|
|||
// ignore_for_file: camel_case_types
|
||||
// ignore_for_file: subtype_of_sealed_class
|
||||
|
||||
class _FakeContact_0 extends _i1.SmartFake implements _i2.Contact {
|
||||
_FakeContact_0(
|
||||
class _FakeContactEntry_0 extends _i1.SmartFake implements _i2.ContactEntry {
|
||||
_FakeContactEntry_0(
|
||||
Object parent,
|
||||
Invocation parentInvocation,
|
||||
) : super(
|
||||
|
@ -87,46 +87,43 @@ class _FakeAmount_4 extends _i1.SmartFake implements _i6.Amount {
|
|||
class MockAddressBookService extends _i1.Mock
|
||||
implements _i7.AddressBookService {
|
||||
@override
|
||||
List<_i2.Contact> get contacts => (super.noSuchMethod(
|
||||
List<_i2.ContactEntry> get contacts => (super.noSuchMethod(
|
||||
Invocation.getter(#contacts),
|
||||
returnValue: <_i2.Contact>[],
|
||||
) as List<_i2.Contact>);
|
||||
@override
|
||||
_i8.Future<List<_i2.Contact>> get addressBookEntries => (super.noSuchMethod(
|
||||
Invocation.getter(#addressBookEntries),
|
||||
returnValue: _i8.Future<List<_i2.Contact>>.value(<_i2.Contact>[]),
|
||||
) as _i8.Future<List<_i2.Contact>>);
|
||||
returnValue: <_i2.ContactEntry>[],
|
||||
) as List<_i2.ContactEntry>);
|
||||
@override
|
||||
bool get hasListeners => (super.noSuchMethod(
|
||||
Invocation.getter(#hasListeners),
|
||||
returnValue: false,
|
||||
) as bool);
|
||||
@override
|
||||
_i2.Contact getContactById(String? id) => (super.noSuchMethod(
|
||||
_i2.ContactEntry getContactById(String? id) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#getContactById,
|
||||
[id],
|
||||
),
|
||||
returnValue: _FakeContact_0(
|
||||
returnValue: _FakeContactEntry_0(
|
||||
this,
|
||||
Invocation.method(
|
||||
#getContactById,
|
||||
[id],
|
||||
),
|
||||
),
|
||||
) as _i2.Contact);
|
||||
) as _i2.ContactEntry);
|
||||
@override
|
||||
_i8.Future<List<_i2.Contact>> search(String? text) => (super.noSuchMethod(
|
||||
_i8.Future<List<_i2.ContactEntry>> search(String? text) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#search,
|
||||
[text],
|
||||
),
|
||||
returnValue: _i8.Future<List<_i2.Contact>>.value(<_i2.Contact>[]),
|
||||
) as _i8.Future<List<_i2.Contact>>);
|
||||
returnValue:
|
||||
_i8.Future<List<_i2.ContactEntry>>.value(<_i2.ContactEntry>[]),
|
||||
) as _i8.Future<List<_i2.ContactEntry>>);
|
||||
@override
|
||||
bool matches(
|
||||
String? term,
|
||||
_i2.Contact? contact,
|
||||
_i2.ContactEntry? contact,
|
||||
) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
|
@ -139,7 +136,7 @@ class MockAddressBookService extends _i1.Mock
|
|||
returnValue: false,
|
||||
) as bool);
|
||||
@override
|
||||
_i8.Future<bool> addContact(_i2.Contact? contact) => (super.noSuchMethod(
|
||||
_i8.Future<bool> addContact(_i2.ContactEntry? contact) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#addContact,
|
||||
[contact],
|
||||
|
@ -147,7 +144,7 @@ class MockAddressBookService extends _i1.Mock
|
|||
returnValue: _i8.Future<bool>.value(false),
|
||||
) as _i8.Future<bool>);
|
||||
@override
|
||||
_i8.Future<bool> editContact(_i2.Contact? editedContact) =>
|
||||
_i8.Future<bool> editContact(_i2.ContactEntry? editedContact) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#editContact,
|
||||
|
|
|
@ -8,7 +8,7 @@ import 'dart:ui' as _i9;
|
|||
|
||||
import 'package:mockito/mockito.dart' as _i1;
|
||||
import 'package:stackwallet/models/balance.dart' as _i5;
|
||||
import 'package:stackwallet/models/contact.dart' as _i2;
|
||||
import 'package:stackwallet/models/isar/models/contact_entry.dart' as _i2;
|
||||
import 'package:stackwallet/models/isar/models/isar_models.dart' as _i12;
|
||||
import 'package:stackwallet/models/models.dart' as _i4;
|
||||
import 'package:stackwallet/services/address_book_service.dart' as _i7;
|
||||
|
@ -28,8 +28,8 @@ import 'package:stackwallet/utilities/enums/coin_enum.dart' as _i11;
|
|||
// ignore_for_file: camel_case_types
|
||||
// ignore_for_file: subtype_of_sealed_class
|
||||
|
||||
class _FakeContact_0 extends _i1.SmartFake implements _i2.Contact {
|
||||
_FakeContact_0(
|
||||
class _FakeContactEntry_0 extends _i1.SmartFake implements _i2.ContactEntry {
|
||||
_FakeContactEntry_0(
|
||||
Object parent,
|
||||
Invocation parentInvocation,
|
||||
) : super(
|
||||
|
@ -85,46 +85,43 @@ class _FakeAmount_4 extends _i1.SmartFake implements _i6.Amount {
|
|||
class MockAddressBookService extends _i1.Mock
|
||||
implements _i7.AddressBookService {
|
||||
@override
|
||||
List<_i2.Contact> get contacts => (super.noSuchMethod(
|
||||
List<_i2.ContactEntry> get contacts => (super.noSuchMethod(
|
||||
Invocation.getter(#contacts),
|
||||
returnValue: <_i2.Contact>[],
|
||||
) as List<_i2.Contact>);
|
||||
@override
|
||||
_i8.Future<List<_i2.Contact>> get addressBookEntries => (super.noSuchMethod(
|
||||
Invocation.getter(#addressBookEntries),
|
||||
returnValue: _i8.Future<List<_i2.Contact>>.value(<_i2.Contact>[]),
|
||||
) as _i8.Future<List<_i2.Contact>>);
|
||||
returnValue: <_i2.ContactEntry>[],
|
||||
) as List<_i2.ContactEntry>);
|
||||
@override
|
||||
bool get hasListeners => (super.noSuchMethod(
|
||||
Invocation.getter(#hasListeners),
|
||||
returnValue: false,
|
||||
) as bool);
|
||||
@override
|
||||
_i2.Contact getContactById(String? id) => (super.noSuchMethod(
|
||||
_i2.ContactEntry getContactById(String? id) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#getContactById,
|
||||
[id],
|
||||
),
|
||||
returnValue: _FakeContact_0(
|
||||
returnValue: _FakeContactEntry_0(
|
||||
this,
|
||||
Invocation.method(
|
||||
#getContactById,
|
||||
[id],
|
||||
),
|
||||
),
|
||||
) as _i2.Contact);
|
||||
) as _i2.ContactEntry);
|
||||
@override
|
||||
_i8.Future<List<_i2.Contact>> search(String? text) => (super.noSuchMethod(
|
||||
_i8.Future<List<_i2.ContactEntry>> search(String? text) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#search,
|
||||
[text],
|
||||
),
|
||||
returnValue: _i8.Future<List<_i2.Contact>>.value(<_i2.Contact>[]),
|
||||
) as _i8.Future<List<_i2.Contact>>);
|
||||
returnValue:
|
||||
_i8.Future<List<_i2.ContactEntry>>.value(<_i2.ContactEntry>[]),
|
||||
) as _i8.Future<List<_i2.ContactEntry>>);
|
||||
@override
|
||||
bool matches(
|
||||
String? term,
|
||||
_i2.Contact? contact,
|
||||
_i2.ContactEntry? contact,
|
||||
) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
|
@ -137,7 +134,7 @@ class MockAddressBookService extends _i1.Mock
|
|||
returnValue: false,
|
||||
) as bool);
|
||||
@override
|
||||
_i8.Future<bool> addContact(_i2.Contact? contact) => (super.noSuchMethod(
|
||||
_i8.Future<bool> addContact(_i2.ContactEntry? contact) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#addContact,
|
||||
[contact],
|
||||
|
@ -145,7 +142,7 @@ class MockAddressBookService extends _i1.Mock
|
|||
returnValue: _i8.Future<bool>.value(false),
|
||||
) as _i8.Future<bool>);
|
||||
@override
|
||||
_i8.Future<bool> editContact(_i2.Contact? editedContact) =>
|
||||
_i8.Future<bool> editContact(_i2.ContactEntry? editedContact) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#editContact,
|
||||
|
|
|
@ -7,7 +7,7 @@ import 'dart:async' as _i4;
|
|||
import 'dart:ui' as _i5;
|
||||
|
||||
import 'package:mockito/mockito.dart' as _i1;
|
||||
import 'package:stackwallet/models/contact.dart' as _i2;
|
||||
import 'package:stackwallet/models/isar/models/contact_entry.dart' as _i2;
|
||||
import 'package:stackwallet/services/address_book_service.dart' as _i6;
|
||||
import 'package:stackwallet/services/locale_service.dart' as _i7;
|
||||
import 'package:stackwallet/services/notes_service.dart' as _i3;
|
||||
|
@ -23,8 +23,8 @@ import 'package:stackwallet/services/notes_service.dart' as _i3;
|
|||
// ignore_for_file: camel_case_types
|
||||
// ignore_for_file: subtype_of_sealed_class
|
||||
|
||||
class _FakeContact_0 extends _i1.SmartFake implements _i2.Contact {
|
||||
_FakeContact_0(
|
||||
class _FakeContactEntry_0 extends _i1.SmartFake implements _i2.ContactEntry {
|
||||
_FakeContactEntry_0(
|
||||
Object parent,
|
||||
Invocation parentInvocation,
|
||||
) : super(
|
||||
|
@ -141,46 +141,43 @@ class MockNotesService extends _i1.Mock implements _i3.NotesService {
|
|||
class MockAddressBookService extends _i1.Mock
|
||||
implements _i6.AddressBookService {
|
||||
@override
|
||||
List<_i2.Contact> get contacts => (super.noSuchMethod(
|
||||
List<_i2.ContactEntry> get contacts => (super.noSuchMethod(
|
||||
Invocation.getter(#contacts),
|
||||
returnValue: <_i2.Contact>[],
|
||||
) as List<_i2.Contact>);
|
||||
@override
|
||||
_i4.Future<List<_i2.Contact>> get addressBookEntries => (super.noSuchMethod(
|
||||
Invocation.getter(#addressBookEntries),
|
||||
returnValue: _i4.Future<List<_i2.Contact>>.value(<_i2.Contact>[]),
|
||||
) as _i4.Future<List<_i2.Contact>>);
|
||||
returnValue: <_i2.ContactEntry>[],
|
||||
) as List<_i2.ContactEntry>);
|
||||
@override
|
||||
bool get hasListeners => (super.noSuchMethod(
|
||||
Invocation.getter(#hasListeners),
|
||||
returnValue: false,
|
||||
) as bool);
|
||||
@override
|
||||
_i2.Contact getContactById(String? id) => (super.noSuchMethod(
|
||||
_i2.ContactEntry getContactById(String? id) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#getContactById,
|
||||
[id],
|
||||
),
|
||||
returnValue: _FakeContact_0(
|
||||
returnValue: _FakeContactEntry_0(
|
||||
this,
|
||||
Invocation.method(
|
||||
#getContactById,
|
||||
[id],
|
||||
),
|
||||
),
|
||||
) as _i2.Contact);
|
||||
) as _i2.ContactEntry);
|
||||
@override
|
||||
_i4.Future<List<_i2.Contact>> search(String? text) => (super.noSuchMethod(
|
||||
_i4.Future<List<_i2.ContactEntry>> search(String? text) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#search,
|
||||
[text],
|
||||
),
|
||||
returnValue: _i4.Future<List<_i2.Contact>>.value(<_i2.Contact>[]),
|
||||
) as _i4.Future<List<_i2.Contact>>);
|
||||
returnValue:
|
||||
_i4.Future<List<_i2.ContactEntry>>.value(<_i2.ContactEntry>[]),
|
||||
) as _i4.Future<List<_i2.ContactEntry>>);
|
||||
@override
|
||||
bool matches(
|
||||
String? term,
|
||||
_i2.Contact? contact,
|
||||
_i2.ContactEntry? contact,
|
||||
) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
|
@ -193,7 +190,7 @@ class MockAddressBookService extends _i1.Mock
|
|||
returnValue: false,
|
||||
) as bool);
|
||||
@override
|
||||
_i4.Future<bool> addContact(_i2.Contact? contact) => (super.noSuchMethod(
|
||||
_i4.Future<bool> addContact(_i2.ContactEntry? contact) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#addContact,
|
||||
[contact],
|
||||
|
@ -201,7 +198,7 @@ class MockAddressBookService extends _i1.Mock
|
|||
returnValue: _i4.Future<bool>.value(false),
|
||||
) as _i4.Future<bool>);
|
||||
@override
|
||||
_i4.Future<bool> editContact(_i2.Contact? editedContact) =>
|
||||
_i4.Future<bool> editContact(_i2.ContactEntry? editedContact) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#editContact,
|
||||
|
|
|
@ -7,7 +7,7 @@ import 'dart:async' as _i4;
|
|||
import 'dart:ui' as _i5;
|
||||
|
||||
import 'package:mockito/mockito.dart' as _i1;
|
||||
import 'package:stackwallet/models/contact.dart' as _i2;
|
||||
import 'package:stackwallet/models/isar/models/contact_entry.dart' as _i2;
|
||||
import 'package:stackwallet/services/address_book_service.dart' as _i3;
|
||||
import 'package:stackwallet/services/notes_service.dart' as _i6;
|
||||
|
||||
|
@ -22,8 +22,8 @@ import 'package:stackwallet/services/notes_service.dart' as _i6;
|
|||
// ignore_for_file: camel_case_types
|
||||
// ignore_for_file: subtype_of_sealed_class
|
||||
|
||||
class _FakeContact_0 extends _i1.SmartFake implements _i2.Contact {
|
||||
_FakeContact_0(
|
||||
class _FakeContactEntry_0 extends _i1.SmartFake implements _i2.ContactEntry {
|
||||
_FakeContactEntry_0(
|
||||
Object parent,
|
||||
Invocation parentInvocation,
|
||||
) : super(
|
||||
|
@ -38,46 +38,43 @@ class _FakeContact_0 extends _i1.SmartFake implements _i2.Contact {
|
|||
class MockAddressBookService extends _i1.Mock
|
||||
implements _i3.AddressBookService {
|
||||
@override
|
||||
List<_i2.Contact> get contacts => (super.noSuchMethod(
|
||||
List<_i2.ContactEntry> get contacts => (super.noSuchMethod(
|
||||
Invocation.getter(#contacts),
|
||||
returnValue: <_i2.Contact>[],
|
||||
) as List<_i2.Contact>);
|
||||
@override
|
||||
_i4.Future<List<_i2.Contact>> get addressBookEntries => (super.noSuchMethod(
|
||||
Invocation.getter(#addressBookEntries),
|
||||
returnValue: _i4.Future<List<_i2.Contact>>.value(<_i2.Contact>[]),
|
||||
) as _i4.Future<List<_i2.Contact>>);
|
||||
returnValue: <_i2.ContactEntry>[],
|
||||
) as List<_i2.ContactEntry>);
|
||||
@override
|
||||
bool get hasListeners => (super.noSuchMethod(
|
||||
Invocation.getter(#hasListeners),
|
||||
returnValue: false,
|
||||
) as bool);
|
||||
@override
|
||||
_i2.Contact getContactById(String? id) => (super.noSuchMethod(
|
||||
_i2.ContactEntry getContactById(String? id) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#getContactById,
|
||||
[id],
|
||||
),
|
||||
returnValue: _FakeContact_0(
|
||||
returnValue: _FakeContactEntry_0(
|
||||
this,
|
||||
Invocation.method(
|
||||
#getContactById,
|
||||
[id],
|
||||
),
|
||||
),
|
||||
) as _i2.Contact);
|
||||
) as _i2.ContactEntry);
|
||||
@override
|
||||
_i4.Future<List<_i2.Contact>> search(String? text) => (super.noSuchMethod(
|
||||
_i4.Future<List<_i2.ContactEntry>> search(String? text) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#search,
|
||||
[text],
|
||||
),
|
||||
returnValue: _i4.Future<List<_i2.Contact>>.value(<_i2.Contact>[]),
|
||||
) as _i4.Future<List<_i2.Contact>>);
|
||||
returnValue:
|
||||
_i4.Future<List<_i2.ContactEntry>>.value(<_i2.ContactEntry>[]),
|
||||
) as _i4.Future<List<_i2.ContactEntry>>);
|
||||
@override
|
||||
bool matches(
|
||||
String? term,
|
||||
_i2.Contact? contact,
|
||||
_i2.ContactEntry? contact,
|
||||
) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
|
@ -90,7 +87,7 @@ class MockAddressBookService extends _i1.Mock
|
|||
returnValue: false,
|
||||
) as bool);
|
||||
@override
|
||||
_i4.Future<bool> addContact(_i2.Contact? contact) => (super.noSuchMethod(
|
||||
_i4.Future<bool> addContact(_i2.ContactEntry? contact) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#addContact,
|
||||
[contact],
|
||||
|
@ -98,7 +95,7 @@ class MockAddressBookService extends _i1.Mock
|
|||
returnValue: _i4.Future<bool>.value(false),
|
||||
) as _i4.Future<bool>);
|
||||
@override
|
||||
_i4.Future<bool> editContact(_i2.Contact? editedContact) =>
|
||||
_i4.Future<bool> editContact(_i2.ContactEntry? editedContact) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#editContact,
|
||||
|
|
|
@ -5,18 +5,17 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:mockito/annotations.dart';
|
||||
import 'package:mockito/mockito.dart';
|
||||
import 'package:stackwallet/models/contact.dart';
|
||||
import 'package:stackwallet/models/contact_address_entry.dart';
|
||||
import 'package:stackwallet/models/isar/models/contact_entry.dart';
|
||||
import 'package:stackwallet/models/isar/stack_theme.dart';
|
||||
import 'package:stackwallet/pages/address_book_views/subviews/contact_popup.dart';
|
||||
import 'package:stackwallet/providers/global/address_book_service_provider.dart';
|
||||
import 'package:stackwallet/services/address_book_service.dart';
|
||||
import '../sample_data/theme_json.dart';
|
||||
import 'package:stackwallet/themes/stack_colors.dart';
|
||||
import 'package:stackwallet/utilities/enums/coin_enum.dart';
|
||||
import 'package:stackwallet/utilities/util.dart';
|
||||
import 'package:stackwallet/widgets/address_book_card.dart';
|
||||
|
||||
import '../sample_data/theme_json.dart';
|
||||
import 'address_book_card_test.mocks.dart';
|
||||
|
||||
class MockedFunctions extends Mock {
|
||||
|
@ -27,18 +26,20 @@ class MockedFunctions extends Mock {
|
|||
void main() {
|
||||
testWidgets('test returns Contact Address Entry', (widgetTester) async {
|
||||
final service = MockAddressBookService();
|
||||
final applicationThemesDirectoryPath = "";
|
||||
const applicationThemesDirectoryPath = "";
|
||||
|
||||
when(service.getContactById("default")).thenAnswer(
|
||||
(realInvocation) => Contact(
|
||||
(realInvocation) => ContactEntry(
|
||||
name: "John Doe",
|
||||
addresses: [
|
||||
const ContactAddressEntry(
|
||||
coin: Coin.bitcoincash,
|
||||
address: "some bch address",
|
||||
label: "Bills")
|
||||
ContactAddressEntry()
|
||||
..coinName = Coin.bitcoincash.name
|
||||
..address = "some bch address"
|
||||
..label = "Bills"
|
||||
..other = null
|
||||
],
|
||||
isFavorite: true,
|
||||
customId: '',
|
||||
),
|
||||
);
|
||||
|
||||
|
|
|
@ -7,7 +7,7 @@ import 'dart:async' as _i4;
|
|||
import 'dart:ui' as _i5;
|
||||
|
||||
import 'package:mockito/mockito.dart' as _i1;
|
||||
import 'package:stackwallet/models/contact.dart' as _i2;
|
||||
import 'package:stackwallet/models/isar/models/contact_entry.dart' as _i2;
|
||||
import 'package:stackwallet/services/address_book_service.dart' as _i3;
|
||||
|
||||
// ignore_for_file: type=lint
|
||||
|
@ -21,8 +21,8 @@ import 'package:stackwallet/services/address_book_service.dart' as _i3;
|
|||
// ignore_for_file: camel_case_types
|
||||
// ignore_for_file: subtype_of_sealed_class
|
||||
|
||||
class _FakeContact_0 extends _i1.SmartFake implements _i2.Contact {
|
||||
_FakeContact_0(
|
||||
class _FakeContactEntry_0 extends _i1.SmartFake implements _i2.ContactEntry {
|
||||
_FakeContactEntry_0(
|
||||
Object parent,
|
||||
Invocation parentInvocation,
|
||||
) : super(
|
||||
|
@ -41,46 +41,43 @@ class MockAddressBookService extends _i1.Mock
|
|||
}
|
||||
|
||||
@override
|
||||
List<_i2.Contact> get contacts => (super.noSuchMethod(
|
||||
List<_i2.ContactEntry> get contacts => (super.noSuchMethod(
|
||||
Invocation.getter(#contacts),
|
||||
returnValue: <_i2.Contact>[],
|
||||
) as List<_i2.Contact>);
|
||||
@override
|
||||
_i4.Future<List<_i2.Contact>> get addressBookEntries => (super.noSuchMethod(
|
||||
Invocation.getter(#addressBookEntries),
|
||||
returnValue: _i4.Future<List<_i2.Contact>>.value(<_i2.Contact>[]),
|
||||
) as _i4.Future<List<_i2.Contact>>);
|
||||
returnValue: <_i2.ContactEntry>[],
|
||||
) as List<_i2.ContactEntry>);
|
||||
@override
|
||||
bool get hasListeners => (super.noSuchMethod(
|
||||
Invocation.getter(#hasListeners),
|
||||
returnValue: false,
|
||||
) as bool);
|
||||
@override
|
||||
_i2.Contact getContactById(String? id) => (super.noSuchMethod(
|
||||
_i2.ContactEntry getContactById(String? id) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#getContactById,
|
||||
[id],
|
||||
),
|
||||
returnValue: _FakeContact_0(
|
||||
returnValue: _FakeContactEntry_0(
|
||||
this,
|
||||
Invocation.method(
|
||||
#getContactById,
|
||||
[id],
|
||||
),
|
||||
),
|
||||
) as _i2.Contact);
|
||||
) as _i2.ContactEntry);
|
||||
@override
|
||||
_i4.Future<List<_i2.Contact>> search(String? text) => (super.noSuchMethod(
|
||||
_i4.Future<List<_i2.ContactEntry>> search(String? text) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#search,
|
||||
[text],
|
||||
),
|
||||
returnValue: _i4.Future<List<_i2.Contact>>.value(<_i2.Contact>[]),
|
||||
) as _i4.Future<List<_i2.Contact>>);
|
||||
returnValue:
|
||||
_i4.Future<List<_i2.ContactEntry>>.value(<_i2.ContactEntry>[]),
|
||||
) as _i4.Future<List<_i2.ContactEntry>>);
|
||||
@override
|
||||
bool matches(
|
||||
String? term,
|
||||
_i2.Contact? contact,
|
||||
_i2.ContactEntry? contact,
|
||||
) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
|
@ -93,7 +90,7 @@ class MockAddressBookService extends _i1.Mock
|
|||
returnValue: false,
|
||||
) as bool);
|
||||
@override
|
||||
_i4.Future<bool> addContact(_i2.Contact? contact) => (super.noSuchMethod(
|
||||
_i4.Future<bool> addContact(_i2.ContactEntry? contact) => (super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#addContact,
|
||||
[contact],
|
||||
|
@ -101,7 +98,7 @@ class MockAddressBookService extends _i1.Mock
|
|||
returnValue: _i4.Future<bool>.value(false),
|
||||
) as _i4.Future<bool>);
|
||||
@override
|
||||
_i4.Future<bool> editContact(_i2.Contact? editedContact) =>
|
||||
_i4.Future<bool> editContact(_i2.ContactEntry? editedContact) =>
|
||||
(super.noSuchMethod(
|
||||
Invocation.method(
|
||||
#editContact,
|
||||
|
|
Loading…
Reference in a new issue