mirror of
				https://gitlab.com/comunic/comunicmobile
				synced 2025-11-03 19:54:12 +00:00 
			
		
		
		
	Start to fix null safety migration errors
This commit is contained in:
		@@ -1,4 +1,4 @@
 | 
			
		||||
import 'package:flutter/widgets.dart';
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// Account image settings
 | 
			
		||||
///
 | 
			
		||||
@@ -7,14 +7,14 @@ import 'package:flutter/widgets.dart';
 | 
			
		||||
enum AccountImageVisibilityLevels { EVERYONE, COMUNIC_USERS, FRIENDS_ONLY }
 | 
			
		||||
 | 
			
		||||
class AccountImageSettings {
 | 
			
		||||
  final bool/*!*/ hasImage;
 | 
			
		||||
  final String/*!*/ imageURL;
 | 
			
		||||
  final AccountImageVisibilityLevels/*!*/ visibility;
 | 
			
		||||
  final bool hasImage;
 | 
			
		||||
  final String imageURL;
 | 
			
		||||
  final AccountImageVisibilityLevels visibility;
 | 
			
		||||
 | 
			
		||||
  const AccountImageSettings({
 | 
			
		||||
    @required this.hasImage,
 | 
			
		||||
    @required this.imageURL,
 | 
			
		||||
    @required this.visibility,
 | 
			
		||||
    required this.hasImage,
 | 
			
		||||
    required this.imageURL,
 | 
			
		||||
    required this.visibility,
 | 
			
		||||
  })  : assert(hasImage != null),
 | 
			
		||||
        assert(imageURL != null),
 | 
			
		||||
        assert(visibility != null);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,6 @@
 | 
			
		||||
import 'package:comunic/enums/likes_type.dart';
 | 
			
		||||
import 'package:comunic/models/conversation.dart';
 | 
			
		||||
import 'package:comunic/models/like_element.dart';
 | 
			
		||||
import 'package:flutter/material.dart';
 | 
			
		||||
 | 
			
		||||
import 'group.dart';
 | 
			
		||||
 | 
			
		||||
@@ -10,34 +9,34 @@ import 'group.dart';
 | 
			
		||||
/// @author Pierre Hubert
 | 
			
		||||
 | 
			
		||||
class AdvancedGroupInfo extends Group implements LikeElement {
 | 
			
		||||
  bool isMembersListPublic;
 | 
			
		||||
  final int timeCreate;
 | 
			
		||||
  bool? isMembersListPublic;
 | 
			
		||||
  final int? timeCreate;
 | 
			
		||||
  String description;
 | 
			
		||||
  String url;
 | 
			
		||||
  int likes;
 | 
			
		||||
  bool userLike;
 | 
			
		||||
  List<Conversation> conversations;
 | 
			
		||||
  bool/*!*/ isForezGroup;
 | 
			
		||||
  List<Conversation>? conversations;
 | 
			
		||||
  bool isForezGroup;
 | 
			
		||||
 | 
			
		||||
  AdvancedGroupInfo({
 | 
			
		||||
    @required int id,
 | 
			
		||||
    @required String name,
 | 
			
		||||
    @required String iconURL,
 | 
			
		||||
    @required int numberMembers,
 | 
			
		||||
    @required GroupMembershipLevel membershipLevel,
 | 
			
		||||
    @required GroupVisibilityLevel visibilityLevel,
 | 
			
		||||
    @required GroupRegistrationLevel registrationLevel,
 | 
			
		||||
    @required GroupPostCreationLevel postCreationLevel,
 | 
			
		||||
    @required String virtualDirectory,
 | 
			
		||||
    @required bool following,
 | 
			
		||||
    @required this.isMembersListPublic,
 | 
			
		||||
    @required this.timeCreate,
 | 
			
		||||
    @required this.description,
 | 
			
		||||
    @required this.url,
 | 
			
		||||
    @required this.likes,
 | 
			
		||||
    @required this.userLike,
 | 
			
		||||
    @required this.conversations,
 | 
			
		||||
    @required this.isForezGroup,
 | 
			
		||||
    required int id,
 | 
			
		||||
    required String name,
 | 
			
		||||
    required String iconURL,
 | 
			
		||||
    required int numberMembers,
 | 
			
		||||
    required GroupMembershipLevel membershipLevel,
 | 
			
		||||
    required GroupVisibilityLevel visibilityLevel,
 | 
			
		||||
    required GroupRegistrationLevel registrationLevel,
 | 
			
		||||
    required GroupPostCreationLevel postCreationLevel,
 | 
			
		||||
    required String virtualDirectory,
 | 
			
		||||
    required bool following,
 | 
			
		||||
    required this.isMembersListPublic,
 | 
			
		||||
    required this.timeCreate,
 | 
			
		||||
    required this.description,
 | 
			
		||||
    required this.url,
 | 
			
		||||
    required this.likes,
 | 
			
		||||
    required this.userLike,
 | 
			
		||||
    required this.conversations,
 | 
			
		||||
    required this.isForezGroup,
 | 
			
		||||
  })  : assert(isForezGroup != null),
 | 
			
		||||
        super(
 | 
			
		||||
            id: id,
 | 
			
		||||
 
 | 
			
		||||
@@ -3,42 +3,41 @@ import 'package:comunic/enums/user_page_visibility.dart';
 | 
			
		||||
import 'package:comunic/lists/custom_emojies_list.dart';
 | 
			
		||||
import 'package:comunic/models/like_element.dart';
 | 
			
		||||
import 'package:comunic/models/user.dart';
 | 
			
		||||
import 'package:meta/meta.dart';
 | 
			
		||||
 | 
			
		||||
/// Advanced user information
 | 
			
		||||
///
 | 
			
		||||
/// @author Pierre HUBERT
 | 
			
		||||
 | 
			
		||||
class AdvancedUserInfo extends User implements LikeElement {
 | 
			
		||||
  final String emailAddress;
 | 
			
		||||
  final String/*!*/ publicNote;
 | 
			
		||||
  final bool/*!*/ canPostTexts;
 | 
			
		||||
  final bool/*!*/ isFriendsListPublic;
 | 
			
		||||
  final int/*!*/ numberFriends;
 | 
			
		||||
  final int/*!*/ accountCreationTime;
 | 
			
		||||
  final String/*!*/ personalWebsite;
 | 
			
		||||
  final String location;
 | 
			
		||||
  bool/*!*/ userLike;
 | 
			
		||||
  int/*!*/ likes;
 | 
			
		||||
  final String? emailAddress;
 | 
			
		||||
  final String publicNote;
 | 
			
		||||
  final bool canPostTexts;
 | 
			
		||||
  final bool isFriendsListPublic;
 | 
			
		||||
  final int numberFriends;
 | 
			
		||||
  final int accountCreationTime;
 | 
			
		||||
  final String personalWebsite;
 | 
			
		||||
  final String? location;
 | 
			
		||||
  bool userLike;
 | 
			
		||||
  int likes;
 | 
			
		||||
 | 
			
		||||
  AdvancedUserInfo({
 | 
			
		||||
    @required int id,
 | 
			
		||||
    @required String firstName,
 | 
			
		||||
    @required String lastName,
 | 
			
		||||
    @required UserPageVisibility pageVisibility,
 | 
			
		||||
    @required String virtualDirectory,
 | 
			
		||||
    @required String accountImageURL,
 | 
			
		||||
    @required CustomEmojiesList customEmojies,
 | 
			
		||||
    @required this.emailAddress,
 | 
			
		||||
    @required this.publicNote,
 | 
			
		||||
    @required this.canPostTexts,
 | 
			
		||||
    @required this.isFriendsListPublic,
 | 
			
		||||
    @required this.numberFriends,
 | 
			
		||||
    @required this.accountCreationTime,
 | 
			
		||||
    @required this.personalWebsite,
 | 
			
		||||
    @required this.location,
 | 
			
		||||
    @required this.userLike,
 | 
			
		||||
    @required this.likes,
 | 
			
		||||
    required int id,
 | 
			
		||||
    required String firstName,
 | 
			
		||||
    required String lastName,
 | 
			
		||||
    required UserPageVisibility pageVisibility,
 | 
			
		||||
    required String? virtualDirectory,
 | 
			
		||||
    required String accountImageURL,
 | 
			
		||||
    required CustomEmojiesList customEmojies,
 | 
			
		||||
    required this.emailAddress,
 | 
			
		||||
    required this.publicNote,
 | 
			
		||||
    required this.canPostTexts,
 | 
			
		||||
    required this.isFriendsListPublic,
 | 
			
		||||
    required this.numberFriends,
 | 
			
		||||
    required this.accountCreationTime,
 | 
			
		||||
    required this.personalWebsite,
 | 
			
		||||
    required this.location,
 | 
			
		||||
    required this.userLike,
 | 
			
		||||
    required this.likes,
 | 
			
		||||
  })  : assert(publicNote != null),
 | 
			
		||||
        assert(canPostTexts != null),
 | 
			
		||||
        assert(isFriendsListPublic != null),
 | 
			
		||||
@@ -60,9 +59,9 @@ class AdvancedUserInfo extends User implements LikeElement {
 | 
			
		||||
 | 
			
		||||
  bool get hasPersonalWebsite => personalWebsite.isNotEmpty;
 | 
			
		||||
 | 
			
		||||
  bool get hasEmailAddress => emailAddress != null && emailAddress.isNotEmpty;
 | 
			
		||||
  bool get hasEmailAddress => emailAddress != null && emailAddress!.isNotEmpty;
 | 
			
		||||
 | 
			
		||||
  bool get hasLocation => location != null && location.isNotEmpty;
 | 
			
		||||
  bool get hasLocation => location != null && location!.isNotEmpty;
 | 
			
		||||
 | 
			
		||||
  @override
 | 
			
		||||
  LikesType get likeType => LikesType.USER;
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,6 @@ import 'package:comunic/helpers/api_helper.dart';
 | 
			
		||||
import 'package:comunic/models/api_response.dart';
 | 
			
		||||
import 'package:dio/dio.dart';
 | 
			
		||||
import 'package:http_parser/http_parser.dart';
 | 
			
		||||
import 'package:meta/meta.dart';
 | 
			
		||||
 | 
			
		||||
/// API Request model
 | 
			
		||||
///
 | 
			
		||||
@@ -14,8 +13,8 @@ import 'package:meta/meta.dart';
 | 
			
		||||
 | 
			
		||||
class BytesFile {
 | 
			
		||||
  final String filename;
 | 
			
		||||
  final List<int> bytes;
 | 
			
		||||
  final MediaType type;
 | 
			
		||||
  final List<int>? bytes;
 | 
			
		||||
  final MediaType? type;
 | 
			
		||||
 | 
			
		||||
  const BytesFile(
 | 
			
		||||
    this.filename,
 | 
			
		||||
@@ -25,15 +24,15 @@ class BytesFile {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class APIRequest {
 | 
			
		||||
  final String/*!*/ uri;
 | 
			
		||||
  final bool/*!*/ needLogin;
 | 
			
		||||
  ProgressCallback progressCallback;
 | 
			
		||||
  CancelToken cancelToken;
 | 
			
		||||
  Map<String, String> args;
 | 
			
		||||
  final String uri;
 | 
			
		||||
  final bool needLogin;
 | 
			
		||||
  ProgressCallback? progressCallback;
 | 
			
		||||
  CancelToken? cancelToken;
 | 
			
		||||
  Map<String, String?>? args;
 | 
			
		||||
  Map<String, File> files = Map();
 | 
			
		||||
  Map<String, BytesFile> bytesFiles = Map();
 | 
			
		||||
  Map<String, BytesFile?> bytesFiles = Map();
 | 
			
		||||
 | 
			
		||||
  APIRequest({@required this.uri, this.needLogin = false, this.args})
 | 
			
		||||
  APIRequest({required this.uri, this.needLogin = false, this.args})
 | 
			
		||||
      : assert(uri != null),
 | 
			
		||||
        assert(needLogin != null) {
 | 
			
		||||
    if (this.args == null) this.args = Map();
 | 
			
		||||
@@ -51,18 +50,18 @@ class APIRequest {
 | 
			
		||||
    if (args == null) this.args = Map();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  APIRequest addString(String name, String value) {
 | 
			
		||||
    args[name] = value;
 | 
			
		||||
  APIRequest addString(String name, String? value) {
 | 
			
		||||
    args![name] = value;
 | 
			
		||||
    return this;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  APIRequest addInt(String name, int value) {
 | 
			
		||||
    args[name] = value.toString();
 | 
			
		||||
  APIRequest addInt(String name, int? value) {
 | 
			
		||||
    args![name] = value.toString();
 | 
			
		||||
    return this;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  APIRequest addBool(String name, bool value) {
 | 
			
		||||
    args[name] = value ? "true" : "false";
 | 
			
		||||
    args![name] = value ? "true" : "false";
 | 
			
		||||
    return this;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -71,12 +70,12 @@ class APIRequest {
 | 
			
		||||
    return this;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  APIRequest addBytesFile(String name, BytesFile file) {
 | 
			
		||||
  APIRequest addBytesFile(String name, BytesFile? file) {
 | 
			
		||||
    this.bytesFiles[name] = file;
 | 
			
		||||
    return this;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void addArgs(Map<String, String> newArgs) => args.addAll(newArgs);
 | 
			
		||||
  void addArgs(Map<String, String> newArgs) => args!.addAll(newArgs);
 | 
			
		||||
 | 
			
		||||
  /// Execute the request
 | 
			
		||||
  Future<APIResponse> exec() async => APIHelper().exec(this);
 | 
			
		||||
 
 | 
			
		||||
@@ -5,14 +5,14 @@ import 'dart:convert';
 | 
			
		||||
/// @author Pierre HUBERT
 | 
			
		||||
 | 
			
		||||
class APIResponse {
 | 
			
		||||
  final int/*!*/ code;
 | 
			
		||||
  final String content;
 | 
			
		||||
  final int code;
 | 
			
		||||
  final String? content;
 | 
			
		||||
 | 
			
		||||
  const APIResponse(this.code, this.content) : assert(code != null);
 | 
			
		||||
  const APIResponse(this.code, this.content);
 | 
			
		||||
 | 
			
		||||
  List<dynamic> getArray() => jsonDecode(this.content);
 | 
			
		||||
  List<dynamic>? getArray() => jsonDecode(this.content!);
 | 
			
		||||
 | 
			
		||||
  Map<String, dynamic> getObject() => jsonDecode(this.content);
 | 
			
		||||
  Map<String, dynamic> getObject() => jsonDecode(this.content!);
 | 
			
		||||
 | 
			
		||||
  /// Check if the request is successful or not
 | 
			
		||||
  bool get isOK => code == 200;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,18 +1,18 @@
 | 
			
		||||
import 'package:flutter/cupertino.dart';
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// Application settings
 | 
			
		||||
///
 | 
			
		||||
/// @author Pierre Hubert
 | 
			
		||||
 | 
			
		||||
class ApplicationPreferences {
 | 
			
		||||
  bool/*!*/ enableDarkMode;
 | 
			
		||||
  bool/*!*/ forceMobileMode;
 | 
			
		||||
  bool/*!*/ showPerformancesOverlay;
 | 
			
		||||
  bool enableDarkMode;
 | 
			
		||||
  bool forceMobileMode;
 | 
			
		||||
  bool showPerformancesOverlay;
 | 
			
		||||
 | 
			
		||||
  ApplicationPreferences({
 | 
			
		||||
    @required this.enableDarkMode,
 | 
			
		||||
    @required this.forceMobileMode,
 | 
			
		||||
    @required this.showPerformancesOverlay,
 | 
			
		||||
    required this.enableDarkMode,
 | 
			
		||||
    required this.forceMobileMode,
 | 
			
		||||
    required this.showPerformancesOverlay,
 | 
			
		||||
  })  : assert(enableDarkMode != null),
 | 
			
		||||
        assert(forceMobileMode != null),
 | 
			
		||||
        assert(showPerformancesOverlay != null);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,14 +1,14 @@
 | 
			
		||||
import 'package:meta/meta.dart';
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// Authentication details
 | 
			
		||||
///
 | 
			
		||||
/// @author Pierre HUBERT
 | 
			
		||||
 | 
			
		||||
class AuthenticationDetails {
 | 
			
		||||
  final String/*!*/ email;
 | 
			
		||||
  final String/*!*/ password;
 | 
			
		||||
  final String email;
 | 
			
		||||
  final String password;
 | 
			
		||||
 | 
			
		||||
  const AuthenticationDetails({@required this.email, @required this.password})
 | 
			
		||||
  const AuthenticationDetails({required this.email, required this.password})
 | 
			
		||||
      : assert(email != null),
 | 
			
		||||
        assert(password != null);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,14 +1,13 @@
 | 
			
		||||
import 'package:comunic/helpers/database/database_contract.dart';
 | 
			
		||||
import 'package:meta/meta.dart';
 | 
			
		||||
 | 
			
		||||
/// Cache base model
 | 
			
		||||
///
 | 
			
		||||
/// @author Pierre HUBERT
 | 
			
		||||
 | 
			
		||||
abstract class CacheModel {
 | 
			
		||||
  final int/*!*/ id;
 | 
			
		||||
  final int id;
 | 
			
		||||
 | 
			
		||||
  const CacheModel({@required this.id}) : assert(id != null);
 | 
			
		||||
  const CacheModel({required this.id}) : assert(id != null);
 | 
			
		||||
 | 
			
		||||
  /// Initialize a CacheModel from a map
 | 
			
		||||
  CacheModel.fromMap(Map<String, dynamic> map)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,14 +1,14 @@
 | 
			
		||||
import 'package:flutter/material.dart';
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// Call configuration
 | 
			
		||||
///
 | 
			
		||||
/// @author Pierre Hubert
 | 
			
		||||
 | 
			
		||||
class CallConfig {
 | 
			
		||||
  final List<String>/*!*/ iceServers;
 | 
			
		||||
  final List<String> iceServers;
 | 
			
		||||
 | 
			
		||||
  const CallConfig({
 | 
			
		||||
    @required this.iceServers,
 | 
			
		||||
    required this.iceServers,
 | 
			
		||||
  }) : assert(iceServers != null);
 | 
			
		||||
 | 
			
		||||
  /// Turn this call configuration into the right for the WebRTC plugin
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,3 @@
 | 
			
		||||
import 'package:flutter/material.dart';
 | 
			
		||||
import 'package:flutter_webrtc/flutter_webrtc.dart';
 | 
			
		||||
 | 
			
		||||
/// Single call member information
 | 
			
		||||
@@ -8,16 +7,16 @@ import 'package:flutter_webrtc/flutter_webrtc.dart';
 | 
			
		||||
enum MemberStatus { JOINED, READY }
 | 
			
		||||
 | 
			
		||||
class CallMember {
 | 
			
		||||
  final int/*!*/ userID;
 | 
			
		||||
  MemberStatus/*!*/ status;
 | 
			
		||||
  MediaStream stream;
 | 
			
		||||
  final int userID;
 | 
			
		||||
  MemberStatus status;
 | 
			
		||||
  MediaStream? stream;
 | 
			
		||||
 | 
			
		||||
  CallMember({
 | 
			
		||||
    @required this.userID,
 | 
			
		||||
    required this.userID,
 | 
			
		||||
    this.status = MemberStatus.JOINED,
 | 
			
		||||
  })  : assert(userID != null),
 | 
			
		||||
        assert(status != null);
 | 
			
		||||
 | 
			
		||||
  bool get hasVideoStream =>
 | 
			
		||||
      stream != null && stream.getVideoTracks().length > 0;
 | 
			
		||||
      stream != null && stream!.getVideoTracks().length > 0;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,6 @@ import 'package:comunic/enums/likes_type.dart';
 | 
			
		||||
import 'package:comunic/models/displayed_content.dart';
 | 
			
		||||
import 'package:comunic/models/like_element.dart';
 | 
			
		||||
import 'package:comunic/utils/account_utils.dart' as account;
 | 
			
		||||
import 'package:meta/meta.dart';
 | 
			
		||||
 | 
			
		||||
/// Comments
 | 
			
		||||
///
 | 
			
		||||
@@ -11,24 +10,24 @@ import 'package:meta/meta.dart';
 | 
			
		||||
/// @author Pierre HUBERT
 | 
			
		||||
 | 
			
		||||
class Comment implements LikeElement {
 | 
			
		||||
  final int/*!*/ id;
 | 
			
		||||
  final int/*!*/ userID;
 | 
			
		||||
  final int/*!*/ postID;
 | 
			
		||||
  final int/*!*/ timeSent;
 | 
			
		||||
  DisplayedString/*!*/ content;
 | 
			
		||||
  final String imageURL;
 | 
			
		||||
  int/*!*/ likes;
 | 
			
		||||
  bool/*!*/ userLike;
 | 
			
		||||
  final int id;
 | 
			
		||||
  final int userID;
 | 
			
		||||
  final int postID;
 | 
			
		||||
  final int timeSent;
 | 
			
		||||
  DisplayedString content;
 | 
			
		||||
  final String? imageURL;
 | 
			
		||||
  int likes;
 | 
			
		||||
  bool userLike;
 | 
			
		||||
 | 
			
		||||
  Comment({
 | 
			
		||||
    @required this.id,
 | 
			
		||||
    @required this.userID,
 | 
			
		||||
    @required this.postID,
 | 
			
		||||
    @required this.timeSent,
 | 
			
		||||
    @required this.content,
 | 
			
		||||
    @required this.imageURL,
 | 
			
		||||
    @required this.likes,
 | 
			
		||||
    @required this.userLike,
 | 
			
		||||
    required this.id,
 | 
			
		||||
    required this.userID,
 | 
			
		||||
    required this.postID,
 | 
			
		||||
    required this.timeSent,
 | 
			
		||||
    required this.content,
 | 
			
		||||
    required this.imageURL,
 | 
			
		||||
    required this.likes,
 | 
			
		||||
    required this.userLike,
 | 
			
		||||
  })  : assert(id != null),
 | 
			
		||||
        assert(userID != null),
 | 
			
		||||
        assert(postID != null),
 | 
			
		||||
 
 | 
			
		||||
@@ -16,27 +16,27 @@ class Config {
 | 
			
		||||
 | 
			
		||||
  // Theme customization
 | 
			
		||||
  final Color splashBackgroundColor;
 | 
			
		||||
  final Color primaryColor;
 | 
			
		||||
  final Color primaryColorDark;
 | 
			
		||||
  final Color? primaryColor;
 | 
			
		||||
  final Color? primaryColorDark;
 | 
			
		||||
  final String appName;
 | 
			
		||||
  final String appQuickDescription;
 | 
			
		||||
  final Color unreadConversationColor;
 | 
			
		||||
  final Color defaultConversationColor;
 | 
			
		||||
  final String? appQuickDescription;
 | 
			
		||||
  final Color? unreadConversationColor;
 | 
			
		||||
  final Color? defaultConversationColor;
 | 
			
		||||
 | 
			
		||||
  // Entries for the welcome tour
 | 
			
		||||
  final TourEntriesBuilder toursEntriesBuilder;
 | 
			
		||||
  final TourEntriesBuilder? toursEntriesBuilder;
 | 
			
		||||
 | 
			
		||||
  // Custom initialization
 | 
			
		||||
  final Future<void> Function() additionalLoading;
 | 
			
		||||
  final Future<void> Function()? additionalLoading;
 | 
			
		||||
 | 
			
		||||
  // Custom main application route
 | 
			
		||||
  final Widget Function(BuildContext, GlobalKey) mainRouteBuilder;
 | 
			
		||||
  final Widget Function(BuildContext, GlobalKey)? mainRouteBuilder;
 | 
			
		||||
 | 
			
		||||
  const Config({
 | 
			
		||||
    @required this.apiServerName,
 | 
			
		||||
    @required this.apiServerUri,
 | 
			
		||||
    @required this.apiServerSecure,
 | 
			
		||||
    @required this.clientName,
 | 
			
		||||
    required this.apiServerName,
 | 
			
		||||
    required this.apiServerUri,
 | 
			
		||||
    required this.apiServerSecure,
 | 
			
		||||
    required this.clientName,
 | 
			
		||||
    this.splashBackgroundColor = defaultColor,
 | 
			
		||||
    this.primaryColor,
 | 
			
		||||
    this.primaryColorDark,
 | 
			
		||||
@@ -55,9 +55,9 @@ class Config {
 | 
			
		||||
        assert(appName != null);
 | 
			
		||||
 | 
			
		||||
  /// Get and set static configuration
 | 
			
		||||
  static Config/*?*/ _config;
 | 
			
		||||
  static Config? _config;
 | 
			
		||||
 | 
			
		||||
  static Config get() {
 | 
			
		||||
  static Config? get() {
 | 
			
		||||
    return _config;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -67,6 +67,6 @@ class Config {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// Get the current configuration of the application
 | 
			
		||||
Config/*!*/ config() {
 | 
			
		||||
  return Config.get();
 | 
			
		||||
Config config() {
 | 
			
		||||
  return Config.get()!;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +1,4 @@
 | 
			
		||||
import 'package:collection/collection.dart' show IterableExtension;
 | 
			
		||||
import 'package:comunic/helpers/serialization/base_serialization_helper.dart';
 | 
			
		||||
import 'package:comunic/models/conversation_member.dart';
 | 
			
		||||
import 'package:comunic/utils/account_utils.dart';
 | 
			
		||||
@@ -12,28 +13,28 @@ import 'group.dart';
 | 
			
		||||
enum CallCapabilities { NONE, AUDIO, VIDEO }
 | 
			
		||||
 | 
			
		||||
class Conversation extends SerializableElement<Conversation> {
 | 
			
		||||
  final int id;
 | 
			
		||||
  final int lastActivity;
 | 
			
		||||
  final String name;
 | 
			
		||||
  final Color color;
 | 
			
		||||
  final String logoURL;
 | 
			
		||||
  final int groupID;
 | 
			
		||||
  final GroupMembershipLevel groupMinMembershipLevel;
 | 
			
		||||
  final List<ConversationMember> members;
 | 
			
		||||
  final bool canEveryoneAddMembers;
 | 
			
		||||
  final int? id;
 | 
			
		||||
  final int? lastActivity;
 | 
			
		||||
  final String? name;
 | 
			
		||||
  final Color? color;
 | 
			
		||||
  final String? logoURL;
 | 
			
		||||
  final int? groupID;
 | 
			
		||||
  final GroupMembershipLevel? groupMinMembershipLevel;
 | 
			
		||||
  final List<ConversationMember>? members;
 | 
			
		||||
  final bool? canEveryoneAddMembers;
 | 
			
		||||
  final CallCapabilities callCapabilities;
 | 
			
		||||
  final bool isHavingCall;
 | 
			
		||||
 | 
			
		||||
  Conversation({
 | 
			
		||||
    /*required*/ @required this.id,
 | 
			
		||||
    /*required*/ @required this.lastActivity,
 | 
			
		||||
    @required this.name,
 | 
			
		||||
    @required this.color,
 | 
			
		||||
    @required this.logoURL,
 | 
			
		||||
    @required this.groupID,
 | 
			
		||||
    @required this.groupMinMembershipLevel,
 | 
			
		||||
    /*required*/ @required this.members,
 | 
			
		||||
    /*required*/ @required this.canEveryoneAddMembers,
 | 
			
		||||
    /*required*/ required int this.id,
 | 
			
		||||
    /*required*/ required int this.lastActivity,
 | 
			
		||||
    required this.name,
 | 
			
		||||
    required this.color,
 | 
			
		||||
    required this.logoURL,
 | 
			
		||||
    required this.groupID,
 | 
			
		||||
    required this.groupMinMembershipLevel,
 | 
			
		||||
    /*required*/ required List<ConversationMember> this.members,
 | 
			
		||||
    /*required*/ required bool this.canEveryoneAddMembers,
 | 
			
		||||
    this.callCapabilities = CallCapabilities.NONE,
 | 
			
		||||
    this.isHavingCall = false,
 | 
			
		||||
  })  : assert(id != null),
 | 
			
		||||
@@ -49,7 +50,7 @@ class Conversation extends SerializableElement<Conversation> {
 | 
			
		||||
 | 
			
		||||
  /// Get current user membership
 | 
			
		||||
  ConversationMember get membership =>
 | 
			
		||||
      members.firstWhere((m) => m.userID == userID());
 | 
			
		||||
      members!.firstWhere((m) => m.userID == userID());
 | 
			
		||||
 | 
			
		||||
  /// Check out whether current user of the application is an admin
 | 
			
		||||
  bool get isAdmin => membership.isAdmin;
 | 
			
		||||
@@ -61,17 +62,17 @@ class Conversation extends SerializableElement<Conversation> {
 | 
			
		||||
  bool get following => membership.following;
 | 
			
		||||
 | 
			
		||||
  /// Get the list of members in the conversation
 | 
			
		||||
  Set<int> get membersID => members.map((e) => e.userID).toSet();
 | 
			
		||||
  Set<int?> get membersID => members!.map((e) => e.userID).toSet();
 | 
			
		||||
 | 
			
		||||
  /// Get the list of admins in the conversation
 | 
			
		||||
  Set<int> get adminsID =>
 | 
			
		||||
      members.where((e) => e.isAdmin).map((e) => e.userID).toSet();
 | 
			
		||||
  Set<int?> get adminsID =>
 | 
			
		||||
      members!.where((e) => e.isAdmin).map((e) => e.userID).toSet();
 | 
			
		||||
 | 
			
		||||
  /// Get the list of the OTHER members of the conversation (all except current user)
 | 
			
		||||
  Set<int> get otherMembersID => membersID..remove(userID());
 | 
			
		||||
  Set<int?> get otherMembersID => membersID..remove(userID());
 | 
			
		||||
 | 
			
		||||
  /// Check if the last message has been seen or not
 | 
			
		||||
  bool get sawLastMessage => lastActivity <= membership.lastAccessTime;
 | 
			
		||||
  bool get sawLastMessage => lastActivity! <= membership.lastAccessTime;
 | 
			
		||||
 | 
			
		||||
  /// Check out whether a conversation is managed or not
 | 
			
		||||
  bool get isManaged => isGroupConversation;
 | 
			
		||||
@@ -86,9 +87,8 @@ class Conversation extends SerializableElement<Conversation> {
 | 
			
		||||
        color = map["color"] == null ? null : Color(map["color"]),
 | 
			
		||||
        logoURL = map["logoURL"],
 | 
			
		||||
        groupID = map["groupID"],
 | 
			
		||||
        groupMinMembershipLevel = GroupMembershipLevel.values.firstWhere(
 | 
			
		||||
            (element) => element.toString() == map["groupMinMembershipLevel"],
 | 
			
		||||
            orElse: () => null),
 | 
			
		||||
        groupMinMembershipLevel = GroupMembershipLevel.values.firstWhereOrNull(
 | 
			
		||||
            (element) => element.toString() == map["groupMinMembershipLevel"]),
 | 
			
		||||
        lastActivity = map["lastActivity"],
 | 
			
		||||
        members = map["members"]
 | 
			
		||||
            .map((el) => ConversationMember.fromJSON(el))
 | 
			
		||||
@@ -109,13 +109,13 @@ class Conversation extends SerializableElement<Conversation> {
 | 
			
		||||
      "groupID": groupID,
 | 
			
		||||
      "groupMinMembershipLevel": groupMinMembershipLevel?.toString(),
 | 
			
		||||
      "lastActivity": lastActivity,
 | 
			
		||||
      "members": members.map((e) => e.toJson()).toList(),
 | 
			
		||||
      "members": members!.map((e) => e.toJson()).toList(),
 | 
			
		||||
      "canEveryoneAddMembers": canEveryoneAddMembers,
 | 
			
		||||
    };
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @override
 | 
			
		||||
  int compareTo(Conversation other) {
 | 
			
		||||
    return other.lastActivity.compareTo(this.lastActivity);
 | 
			
		||||
    return other.lastActivity!.compareTo(this.lastActivity!);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,22 +1,22 @@
 | 
			
		||||
import 'package:flutter/widgets.dart';
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// Conversation member
 | 
			
		||||
///
 | 
			
		||||
/// @author Pierre Hubert
 | 
			
		||||
 | 
			
		||||
class ConversationMember {
 | 
			
		||||
  final int/*!*/ userID;
 | 
			
		||||
  final int/*!*/ lastMessageSeen;
 | 
			
		||||
  final int/*!*/ lastAccessTime;
 | 
			
		||||
  final bool/*!*/ following;
 | 
			
		||||
  final bool/*!*/ isAdmin;
 | 
			
		||||
  final int userID;
 | 
			
		||||
  final int lastMessageSeen;
 | 
			
		||||
  final int lastAccessTime;
 | 
			
		||||
  final bool following;
 | 
			
		||||
  final bool isAdmin;
 | 
			
		||||
 | 
			
		||||
  const ConversationMember({
 | 
			
		||||
    /*required*/ @required this.userID,
 | 
			
		||||
    /*required*/ @required this.lastMessageSeen,
 | 
			
		||||
    /*required*/ @required this.lastAccessTime,
 | 
			
		||||
    /*required*/ @required this.following,
 | 
			
		||||
    /*required*/ @required this.isAdmin,
 | 
			
		||||
    /*required*/ required this.userID,
 | 
			
		||||
    /*required*/ required this.lastMessageSeen,
 | 
			
		||||
    /*required*/ required this.lastAccessTime,
 | 
			
		||||
    /*required*/ required this.following,
 | 
			
		||||
    /*required*/ required this.isAdmin,
 | 
			
		||||
  })  : assert(userID != null),
 | 
			
		||||
        assert(lastMessageSeen != null),
 | 
			
		||||
        assert(lastAccessTime != null),
 | 
			
		||||
 
 | 
			
		||||
@@ -30,27 +30,27 @@ const _ConversationFileMimeTypeMapping = {
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class ConversationMessageFile {
 | 
			
		||||
  final String url;
 | 
			
		||||
  final int size;
 | 
			
		||||
  final String name;
 | 
			
		||||
  final String thumbnail;
 | 
			
		||||
  final String type;
 | 
			
		||||
  final String? url;
 | 
			
		||||
  final int? size;
 | 
			
		||||
  final String? name;
 | 
			
		||||
  final String? thumbnail;
 | 
			
		||||
  final String? type;
 | 
			
		||||
 | 
			
		||||
  const ConversationMessageFile({
 | 
			
		||||
    @required this.url,
 | 
			
		||||
    @required this.size,
 | 
			
		||||
    @required this.name,
 | 
			
		||||
    @required this.thumbnail,
 | 
			
		||||
    @required this.type,
 | 
			
		||||
    required String this.url,
 | 
			
		||||
    required int this.size,
 | 
			
		||||
    required String this.name,
 | 
			
		||||
    required this.thumbnail,
 | 
			
		||||
    required String this.type,
 | 
			
		||||
  })  : assert(url != null),
 | 
			
		||||
        assert(size != null),
 | 
			
		||||
        assert(name != null),
 | 
			
		||||
        assert(type != null);
 | 
			
		||||
 | 
			
		||||
  /// Get the type of file
 | 
			
		||||
  ConversationMessageFileType get fileType {
 | 
			
		||||
  ConversationMessageFileType? get fileType {
 | 
			
		||||
    if (type != null && _ConversationFileMimeTypeMapping.containsKey(type))
 | 
			
		||||
      return _ConversationFileMimeTypeMapping[type];
 | 
			
		||||
      return _ConversationFileMimeTypeMapping[type!];
 | 
			
		||||
    else
 | 
			
		||||
      return ConversationMessageFileType.OTHER;
 | 
			
		||||
  }
 | 
			
		||||
@@ -102,19 +102,19 @@ enum ConversationServerMessageType {
 | 
			
		||||
 | 
			
		||||
class ConversationServerMessage {
 | 
			
		||||
  final ConversationServerMessageType type;
 | 
			
		||||
  final int userID;
 | 
			
		||||
  final int userWhoAdded;
 | 
			
		||||
  final int userAdded;
 | 
			
		||||
  final int userWhoRemoved;
 | 
			
		||||
  final int userRemoved;
 | 
			
		||||
  final int? userID;
 | 
			
		||||
  final int? userWhoAdded;
 | 
			
		||||
  final int? userAdded;
 | 
			
		||||
  final int? userWhoRemoved;
 | 
			
		||||
  final int? userRemoved;
 | 
			
		||||
 | 
			
		||||
  const ConversationServerMessage({
 | 
			
		||||
    @required this.type,
 | 
			
		||||
    @required this.userID,
 | 
			
		||||
    @required this.userWhoAdded,
 | 
			
		||||
    @required this.userAdded,
 | 
			
		||||
    @required this.userWhoRemoved,
 | 
			
		||||
    @required this.userRemoved,
 | 
			
		||||
    required this.type,
 | 
			
		||||
    required this.userID,
 | 
			
		||||
    required this.userWhoAdded,
 | 
			
		||||
    required this.userAdded,
 | 
			
		||||
    required this.userWhoRemoved,
 | 
			
		||||
    required this.userRemoved,
 | 
			
		||||
  })  : assert(type != null),
 | 
			
		||||
        assert(userID != null ||
 | 
			
		||||
            (type != ConversationServerMessageType.USER_CREATED_CONVERSATION &&
 | 
			
		||||
@@ -124,7 +124,7 @@ class ConversationServerMessage {
 | 
			
		||||
        assert((userWhoRemoved != null && userRemoved != null) ||
 | 
			
		||||
            type != ConversationServerMessageType.USER_REMOVED_ANOTHER_USER);
 | 
			
		||||
 | 
			
		||||
  Set<int> get usersID {
 | 
			
		||||
  Set<int?> get usersID {
 | 
			
		||||
    switch (type) {
 | 
			
		||||
      case ConversationServerMessageType.USER_CREATED_CONVERSATION:
 | 
			
		||||
      case ConversationServerMessageType.USER_LEFT_CONV:
 | 
			
		||||
@@ -144,26 +144,26 @@ class ConversationServerMessage {
 | 
			
		||||
    throw Exception("Unsupported server message type!");
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  String getText(UsersList list) {
 | 
			
		||||
  String? getText(UsersList? list) {
 | 
			
		||||
    switch (type) {
 | 
			
		||||
      case ConversationServerMessageType.USER_CREATED_CONVERSATION:
 | 
			
		||||
        return tr("%1% created the conversation",
 | 
			
		||||
            args: {"1": list.getUser(userID).fullName});
 | 
			
		||||
            args: {"1": list!.getUser(userID).fullName});
 | 
			
		||||
 | 
			
		||||
      case ConversationServerMessageType.USER_ADDED_ANOTHER_USER:
 | 
			
		||||
        return tr("%1% added %2% to the conversation", args: {
 | 
			
		||||
          "1": list.getUser(userWhoAdded).fullName,
 | 
			
		||||
          "1": list!.getUser(userWhoAdded).fullName,
 | 
			
		||||
          "2": list.getUser(userAdded).fullName,
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
      case ConversationServerMessageType.USER_LEFT_CONV:
 | 
			
		||||
        return tr("%1% left the conversation", args: {
 | 
			
		||||
          "1": list.getUser(userID).fullName,
 | 
			
		||||
          "1": list!.getUser(userID).fullName,
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
      case ConversationServerMessageType.USER_REMOVED_ANOTHER_USER:
 | 
			
		||||
        return tr("%1% removed %2% from the conversation", args: {
 | 
			
		||||
          "1": list.getUser(userWhoRemoved).fullName,
 | 
			
		||||
          "1": list!.getUser(userWhoRemoved).fullName,
 | 
			
		||||
          "2": list.getUser(userRemoved).fullName,
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
@@ -191,29 +191,29 @@ class ConversationServerMessage {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class ConversationMessage extends SerializableElement<ConversationMessage> {
 | 
			
		||||
  final int id;
 | 
			
		||||
  final int convID;
 | 
			
		||||
  final int userID;
 | 
			
		||||
  final int timeSent;
 | 
			
		||||
  final int? id;
 | 
			
		||||
  final int? convID;
 | 
			
		||||
  final int? userID;
 | 
			
		||||
  final int? timeSent;
 | 
			
		||||
  final DisplayedString message;
 | 
			
		||||
  final ConversationMessageFile file;
 | 
			
		||||
  final ConversationServerMessage serverMessage;
 | 
			
		||||
  final ConversationMessageFile? file;
 | 
			
		||||
  final ConversationServerMessage? serverMessage;
 | 
			
		||||
 | 
			
		||||
  ConversationMessage({
 | 
			
		||||
    @required this.id,
 | 
			
		||||
    @required this.convID,
 | 
			
		||||
    @required this.userID,
 | 
			
		||||
    @required this.timeSent,
 | 
			
		||||
    @required this.message,
 | 
			
		||||
    @required this.file,
 | 
			
		||||
    @required this.serverMessage,
 | 
			
		||||
    required int this.id,
 | 
			
		||||
    required int this.convID,
 | 
			
		||||
    required this.userID,
 | 
			
		||||
    required int this.timeSent,
 | 
			
		||||
    required this.message,
 | 
			
		||||
    required this.file,
 | 
			
		||||
    required this.serverMessage,
 | 
			
		||||
  })  : assert(id != null),
 | 
			
		||||
        assert(convID != null),
 | 
			
		||||
        assert(userID != null || serverMessage != null),
 | 
			
		||||
        assert(timeSent != null),
 | 
			
		||||
        assert(message != null || file != null || serverMessage != null);
 | 
			
		||||
 | 
			
		||||
  DateTime get date => DateTime.fromMillisecondsSinceEpoch(timeSent * 1000);
 | 
			
		||||
  DateTime get date => DateTime.fromMillisecondsSinceEpoch(timeSent! * 1000);
 | 
			
		||||
 | 
			
		||||
  bool get hasMessage => !message.isNull && message.length > 0;
 | 
			
		||||
 | 
			
		||||
@@ -224,16 +224,16 @@ class ConversationMessage extends SerializableElement<ConversationMessage> {
 | 
			
		||||
  bool get isServerMessage => serverMessage != null;
 | 
			
		||||
 | 
			
		||||
  /// Get the list of the ID of the users implied in this message
 | 
			
		||||
  Set<int> get usersID {
 | 
			
		||||
  Set<int?> get usersID {
 | 
			
		||||
    if (userID != null) return Set()..add(userID);
 | 
			
		||||
 | 
			
		||||
    if (serverMessage != null) return serverMessage.usersID;
 | 
			
		||||
    if (serverMessage != null) return serverMessage!.usersID;
 | 
			
		||||
    return Set();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @override
 | 
			
		||||
  int compareTo(ConversationMessage other) {
 | 
			
		||||
    return id.compareTo(other.id);
 | 
			
		||||
    return id!.compareTo(other.id!);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  Map<String, dynamic> toJson() {
 | 
			
		||||
 
 | 
			
		||||
@@ -3,12 +3,12 @@
 | 
			
		||||
/// @author Pierre Hubert
 | 
			
		||||
 | 
			
		||||
class CountUnreadNotifications {
 | 
			
		||||
  int notifications;
 | 
			
		||||
  int conversations;
 | 
			
		||||
  int? notifications;
 | 
			
		||||
  int? conversations;
 | 
			
		||||
 | 
			
		||||
  CountUnreadNotifications({
 | 
			
		||||
    this.notifications,
 | 
			
		||||
    this.conversations,
 | 
			
		||||
    required int this.notifications,
 | 
			
		||||
    required int this.conversations,
 | 
			
		||||
  })  : assert(notifications != null),
 | 
			
		||||
        assert(conversations != null);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +1,20 @@
 | 
			
		||||
import 'package:flutter/material.dart';
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// Single custom emoji information
 | 
			
		||||
///
 | 
			
		||||
/// @author Pierre Hubert
 | 
			
		||||
 | 
			
		||||
class CustomEmoji {
 | 
			
		||||
  final int id;
 | 
			
		||||
  final int userID;
 | 
			
		||||
  final String shortcut;
 | 
			
		||||
  final String url;
 | 
			
		||||
  final int? id;
 | 
			
		||||
  final int? userID;
 | 
			
		||||
  final String? shortcut;
 | 
			
		||||
  final String? url;
 | 
			
		||||
 | 
			
		||||
  const CustomEmoji({
 | 
			
		||||
    @required this.id,
 | 
			
		||||
    @required this.userID,
 | 
			
		||||
    @required this.shortcut,
 | 
			
		||||
    @required this.url,
 | 
			
		||||
    required int this.id,
 | 
			
		||||
    required int this.userID,
 | 
			
		||||
    required String this.shortcut,
 | 
			
		||||
    required String this.url,
 | 
			
		||||
  })  : assert(id != null),
 | 
			
		||||
        assert(userID != null),
 | 
			
		||||
        assert(shortcut != null),
 | 
			
		||||
 
 | 
			
		||||
@@ -3,12 +3,12 @@
 | 
			
		||||
/// @author Pierre Hubert
 | 
			
		||||
 | 
			
		||||
class DataConservationPolicySettings {
 | 
			
		||||
  int inactiveAccountLifeTime;
 | 
			
		||||
  int notificationLifetime;
 | 
			
		||||
  int commentsLifetime;
 | 
			
		||||
  int postsLifetime;
 | 
			
		||||
  int conversationMessagesLifetime;
 | 
			
		||||
  int likesLifetime;
 | 
			
		||||
  int? inactiveAccountLifeTime;
 | 
			
		||||
  int? notificationLifetime;
 | 
			
		||||
  int? commentsLifetime;
 | 
			
		||||
  int? postsLifetime;
 | 
			
		||||
  int? conversationMessagesLifetime;
 | 
			
		||||
  int? likesLifetime;
 | 
			
		||||
 | 
			
		||||
  DataConservationPolicySettings({
 | 
			
		||||
    this.inactiveAccountLifeTime,
 | 
			
		||||
 
 | 
			
		||||
@@ -5,32 +5,32 @@ import 'package:comunic/utils/ui_utils.dart';
 | 
			
		||||
/// @author Pierre Hubert
 | 
			
		||||
 | 
			
		||||
class DisplayedString {
 | 
			
		||||
  String _string;
 | 
			
		||||
  String _parseCache;
 | 
			
		||||
  String? _string;
 | 
			
		||||
  String? _parseCache;
 | 
			
		||||
 | 
			
		||||
  DisplayedString(this._string);
 | 
			
		||||
 | 
			
		||||
  int get length => _string.length;
 | 
			
		||||
  int get length => _string!.length;
 | 
			
		||||
 | 
			
		||||
  bool get isEmpty => _string.isEmpty;
 | 
			
		||||
  bool get isEmpty => _string!.isEmpty;
 | 
			
		||||
 | 
			
		||||
  bool get isNull => _string == null;
 | 
			
		||||
 | 
			
		||||
  String get content => _string;
 | 
			
		||||
  String? get content => _string;
 | 
			
		||||
 | 
			
		||||
  set content(String content) {
 | 
			
		||||
  set content(String? content) {
 | 
			
		||||
    _string = content;
 | 
			
		||||
    _parseCache = null;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @override
 | 
			
		||||
  String toString() {
 | 
			
		||||
    return _string;
 | 
			
		||||
    return _string!;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  String get parsedString {
 | 
			
		||||
  String? get parsedString {
 | 
			
		||||
    if (_parseCache == null) {
 | 
			
		||||
      _parseCache = parseEmojies(this._string);
 | 
			
		||||
      _parseCache = parseEmojies(this._string!);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return _parseCache;
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
import 'package:flutter/material.dart';
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// Single presence information
 | 
			
		||||
///
 | 
			
		||||
@@ -11,10 +11,10 @@ class Presence {
 | 
			
		||||
  final int day;
 | 
			
		||||
 | 
			
		||||
  const Presence({
 | 
			
		||||
    @required this.userID,
 | 
			
		||||
    @required this.year,
 | 
			
		||||
    @required this.month,
 | 
			
		||||
    @required this.day,
 | 
			
		||||
    required this.userID,
 | 
			
		||||
    required this.year,
 | 
			
		||||
    required this.month,
 | 
			
		||||
    required this.day,
 | 
			
		||||
  })  : assert(userID != null),
 | 
			
		||||
        assert(year != null),
 | 
			
		||||
        assert(month != null),
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,6 @@
 | 
			
		||||
import 'package:comunic/helpers/database/database_contract.dart';
 | 
			
		||||
import 'package:comunic/models/cache_model.dart';
 | 
			
		||||
import 'package:comunic/utils/date_utils.dart';
 | 
			
		||||
import 'package:meta/meta.dart';
 | 
			
		||||
 | 
			
		||||
/// Single user Friend information
 | 
			
		||||
///
 | 
			
		||||
@@ -9,16 +8,16 @@ import 'package:meta/meta.dart';
 | 
			
		||||
 | 
			
		||||
class Friend extends CacheModel implements Comparable<Friend> {
 | 
			
		||||
  bool accepted;
 | 
			
		||||
  final int lastActive;
 | 
			
		||||
  final int? lastActive;
 | 
			
		||||
  final bool following;
 | 
			
		||||
  final bool canPostTexts;
 | 
			
		||||
 | 
			
		||||
  Friend({
 | 
			
		||||
    @required int id,
 | 
			
		||||
    @required this.accepted,
 | 
			
		||||
    @required this.lastActive,
 | 
			
		||||
    @required this.following,
 | 
			
		||||
    @required this.canPostTexts,
 | 
			
		||||
    required int id,
 | 
			
		||||
    required this.accepted,
 | 
			
		||||
    required int this.lastActive,
 | 
			
		||||
    required this.following,
 | 
			
		||||
    required this.canPostTexts,
 | 
			
		||||
  })  : assert(id != null),
 | 
			
		||||
        assert(accepted != null),
 | 
			
		||||
        assert(lastActive != null),
 | 
			
		||||
@@ -27,10 +26,10 @@ class Friend extends CacheModel implements Comparable<Friend> {
 | 
			
		||||
        super(id: id);
 | 
			
		||||
 | 
			
		||||
  /// Check out whether friend is connected or not
 | 
			
		||||
  bool get isConnected => time() - 30 < lastActive;
 | 
			
		||||
  bool get isConnected => time() - 30 < lastActive!;
 | 
			
		||||
 | 
			
		||||
  @override
 | 
			
		||||
  int compareTo(Friend other) => other.lastActive.compareTo(lastActive);
 | 
			
		||||
  int compareTo(Friend other) => other.lastActive!.compareTo(lastActive!);
 | 
			
		||||
 | 
			
		||||
  @override
 | 
			
		||||
  Map<String, dynamic> toMap() => {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
import 'package:meta/meta.dart';
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// Simple friendship status
 | 
			
		||||
///
 | 
			
		||||
@@ -12,11 +12,11 @@ class FriendStatus {
 | 
			
		||||
  final bool following;
 | 
			
		||||
 | 
			
		||||
  const FriendStatus({
 | 
			
		||||
    @required this.userID,
 | 
			
		||||
    @required this.areFriend,
 | 
			
		||||
    @required this.sentRequest,
 | 
			
		||||
    @required this.receivedRequest,
 | 
			
		||||
    @required this.following,
 | 
			
		||||
    required this.userID,
 | 
			
		||||
    required this.areFriend,
 | 
			
		||||
    required this.sentRequest,
 | 
			
		||||
    required this.receivedRequest,
 | 
			
		||||
    required this.following,
 | 
			
		||||
  })  : assert(userID != null),
 | 
			
		||||
        assert(areFriend != null),
 | 
			
		||||
        assert(sentRequest != null),
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,4 @@
 | 
			
		||||
import 'package:comunic/enums/user_page_visibility.dart';
 | 
			
		||||
import 'package:flutter/material.dart';
 | 
			
		||||
 | 
			
		||||
/// General settings
 | 
			
		||||
///
 | 
			
		||||
@@ -18,22 +17,22 @@ class GeneralSettings {
 | 
			
		||||
  String virtualDirectory;
 | 
			
		||||
  String personalWebsite;
 | 
			
		||||
  String publicNote;
 | 
			
		||||
  String location;
 | 
			
		||||
  String? location;
 | 
			
		||||
 | 
			
		||||
  GeneralSettings({
 | 
			
		||||
    @required this.email,
 | 
			
		||||
    @required this.firstName,
 | 
			
		||||
    @required this.lastName,
 | 
			
		||||
    @required this.pageVisibility,
 | 
			
		||||
    @required this.allowComments,
 | 
			
		||||
    @required this.allowPostsFromFriends,
 | 
			
		||||
    @required this.allowComunicEmails,
 | 
			
		||||
    @required this.publicFriendsList,
 | 
			
		||||
    @required this.publicEmail,
 | 
			
		||||
    @required this.virtualDirectory,
 | 
			
		||||
    @required this.personalWebsite,
 | 
			
		||||
    @required this.publicNote,
 | 
			
		||||
    @required this.location,
 | 
			
		||||
    required this.email,
 | 
			
		||||
    required this.firstName,
 | 
			
		||||
    required this.lastName,
 | 
			
		||||
    required this.pageVisibility,
 | 
			
		||||
    required this.allowComments,
 | 
			
		||||
    required this.allowPostsFromFriends,
 | 
			
		||||
    required this.allowComunicEmails,
 | 
			
		||||
    required this.publicFriendsList,
 | 
			
		||||
    required this.publicEmail,
 | 
			
		||||
    required this.virtualDirectory,
 | 
			
		||||
    required this.personalWebsite,
 | 
			
		||||
    required this.publicNote,
 | 
			
		||||
    required this.location,
 | 
			
		||||
  })  : assert(email != null),
 | 
			
		||||
        assert(firstName != null),
 | 
			
		||||
        assert(lastName != null),
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,4 @@
 | 
			
		||||
import 'package:comunic/utils/intl_utils.dart';
 | 
			
		||||
import 'package:meta/meta.dart';
 | 
			
		||||
 | 
			
		||||
/// Group information
 | 
			
		||||
///
 | 
			
		||||
@@ -14,20 +13,20 @@ enum GroupMembershipLevel {
 | 
			
		||||
  VISITOR
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
String/*!*/ membershipToText(GroupMembershipLevel level) {
 | 
			
		||||
String membershipToText(GroupMembershipLevel level) {
 | 
			
		||||
  switch (level) {
 | 
			
		||||
    case GroupMembershipLevel.ADMINISTRATOR:
 | 
			
		||||
      return tr("Administrator");
 | 
			
		||||
      return tr("Administrator")!;
 | 
			
		||||
    case GroupMembershipLevel.MODERATOR:
 | 
			
		||||
      return tr("Moderator");
 | 
			
		||||
      return tr("Moderator")!;
 | 
			
		||||
    case GroupMembershipLevel.MEMBER:
 | 
			
		||||
      return tr("Member");
 | 
			
		||||
      return tr("Member")!;
 | 
			
		||||
    case GroupMembershipLevel.INVITED:
 | 
			
		||||
      return tr("Invited");
 | 
			
		||||
      return tr("Invited")!;
 | 
			
		||||
    case GroupMembershipLevel.PENDING:
 | 
			
		||||
      return tr("Requested");
 | 
			
		||||
      return tr("Requested")!;
 | 
			
		||||
    case GroupMembershipLevel.VISITOR:
 | 
			
		||||
      return tr("Visitor");
 | 
			
		||||
      return tr("Visitor")!;
 | 
			
		||||
  }
 | 
			
		||||
  throw new Exception("Unreachable statement!");
 | 
			
		||||
}
 | 
			
		||||
@@ -51,16 +50,16 @@ class Group implements Comparable<Group> {
 | 
			
		||||
  bool following;
 | 
			
		||||
 | 
			
		||||
  Group({
 | 
			
		||||
    @required this.id,
 | 
			
		||||
    @required this.name,
 | 
			
		||||
    @required this.iconURL,
 | 
			
		||||
    @required this.numberMembers,
 | 
			
		||||
    @required this.membershipLevel,
 | 
			
		||||
    @required this.visibilityLevel,
 | 
			
		||||
    @required this.registrationLevel,
 | 
			
		||||
    @required this.postCreationLevel,
 | 
			
		||||
    @required this.virtualDirectory,
 | 
			
		||||
    @required this.following,
 | 
			
		||||
    required this.id,
 | 
			
		||||
    required this.name,
 | 
			
		||||
    required this.iconURL,
 | 
			
		||||
    required this.numberMembers,
 | 
			
		||||
    required this.membershipLevel,
 | 
			
		||||
    required this.visibilityLevel,
 | 
			
		||||
    required this.registrationLevel,
 | 
			
		||||
    required this.postCreationLevel,
 | 
			
		||||
    required this.virtualDirectory,
 | 
			
		||||
    required this.following,
 | 
			
		||||
  })  : assert(id != null),
 | 
			
		||||
        assert(name != null),
 | 
			
		||||
        assert(iconURL != null),
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,4 @@
 | 
			
		||||
import 'package:comunic/models/group.dart';
 | 
			
		||||
import 'package:flutter/material.dart';
 | 
			
		||||
 | 
			
		||||
/// Group membership information
 | 
			
		||||
///
 | 
			
		||||
@@ -12,10 +11,10 @@ class GroupMembership {
 | 
			
		||||
  final GroupMembershipLevel level;
 | 
			
		||||
 | 
			
		||||
  const GroupMembership({
 | 
			
		||||
    @required this.userID,
 | 
			
		||||
    @required this.groupID,
 | 
			
		||||
    @required this.timeCreate,
 | 
			
		||||
    @required this.level,
 | 
			
		||||
    required this.userID,
 | 
			
		||||
    required this.groupID,
 | 
			
		||||
    required this.timeCreate,
 | 
			
		||||
    required this.level,
 | 
			
		||||
  })  : assert(userID != null),
 | 
			
		||||
        assert(groupID != null),
 | 
			
		||||
        assert(timeCreate != null),
 | 
			
		||||
 
 | 
			
		||||
@@ -9,6 +9,6 @@ abstract class LikeElement {
 | 
			
		||||
 | 
			
		||||
  int get id;
 | 
			
		||||
 | 
			
		||||
  bool userLike;
 | 
			
		||||
  int likes;
 | 
			
		||||
  late bool userLike;
 | 
			
		||||
  late int likes;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,5 @@
 | 
			
		||||
import 'package:comunic/models/conversation.dart';
 | 
			
		||||
import 'package:comunic/models/friend.dart';
 | 
			
		||||
import 'package:flutter/material.dart';
 | 
			
		||||
 | 
			
		||||
/// Membership information
 | 
			
		||||
///
 | 
			
		||||
@@ -10,40 +9,40 @@ enum MembershipType { FRIEND, GROUP, CONVERSATION }
 | 
			
		||||
 | 
			
		||||
class Membership {
 | 
			
		||||
  final MembershipType type;
 | 
			
		||||
  final Conversation conversation;
 | 
			
		||||
  final Friend friend;
 | 
			
		||||
  final int groupID;
 | 
			
		||||
  final int groupLastActive;
 | 
			
		||||
  final Conversation? conversation;
 | 
			
		||||
  final Friend? friend;
 | 
			
		||||
  final int? groupID;
 | 
			
		||||
  final int? groupLastActive;
 | 
			
		||||
 | 
			
		||||
  Membership.conversation(this.conversation)
 | 
			
		||||
  Membership.conversation(Conversation this.conversation)
 | 
			
		||||
      : type = MembershipType.CONVERSATION,
 | 
			
		||||
        friend = null,
 | 
			
		||||
        groupID = null,
 | 
			
		||||
        groupLastActive = null,
 | 
			
		||||
        assert(conversation != null);
 | 
			
		||||
 | 
			
		||||
  Membership.friend(this.friend)
 | 
			
		||||
  Membership.friend(Friend this.friend)
 | 
			
		||||
      : type = MembershipType.FRIEND,
 | 
			
		||||
        conversation = null,
 | 
			
		||||
        groupID = null,
 | 
			
		||||
        groupLastActive = null,
 | 
			
		||||
        assert(friend != null);
 | 
			
		||||
 | 
			
		||||
  Membership.group({@required this.groupID, @required this.groupLastActive})
 | 
			
		||||
  Membership.group({required int this.groupID, required int this.groupLastActive})
 | 
			
		||||
      : type = MembershipType.GROUP,
 | 
			
		||||
        conversation = null,
 | 
			
		||||
        friend = null,
 | 
			
		||||
        assert(groupID != null),
 | 
			
		||||
        assert(groupLastActive != null);
 | 
			
		||||
 | 
			
		||||
  int get lastActive {
 | 
			
		||||
  int? get lastActive {
 | 
			
		||||
    switch (type) {
 | 
			
		||||
      case MembershipType.FRIEND:
 | 
			
		||||
        return friend.lastActive;
 | 
			
		||||
        return friend!.lastActive;
 | 
			
		||||
      case MembershipType.GROUP:
 | 
			
		||||
        return groupLastActive;
 | 
			
		||||
      case MembershipType.CONVERSATION:
 | 
			
		||||
        return conversation.lastActivity;
 | 
			
		||||
        return conversation!.lastActivity;
 | 
			
		||||
      default:
 | 
			
		||||
        throw Exception("Unreachable statment!");
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
import 'package:flutter/widgets.dart';
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// New account information container
 | 
			
		||||
///
 | 
			
		||||
@@ -11,10 +11,10 @@ class NewAccount {
 | 
			
		||||
  final String password;
 | 
			
		||||
 | 
			
		||||
  NewAccount({
 | 
			
		||||
    @required this.firstName,
 | 
			
		||||
    @required this.lastName,
 | 
			
		||||
    @required this.email,
 | 
			
		||||
    @required this.password,
 | 
			
		||||
    required this.firstName,
 | 
			
		||||
    required this.lastName,
 | 
			
		||||
    required this.email,
 | 
			
		||||
    required this.password,
 | 
			
		||||
  })  : assert(firstName != null),
 | 
			
		||||
        assert(lastName != null),
 | 
			
		||||
        assert(email != null),
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,3 @@
 | 
			
		||||
import 'package:meta/meta.dart';
 | 
			
		||||
 | 
			
		||||
import 'api_request.dart';
 | 
			
		||||
 | 
			
		||||
/// New comment information
 | 
			
		||||
@@ -9,12 +7,12 @@ import 'api_request.dart';
 | 
			
		||||
class NewComment {
 | 
			
		||||
  final int postID;
 | 
			
		||||
  final String content;
 | 
			
		||||
  final BytesFile image;
 | 
			
		||||
  final BytesFile? image;
 | 
			
		||||
 | 
			
		||||
  const NewComment({
 | 
			
		||||
    @required this.postID,
 | 
			
		||||
    @required this.content,
 | 
			
		||||
    @required this.image,
 | 
			
		||||
    required this.postID,
 | 
			
		||||
    required this.content,
 | 
			
		||||
    required this.image,
 | 
			
		||||
  }) : assert(postID != null);
 | 
			
		||||
 | 
			
		||||
  bool get hasContent => content != null && content.length > 0;
 | 
			
		||||
 
 | 
			
		||||
@@ -6,17 +6,17 @@ import 'package:flutter/cupertino.dart';
 | 
			
		||||
 | 
			
		||||
class NewConversation {
 | 
			
		||||
  final String name;
 | 
			
		||||
  final List<int> members;
 | 
			
		||||
  final List<int?> members;
 | 
			
		||||
  final bool follow;
 | 
			
		||||
  final bool canEveryoneAddMembers;
 | 
			
		||||
  final Color color;
 | 
			
		||||
  final Color? color;
 | 
			
		||||
 | 
			
		||||
  const NewConversation({
 | 
			
		||||
    @required this.name,
 | 
			
		||||
    @required this.members,
 | 
			
		||||
    @required this.follow,
 | 
			
		||||
    @required this.canEveryoneAddMembers,
 | 
			
		||||
    @required this.color,
 | 
			
		||||
    required this.name,
 | 
			
		||||
    required this.members,
 | 
			
		||||
    required this.follow,
 | 
			
		||||
    required this.canEveryoneAddMembers,
 | 
			
		||||
    required this.color,
 | 
			
		||||
  })  : assert(members != null),
 | 
			
		||||
        assert(members.length > 0),
 | 
			
		||||
        assert(follow != null),
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,4 @@
 | 
			
		||||
import 'package:comunic/models/api_request.dart';
 | 
			
		||||
import 'package:meta/meta.dart';
 | 
			
		||||
 | 
			
		||||
/// New conversation message model
 | 
			
		||||
///
 | 
			
		||||
@@ -9,13 +8,13 @@ import 'package:meta/meta.dart';
 | 
			
		||||
 | 
			
		||||
class NewConversationMessage {
 | 
			
		||||
  final int conversationID;
 | 
			
		||||
  final String message;
 | 
			
		||||
  final BytesFile file;
 | 
			
		||||
  final BytesFile thumbnail;
 | 
			
		||||
  final String? message;
 | 
			
		||||
  final BytesFile? file;
 | 
			
		||||
  final BytesFile? thumbnail;
 | 
			
		||||
 | 
			
		||||
  NewConversationMessage({
 | 
			
		||||
    @required this.conversationID,
 | 
			
		||||
    @required this.message,
 | 
			
		||||
    required this.conversationID,
 | 
			
		||||
    required this.message,
 | 
			
		||||
    this.file,
 | 
			
		||||
    this.thumbnail,
 | 
			
		||||
  })  : assert(conversationID != null),
 | 
			
		||||
 
 | 
			
		||||
@@ -9,16 +9,16 @@ class NewConversationsSettings {
 | 
			
		||||
  final bool following;
 | 
			
		||||
  final bool isComplete;
 | 
			
		||||
  final String name;
 | 
			
		||||
  final bool canEveryoneAddMembers;
 | 
			
		||||
  final Color color;
 | 
			
		||||
  final bool? canEveryoneAddMembers;
 | 
			
		||||
  final Color? color;
 | 
			
		||||
 | 
			
		||||
  const NewConversationsSettings({
 | 
			
		||||
    @required this.convID,
 | 
			
		||||
    @required this.following,
 | 
			
		||||
    @required this.isComplete,
 | 
			
		||||
    @required this.name,
 | 
			
		||||
    @required this.canEveryoneAddMembers,
 | 
			
		||||
    @required this.color,
 | 
			
		||||
    required this.convID,
 | 
			
		||||
    required this.following,
 | 
			
		||||
    required this.isComplete,
 | 
			
		||||
    required this.name,
 | 
			
		||||
    required this.canEveryoneAddMembers,
 | 
			
		||||
    required this.color,
 | 
			
		||||
  })  : assert(convID != null),
 | 
			
		||||
        assert(convID > 0),
 | 
			
		||||
        assert(following != null),
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,3 @@
 | 
			
		||||
import 'package:flutter/material.dart';
 | 
			
		||||
 | 
			
		||||
import 'api_request.dart';
 | 
			
		||||
 | 
			
		||||
/// New emoji information
 | 
			
		||||
@@ -11,8 +9,8 @@ class NewEmoji {
 | 
			
		||||
  final BytesFile image;
 | 
			
		||||
 | 
			
		||||
  const NewEmoji({
 | 
			
		||||
    @required this.shortcut,
 | 
			
		||||
    @required this.image,
 | 
			
		||||
    required this.shortcut,
 | 
			
		||||
    required this.image,
 | 
			
		||||
  })  : assert(shortcut != null),
 | 
			
		||||
        assert(image != null);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,4 @@
 | 
			
		||||
import 'package:comunic/models/group.dart';
 | 
			
		||||
import 'package:flutter/foundation.dart';
 | 
			
		||||
 | 
			
		||||
/// This class contains information about a conversation linked to a group
 | 
			
		||||
/// to create
 | 
			
		||||
@@ -12,9 +11,9 @@ class NewGroupConversation {
 | 
			
		||||
  final GroupMembershipLevel minMembershipLevel;
 | 
			
		||||
 | 
			
		||||
  const NewGroupConversation({
 | 
			
		||||
    @required this.groupID,
 | 
			
		||||
    @required this.name,
 | 
			
		||||
    @required this.minMembershipLevel,
 | 
			
		||||
    required this.groupID,
 | 
			
		||||
    required this.name,
 | 
			
		||||
    required this.minMembershipLevel,
 | 
			
		||||
  })  : assert(groupID != null),
 | 
			
		||||
        assert(name != null),
 | 
			
		||||
        assert(minMembershipLevel != null);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,6 @@
 | 
			
		||||
import 'package:comunic/enums/post_kind.dart';
 | 
			
		||||
import 'package:comunic/enums/post_target.dart';
 | 
			
		||||
import 'package:comunic/enums/post_visibility_level.dart';
 | 
			
		||||
import 'package:meta/meta.dart';
 | 
			
		||||
 | 
			
		||||
import 'api_request.dart';
 | 
			
		||||
 | 
			
		||||
@@ -15,9 +14,9 @@ class NewSurvey {
 | 
			
		||||
  final bool allowNewChoicesCreation;
 | 
			
		||||
 | 
			
		||||
  const NewSurvey({
 | 
			
		||||
    @required this.question,
 | 
			
		||||
    @required this.answers,
 | 
			
		||||
    @required this.allowNewChoicesCreation,
 | 
			
		||||
    required this.question,
 | 
			
		||||
    required this.answers,
 | 
			
		||||
    required this.allowNewChoicesCreation,
 | 
			
		||||
  })  : assert(question != null),
 | 
			
		||||
        assert(answers.length > 1),
 | 
			
		||||
        assert(allowNewChoicesCreation != null);
 | 
			
		||||
@@ -28,26 +27,26 @@ class NewPost {
 | 
			
		||||
  final int targetID;
 | 
			
		||||
  final PostVisibilityLevel visibility;
 | 
			
		||||
  final String content;
 | 
			
		||||
  final BytesFile image;
 | 
			
		||||
  final String url;
 | 
			
		||||
  final List<int> pdf;
 | 
			
		||||
  final BytesFile? image;
 | 
			
		||||
  final String? url;
 | 
			
		||||
  final List<int>? pdf;
 | 
			
		||||
  final PostKind kind;
 | 
			
		||||
  final DateTime timeEnd;
 | 
			
		||||
  final NewSurvey survey;
 | 
			
		||||
  final String youtubeId;
 | 
			
		||||
  final DateTime? timeEnd;
 | 
			
		||||
  final NewSurvey? survey;
 | 
			
		||||
  final String? youtubeId;
 | 
			
		||||
 | 
			
		||||
  const NewPost({
 | 
			
		||||
    @required this.target,
 | 
			
		||||
    @required this.targetID,
 | 
			
		||||
    @required this.visibility,
 | 
			
		||||
    @required this.content,
 | 
			
		||||
    @required this.kind,
 | 
			
		||||
    @required this.image,
 | 
			
		||||
    @required this.url,
 | 
			
		||||
    @required this.pdf,
 | 
			
		||||
    @required this.timeEnd,
 | 
			
		||||
    @required this.survey,
 | 
			
		||||
    @required this.youtubeId,
 | 
			
		||||
    required this.target,
 | 
			
		||||
    required this.targetID,
 | 
			
		||||
    required this.visibility,
 | 
			
		||||
    required this.content,
 | 
			
		||||
    required this.kind,
 | 
			
		||||
    required this.image,
 | 
			
		||||
    required this.url,
 | 
			
		||||
    required this.pdf,
 | 
			
		||||
    required this.timeEnd,
 | 
			
		||||
    required this.survey,
 | 
			
		||||
    required this.youtubeId,
 | 
			
		||||
  })  : assert(target != null),
 | 
			
		||||
        assert(targetID != null),
 | 
			
		||||
        assert(visibility != null),
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
import 'package:flutter/widgets.dart';
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// Notification model
 | 
			
		||||
///
 | 
			
		||||
@@ -45,19 +45,19 @@ class Notification {
 | 
			
		||||
  final int onElemId;
 | 
			
		||||
  final NotificationElementType onElemType;
 | 
			
		||||
  final NotificationType type;
 | 
			
		||||
  final int fromContainerId;
 | 
			
		||||
  final NotificationElementType fromContainerType;
 | 
			
		||||
  final int? fromContainerId;
 | 
			
		||||
  final NotificationElementType? fromContainerType;
 | 
			
		||||
 | 
			
		||||
  const Notification({
 | 
			
		||||
    @required this.id,
 | 
			
		||||
    @required this.timeCreate,
 | 
			
		||||
    @required this.seen,
 | 
			
		||||
    @required this.fromUser,
 | 
			
		||||
    @required this.onElemId,
 | 
			
		||||
    @required this.onElemType,
 | 
			
		||||
    @required this.type,
 | 
			
		||||
    @required this.fromContainerId,
 | 
			
		||||
    @required this.fromContainerType,
 | 
			
		||||
    required this.id,
 | 
			
		||||
    required this.timeCreate,
 | 
			
		||||
    required this.seen,
 | 
			
		||||
    required this.fromUser,
 | 
			
		||||
    required this.onElemId,
 | 
			
		||||
    required this.onElemType,
 | 
			
		||||
    required this.type,
 | 
			
		||||
    required this.fromContainerId,
 | 
			
		||||
    required this.fromContainerType,
 | 
			
		||||
  })  : assert(id != null),
 | 
			
		||||
        assert(timeCreate != null),
 | 
			
		||||
        assert(seen != null),
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
import 'package:flutter/material.dart';
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// Notifications settings
 | 
			
		||||
///
 | 
			
		||||
@@ -9,8 +9,8 @@ class NotificationsSettings {
 | 
			
		||||
  bool allowNotificationsSound;
 | 
			
		||||
 | 
			
		||||
  NotificationsSettings({
 | 
			
		||||
    @required this.allowConversations,
 | 
			
		||||
    @required this.allowNotificationsSound,
 | 
			
		||||
    required this.allowConversations,
 | 
			
		||||
    required this.allowNotificationsSound,
 | 
			
		||||
  })  : assert(allowConversations != null),
 | 
			
		||||
        assert(allowNotificationsSound != null);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,6 @@ import 'package:comunic/lists/comments_list.dart';
 | 
			
		||||
import 'package:comunic/models/displayed_content.dart';
 | 
			
		||||
import 'package:comunic/models/like_element.dart';
 | 
			
		||||
import 'package:comunic/models/survey.dart';
 | 
			
		||||
import 'package:meta/meta.dart';
 | 
			
		||||
 | 
			
		||||
/// Single post information
 | 
			
		||||
///
 | 
			
		||||
@@ -15,50 +14,50 @@ import 'package:meta/meta.dart';
 | 
			
		||||
class Post implements LikeElement {
 | 
			
		||||
  final int id;
 | 
			
		||||
  final int userID;
 | 
			
		||||
  final int userPageID;
 | 
			
		||||
  final int groupID;
 | 
			
		||||
  final int? userPageID;
 | 
			
		||||
  final int? groupID;
 | 
			
		||||
  final int timeSent;
 | 
			
		||||
  DisplayedString content;
 | 
			
		||||
  PostVisibilityLevel visibilityLevel;
 | 
			
		||||
  final PostKind kind;
 | 
			
		||||
  final int fileSize;
 | 
			
		||||
  final String fileType;
 | 
			
		||||
  final String filePath;
 | 
			
		||||
  final String fileURL;
 | 
			
		||||
  final int timeEnd;
 | 
			
		||||
  final String linkURL;
 | 
			
		||||
  final String linkTitle;
 | 
			
		||||
  final String linkDescription;
 | 
			
		||||
  final String linkImage;
 | 
			
		||||
  final int? fileSize;
 | 
			
		||||
  final String? fileType;
 | 
			
		||||
  final String? filePath;
 | 
			
		||||
  final String? fileURL;
 | 
			
		||||
  final int? timeEnd;
 | 
			
		||||
  final String? linkURL;
 | 
			
		||||
  final String? linkTitle;
 | 
			
		||||
  final String? linkDescription;
 | 
			
		||||
  final String? linkImage;
 | 
			
		||||
  int likes;
 | 
			
		||||
  bool userLike;
 | 
			
		||||
  final UserAccessLevels access;
 | 
			
		||||
  final CommentsList comments;
 | 
			
		||||
  Survey survey;
 | 
			
		||||
  final CommentsList? comments;
 | 
			
		||||
  Survey? survey;
 | 
			
		||||
 | 
			
		||||
  Post(
 | 
			
		||||
      {@required this.id,
 | 
			
		||||
      @required this.userID,
 | 
			
		||||
      @required this.userPageID,
 | 
			
		||||
      @required this.groupID,
 | 
			
		||||
      @required this.timeSent,
 | 
			
		||||
      @required this.content,
 | 
			
		||||
      @required this.visibilityLevel,
 | 
			
		||||
      @required this.kind,
 | 
			
		||||
      @required this.fileSize,
 | 
			
		||||
      @required this.fileType,
 | 
			
		||||
      @required this.filePath,
 | 
			
		||||
      @required this.fileURL,
 | 
			
		||||
      @required this.timeEnd,
 | 
			
		||||
      @required this.linkURL,
 | 
			
		||||
      @required this.linkTitle,
 | 
			
		||||
      @required this.linkDescription,
 | 
			
		||||
      @required this.linkImage,
 | 
			
		||||
      @required this.likes,
 | 
			
		||||
      @required this.userLike,
 | 
			
		||||
      @required this.access,
 | 
			
		||||
      @required this.comments,
 | 
			
		||||
      @required this.survey})
 | 
			
		||||
      {required this.id,
 | 
			
		||||
      required this.userID,
 | 
			
		||||
      required this.userPageID,
 | 
			
		||||
      required this.groupID,
 | 
			
		||||
      required this.timeSent,
 | 
			
		||||
      required this.content,
 | 
			
		||||
      required this.visibilityLevel,
 | 
			
		||||
      required this.kind,
 | 
			
		||||
      required this.fileSize,
 | 
			
		||||
      required this.fileType,
 | 
			
		||||
      required this.filePath,
 | 
			
		||||
      required this.fileURL,
 | 
			
		||||
      required this.timeEnd,
 | 
			
		||||
      required this.linkURL,
 | 
			
		||||
      required this.linkTitle,
 | 
			
		||||
      required this.linkDescription,
 | 
			
		||||
      required this.linkImage,
 | 
			
		||||
      required this.likes,
 | 
			
		||||
      required this.userLike,
 | 
			
		||||
      required this.access,
 | 
			
		||||
      required this.comments,
 | 
			
		||||
      required this.survey})
 | 
			
		||||
      : assert(id != null),
 | 
			
		||||
        assert(userID != null),
 | 
			
		||||
        assert(userPageID != 0 || groupID != 0),
 | 
			
		||||
@@ -72,7 +71,7 @@ class Post implements LikeElement {
 | 
			
		||||
        assert(userLike != null),
 | 
			
		||||
        assert(access != null);
 | 
			
		||||
 | 
			
		||||
  bool get isGroupPost => groupID != null && groupID > 0;
 | 
			
		||||
  bool get isGroupPost => groupID != null && groupID! > 0;
 | 
			
		||||
 | 
			
		||||
  bool get hasContent => content != null && !content.isNull;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
import 'package:flutter/material.dart';
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// Check password reset token result
 | 
			
		||||
///
 | 
			
		||||
@@ -10,9 +10,9 @@ class ResCheckPasswordToken {
 | 
			
		||||
  final String email;
 | 
			
		||||
 | 
			
		||||
  const ResCheckPasswordToken({
 | 
			
		||||
    @required this.firstName,
 | 
			
		||||
    @required this.lastName,
 | 
			
		||||
    @required this.email,
 | 
			
		||||
    required this.firstName,
 | 
			
		||||
    required this.lastName,
 | 
			
		||||
    required this.email,
 | 
			
		||||
  })  : assert(firstName != null),
 | 
			
		||||
        assert(lastName != null),
 | 
			
		||||
        assert(email != null);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
import 'package:flutter/cupertino.dart';
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// Single search result
 | 
			
		||||
///
 | 
			
		||||
@@ -11,8 +11,8 @@ class SearchResult {
 | 
			
		||||
  final SearchResultKind kind;
 | 
			
		||||
 | 
			
		||||
  SearchResult({
 | 
			
		||||
    @required this.id,
 | 
			
		||||
    @required this.kind,
 | 
			
		||||
    required this.id,
 | 
			
		||||
    required this.kind,
 | 
			
		||||
  })  : assert(id != null),
 | 
			
		||||
        assert(kind != null);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
import 'package:flutter/material.dart';
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// Security settings of the user
 | 
			
		||||
///
 | 
			
		||||
@@ -11,10 +11,10 @@ class SecuritySettings {
 | 
			
		||||
  final String securityAnswer2;
 | 
			
		||||
 | 
			
		||||
  const SecuritySettings({
 | 
			
		||||
    @required this.securityQuestion1,
 | 
			
		||||
    @required this.securityAnswer1,
 | 
			
		||||
    @required this.securityQuestion2,
 | 
			
		||||
    @required this.securityAnswer2,
 | 
			
		||||
    required this.securityQuestion1,
 | 
			
		||||
    required this.securityAnswer1,
 | 
			
		||||
    required this.securityQuestion2,
 | 
			
		||||
    required this.securityAnswer2,
 | 
			
		||||
  })  : assert(securityQuestion1 != null),
 | 
			
		||||
        assert(securityAnswer1 != null),
 | 
			
		||||
        assert(securityQuestion2 != null),
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,4 @@
 | 
			
		||||
import 'package:comunic/utils/date_utils.dart';
 | 
			
		||||
import 'package:flutter/widgets.dart';
 | 
			
		||||
import 'package:version/version.dart';
 | 
			
		||||
 | 
			
		||||
/// Server static configuration
 | 
			
		||||
@@ -11,8 +10,8 @@ class NotificationsPolicy {
 | 
			
		||||
  final bool hasIndependent;
 | 
			
		||||
 | 
			
		||||
  const NotificationsPolicy({
 | 
			
		||||
    @required this.hasFirebase,
 | 
			
		||||
    @required this.hasIndependent,
 | 
			
		||||
    required this.hasFirebase,
 | 
			
		||||
    required this.hasIndependent,
 | 
			
		||||
  })  : assert(hasFirebase != null),
 | 
			
		||||
        assert(hasIndependent != null);
 | 
			
		||||
}
 | 
			
		||||
@@ -28,14 +27,14 @@ class PasswordPolicy {
 | 
			
		||||
  final int minCategoriesPresence;
 | 
			
		||||
 | 
			
		||||
  const PasswordPolicy({
 | 
			
		||||
    @required this.allowMailInPassword,
 | 
			
		||||
    @required this.allowNameInPassword,
 | 
			
		||||
    @required this.minPasswordLength,
 | 
			
		||||
    @required this.minNumberUpperCaseLetters,
 | 
			
		||||
    @required this.minNumberLowerCaseLetters,
 | 
			
		||||
    @required this.minNumberDigits,
 | 
			
		||||
    @required this.minNumberSpecialCharacters,
 | 
			
		||||
    @required this.minCategoriesPresence,
 | 
			
		||||
    required this.allowMailInPassword,
 | 
			
		||||
    required this.allowNameInPassword,
 | 
			
		||||
    required this.minPasswordLength,
 | 
			
		||||
    required this.minNumberUpperCaseLetters,
 | 
			
		||||
    required this.minNumberLowerCaseLetters,
 | 
			
		||||
    required this.minNumberDigits,
 | 
			
		||||
    required this.minNumberSpecialCharacters,
 | 
			
		||||
    required this.minCategoriesPresence,
 | 
			
		||||
  })  : assert(allowMailInPassword != null),
 | 
			
		||||
        assert(allowNameInPassword != null),
 | 
			
		||||
        assert(minPasswordLength != null),
 | 
			
		||||
@@ -55,12 +54,12 @@ class ServerDataConservationPolicy {
 | 
			
		||||
  final int minLikesLifetime;
 | 
			
		||||
 | 
			
		||||
  const ServerDataConservationPolicy({
 | 
			
		||||
    @required this.minInactiveAccountLifetime,
 | 
			
		||||
    @required this.minNotificationLifetime,
 | 
			
		||||
    @required this.minCommentsLifetime,
 | 
			
		||||
    @required this.minPostsLifetime,
 | 
			
		||||
    @required this.minConversationMessagesLifetime,
 | 
			
		||||
    @required this.minLikesLifetime,
 | 
			
		||||
    required this.minInactiveAccountLifetime,
 | 
			
		||||
    required this.minNotificationLifetime,
 | 
			
		||||
    required this.minCommentsLifetime,
 | 
			
		||||
    required this.minPostsLifetime,
 | 
			
		||||
    required this.minConversationMessagesLifetime,
 | 
			
		||||
    required this.minLikesLifetime,
 | 
			
		||||
  })  : assert(minInactiveAccountLifetime != null),
 | 
			
		||||
        assert(minNotificationLifetime != null),
 | 
			
		||||
        assert(minCommentsLifetime != null),
 | 
			
		||||
@@ -85,19 +84,19 @@ class ConversationsPolicy {
 | 
			
		||||
  final int maxLogoHeight;
 | 
			
		||||
 | 
			
		||||
  const ConversationsPolicy({
 | 
			
		||||
    @required this.maxConversationNameLen,
 | 
			
		||||
    @required this.minMessageLen,
 | 
			
		||||
    @required this.maxMessageLen,
 | 
			
		||||
    @required this.allowedFilesType,
 | 
			
		||||
    @required this.filesMaxSize,
 | 
			
		||||
    @required this.writingEventInterval,
 | 
			
		||||
    @required this.writingEventLifetime,
 | 
			
		||||
    @required this.maxMessageImageWidth,
 | 
			
		||||
    @required this.maxMessageImageHeight,
 | 
			
		||||
    @required this.maxThumbnailWidth,
 | 
			
		||||
    @required this.maxThumbnailHeight,
 | 
			
		||||
    @required this.maxLogoWidth,
 | 
			
		||||
    @required this.maxLogoHeight,
 | 
			
		||||
    required this.maxConversationNameLen,
 | 
			
		||||
    required this.minMessageLen,
 | 
			
		||||
    required this.maxMessageLen,
 | 
			
		||||
    required this.allowedFilesType,
 | 
			
		||||
    required this.filesMaxSize,
 | 
			
		||||
    required this.writingEventInterval,
 | 
			
		||||
    required this.writingEventLifetime,
 | 
			
		||||
    required this.maxMessageImageWidth,
 | 
			
		||||
    required this.maxMessageImageHeight,
 | 
			
		||||
    required this.maxThumbnailWidth,
 | 
			
		||||
    required this.maxThumbnailHeight,
 | 
			
		||||
    required this.maxLogoWidth,
 | 
			
		||||
    required this.maxLogoHeight,
 | 
			
		||||
  })  : assert(maxConversationNameLen != null),
 | 
			
		||||
        assert(minMessageLen != null),
 | 
			
		||||
        assert(maxMessageLen != null),
 | 
			
		||||
@@ -121,11 +120,11 @@ class AccountInformationPolicy {
 | 
			
		||||
  final int maxLocationLength;
 | 
			
		||||
 | 
			
		||||
  const AccountInformationPolicy({
 | 
			
		||||
    @required this.minFirstNameLength,
 | 
			
		||||
    @required this.maxFirstNameLength,
 | 
			
		||||
    @required this.minLastNameLength,
 | 
			
		||||
    @required this.maxLastNameLength,
 | 
			
		||||
    @required this.maxLocationLength,
 | 
			
		||||
    required this.minFirstNameLength,
 | 
			
		||||
    required this.maxFirstNameLength,
 | 
			
		||||
    required this.minLastNameLength,
 | 
			
		||||
    required this.maxLastNameLength,
 | 
			
		||||
    required this.maxLocationLength,
 | 
			
		||||
  })  : assert(minFirstNameLength != null),
 | 
			
		||||
        assert(maxFirstNameLength != null),
 | 
			
		||||
        assert(minLastNameLength != null),
 | 
			
		||||
@@ -136,7 +135,7 @@ class AccountInformationPolicy {
 | 
			
		||||
enum BannerNature { Information, Warning, Success }
 | 
			
		||||
 | 
			
		||||
extension BannerNatureExt on BannerNature {
 | 
			
		||||
  static BannerNature fromStr(String s) {
 | 
			
		||||
  static BannerNature fromStr(String? s) {
 | 
			
		||||
    switch (s) {
 | 
			
		||||
      case "information":
 | 
			
		||||
        return BannerNature.Information;
 | 
			
		||||
@@ -151,22 +150,22 @@ extension BannerNatureExt on BannerNature {
 | 
			
		||||
 | 
			
		||||
class Banner {
 | 
			
		||||
  final bool enabled;
 | 
			
		||||
  final int expire;
 | 
			
		||||
  final int? expire;
 | 
			
		||||
  final BannerNature nature;
 | 
			
		||||
  final Map<String, String> message;
 | 
			
		||||
  final String link;
 | 
			
		||||
  final String? link;
 | 
			
		||||
 | 
			
		||||
  const Banner({
 | 
			
		||||
    @required this.enabled,
 | 
			
		||||
    @required this.expire,
 | 
			
		||||
    @required this.nature,
 | 
			
		||||
    @required this.message,
 | 
			
		||||
    @required this.link,
 | 
			
		||||
    required this.enabled,
 | 
			
		||||
    required this.expire,
 | 
			
		||||
    required this.nature,
 | 
			
		||||
    required this.message,
 | 
			
		||||
    required this.link,
 | 
			
		||||
  })  : assert(enabled != null),
 | 
			
		||||
        assert(nature != null),
 | 
			
		||||
        assert(message != null);
 | 
			
		||||
 | 
			
		||||
  bool get visible => enabled && (expire == null || expire > time());
 | 
			
		||||
  bool get visible => enabled && (expire == null || expire! > time());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class ServerConfig {
 | 
			
		||||
@@ -176,7 +175,7 @@ class ServerConfig {
 | 
			
		||||
  final String contactEmail;
 | 
			
		||||
  final String playStoreURL;
 | 
			
		||||
  final String androidDirectDownloadURL;
 | 
			
		||||
  final Banner banner;
 | 
			
		||||
  final Banner? banner;
 | 
			
		||||
  final NotificationsPolicy notificationsPolicy;
 | 
			
		||||
  final PasswordPolicy passwordPolicy;
 | 
			
		||||
  final ServerDataConservationPolicy dataConservationPolicy;
 | 
			
		||||
@@ -184,18 +183,18 @@ class ServerConfig {
 | 
			
		||||
  final AccountInformationPolicy accountInformationPolicy;
 | 
			
		||||
 | 
			
		||||
  const ServerConfig({
 | 
			
		||||
    @required this.minSupportedMobileVersion,
 | 
			
		||||
    @required this.termsURL,
 | 
			
		||||
    @required this.privacyPolicyURL,
 | 
			
		||||
    @required this.contactEmail,
 | 
			
		||||
    @required this.playStoreURL,
 | 
			
		||||
    @required this.androidDirectDownloadURL,
 | 
			
		||||
    @required this.banner,
 | 
			
		||||
    @required this.notificationsPolicy,
 | 
			
		||||
    @required this.passwordPolicy,
 | 
			
		||||
    @required this.dataConservationPolicy,
 | 
			
		||||
    @required this.conversationsPolicy,
 | 
			
		||||
    @required this.accountInformationPolicy,
 | 
			
		||||
    required this.minSupportedMobileVersion,
 | 
			
		||||
    required this.termsURL,
 | 
			
		||||
    required this.privacyPolicyURL,
 | 
			
		||||
    required this.contactEmail,
 | 
			
		||||
    required this.playStoreURL,
 | 
			
		||||
    required this.androidDirectDownloadURL,
 | 
			
		||||
    required this.banner,
 | 
			
		||||
    required this.notificationsPolicy,
 | 
			
		||||
    required this.passwordPolicy,
 | 
			
		||||
    required this.dataConservationPolicy,
 | 
			
		||||
    required this.conversationsPolicy,
 | 
			
		||||
    required this.accountInformationPolicy,
 | 
			
		||||
  })  : assert(minSupportedMobileVersion != null),
 | 
			
		||||
        assert(termsURL != null),
 | 
			
		||||
        assert(privacyPolicyURL != null),
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,5 @@
 | 
			
		||||
import 'package:comunic/models/survey_choice.dart';
 | 
			
		||||
import 'package:comunic/utils/account_utils.dart' as account;
 | 
			
		||||
import 'package:meta/meta.dart';
 | 
			
		||||
 | 
			
		||||
/// Survey information
 | 
			
		||||
///
 | 
			
		||||
@@ -17,14 +16,14 @@ class Survey {
 | 
			
		||||
  bool allowNewChoicesCreation;
 | 
			
		||||
 | 
			
		||||
  Survey({
 | 
			
		||||
    @required this.id,
 | 
			
		||||
    @required this.userID,
 | 
			
		||||
    @required this.postID,
 | 
			
		||||
    @required this.creationTime,
 | 
			
		||||
    @required this.question,
 | 
			
		||||
    @required this.userChoice,
 | 
			
		||||
    @required this.choices,
 | 
			
		||||
    @required this.allowNewChoicesCreation,
 | 
			
		||||
    required this.id,
 | 
			
		||||
    required this.userID,
 | 
			
		||||
    required this.postID,
 | 
			
		||||
    required this.creationTime,
 | 
			
		||||
    required this.question,
 | 
			
		||||
    required this.userChoice,
 | 
			
		||||
    required this.choices,
 | 
			
		||||
    required this.allowNewChoicesCreation,
 | 
			
		||||
  })  : assert(id != null),
 | 
			
		||||
        assert(userID != null),
 | 
			
		||||
        assert(postID != null),
 | 
			
		||||
@@ -43,14 +42,14 @@ class Survey {
 | 
			
		||||
  bool get canBlockNewChoicesCreation =>
 | 
			
		||||
      allowNewChoicesCreation && account.userID() == this.userID;
 | 
			
		||||
 | 
			
		||||
  SurveyChoice get userResponse {
 | 
			
		||||
  SurveyChoice? get userResponse {
 | 
			
		||||
    if (!hasResponded) return null;
 | 
			
		||||
 | 
			
		||||
    return choices.firstWhere((e) => e.id == userChoice);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  void cancelUserResponse() {
 | 
			
		||||
    if (hasResponded) userResponse.responses--;
 | 
			
		||||
    if (hasResponded) userResponse!.responses--;
 | 
			
		||||
    userChoice = 0;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
import 'package:meta/meta.dart';
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/// Single survey choice
 | 
			
		||||
///
 | 
			
		||||
@@ -10,9 +10,9 @@ class SurveyChoice {
 | 
			
		||||
  int responses;
 | 
			
		||||
 | 
			
		||||
  SurveyChoice({
 | 
			
		||||
    @required this.id,
 | 
			
		||||
    @required this.name,
 | 
			
		||||
    @required this.responses,
 | 
			
		||||
    required this.id,
 | 
			
		||||
    required this.name,
 | 
			
		||||
    required this.responses,
 | 
			
		||||
  })  : assert(id != null),
 | 
			
		||||
        assert(name != null),
 | 
			
		||||
        assert(responses != null);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,5 @@
 | 
			
		||||
import 'package:comunic/models/conversation.dart';
 | 
			
		||||
import 'package:comunic/models/conversation_message.dart';
 | 
			
		||||
import 'package:flutter/material.dart';
 | 
			
		||||
 | 
			
		||||
/// Unread conversation information
 | 
			
		||||
///
 | 
			
		||||
@@ -11,8 +10,8 @@ class UnreadConversation {
 | 
			
		||||
  final ConversationMessage message;
 | 
			
		||||
 | 
			
		||||
  const UnreadConversation({
 | 
			
		||||
    @required this.conv,
 | 
			
		||||
    @required this.message,
 | 
			
		||||
    required this.conv,
 | 
			
		||||
    required this.message,
 | 
			
		||||
  })  : assert(conv != null),
 | 
			
		||||
        assert(message != null);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,6 @@ import 'package:comunic/helpers/serialization/base_serialization_helper.dart';
 | 
			
		||||
import 'package:comunic/lists/custom_emojies_list.dart';
 | 
			
		||||
import 'package:comunic/utils/account_utils.dart';
 | 
			
		||||
import 'package:comunic/utils/ui_utils.dart';
 | 
			
		||||
import 'package:meta/meta.dart';
 | 
			
		||||
 | 
			
		||||
/// Single user information
 | 
			
		||||
///
 | 
			
		||||
@@ -13,21 +12,21 @@ import 'package:meta/meta.dart';
 | 
			
		||||
 | 
			
		||||
class User implements SerializableElement<User> {
 | 
			
		||||
  final int id;
 | 
			
		||||
  final String firstName;
 | 
			
		||||
  final String lastName;
 | 
			
		||||
  final String? firstName;
 | 
			
		||||
  final String? lastName;
 | 
			
		||||
  final UserPageVisibility pageVisibility;
 | 
			
		||||
  final String virtualDirectory;
 | 
			
		||||
  final String accountImageURL;
 | 
			
		||||
  final String? virtualDirectory;
 | 
			
		||||
  final String? accountImageURL;
 | 
			
		||||
  final CustomEmojiesList customEmojies;
 | 
			
		||||
 | 
			
		||||
  const User({
 | 
			
		||||
    @required this.id,
 | 
			
		||||
    @required this.firstName,
 | 
			
		||||
    @required this.lastName,
 | 
			
		||||
    @required this.pageVisibility,
 | 
			
		||||
    @required this.virtualDirectory,
 | 
			
		||||
    @required this.accountImageURL,
 | 
			
		||||
    @required this.customEmojies,
 | 
			
		||||
    required int this.id,
 | 
			
		||||
    required String this.firstName,
 | 
			
		||||
    required String this.lastName,
 | 
			
		||||
    required this.pageVisibility,
 | 
			
		||||
    required this.virtualDirectory,
 | 
			
		||||
    required String this.accountImageURL,
 | 
			
		||||
    required this.customEmojies,
 | 
			
		||||
  })  : assert(id != null),
 | 
			
		||||
        assert(id > 0),
 | 
			
		||||
        assert(firstName != null),
 | 
			
		||||
@@ -37,13 +36,13 @@ class User implements SerializableElement<User> {
 | 
			
		||||
        assert(customEmojies != null);
 | 
			
		||||
 | 
			
		||||
  /// Get user full name
 | 
			
		||||
  String get fullName => firstName + " " + lastName;
 | 
			
		||||
  String get fullName => firstName! + " " + lastName!;
 | 
			
		||||
 | 
			
		||||
  /// Get user display name
 | 
			
		||||
  String get displayName => htmlDecodeCharacters(fullName);
 | 
			
		||||
 | 
			
		||||
  bool get hasVirtualDirectory =>
 | 
			
		||||
      virtualDirectory != null && virtualDirectory.length > 0;
 | 
			
		||||
      virtualDirectory != null && virtualDirectory!.length > 0;
 | 
			
		||||
 | 
			
		||||
  bool get isCurrentUser => id == userID();
 | 
			
		||||
 | 
			
		||||
@@ -69,5 +68,5 @@ class User implements SerializableElement<User> {
 | 
			
		||||
            jsonDecode(map["customEmojies"]));
 | 
			
		||||
 | 
			
		||||
  @override
 | 
			
		||||
  int compareTo(User other) => id.compareTo(other.id);
 | 
			
		||||
  int compareTo(User other) => id!.compareTo(other.id!);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,5 @@
 | 
			
		||||
import 'dart:convert';
 | 
			
		||||
 | 
			
		||||
import 'package:flutter/widgets.dart';
 | 
			
		||||
 | 
			
		||||
/// WebSocket message
 | 
			
		||||
///
 | 
			
		||||
/// @author Pierre Hubert
 | 
			
		||||
@@ -12,9 +10,9 @@ class WsMessage {
 | 
			
		||||
  final dynamic data;
 | 
			
		||||
 | 
			
		||||
  const WsMessage({
 | 
			
		||||
    @required this.id,
 | 
			
		||||
    @required this.title,
 | 
			
		||||
    @required this.data,
 | 
			
		||||
    required this.id,
 | 
			
		||||
    required this.title,
 | 
			
		||||
    required this.data,
 | 
			
		||||
  })  : assert(id != null),
 | 
			
		||||
        assert(title != null),
 | 
			
		||||
        assert(title.length > 0);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user