Skip to content

Instantly share code, notes, and snippets.

@HerrNiklasRaab
Created April 16, 2020 20:23
Show Gist options
  • Save HerrNiklasRaab/48abd5e079d7032c906db6912dafd570 to your computer and use it in GitHub Desktop.
Save HerrNiklasRaab/48abd5e079d7032c906db6912dafd570 to your computer and use it in GitHub Desktop.

Revisions

  1. HerrNiklasRaab created this gist Apr 16, 2020.
    212 changes: 212 additions & 0 deletions user.dart
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,212 @@
    class User extends Document {
    final Name name;
    final Address address;
    final Gender gender;
    final Birthday birthday;
    final Email email;
    final Weight weight;
    final Length height;
    final bool _hasFinishedSignUp;
    final Iterable<Bike> myBikes;
    final Set<AuthenticationProvider> _authenticationProvider;
    final Set<String> _notificationTokens;

    Iterable<String> get notificationToken => _notificationTokens;

    User updateAuthenticationProvider(
    List<AuthenticationProvider> newAuthenticationProvider) {
    return _copyWith(authenticationProvider: {
    ..._authenticationProvider,
    ...newAuthenticationProvider
    });
    }

    bool get needsEmailVerification =>
    _authenticationProvider.every((authenticationProvider) =>
    authenticationProvider == AuthenticationProvider.email);

    User finishSignUp() {
    return _copyWith(hasFinishedSignUp: true);
    }

    bool get hasEmailSettings =>
    _authenticationProvider.any((authenticationProvider) =>
    authenticationProvider == AuthenticationProvider.email);

    User selectBike(Bike bike) {
    var selectedBike = bike.select();
    if (myBikes.every((bike) => bike.mac != selectedBike.mac))
    return _copyWith(myBikes: [...myBikes, selectedBike]);
    return updateBike(bike);
    }

    ///If a bike is selected right now, lastSelectedBike is also the currently selected bike
    Bike get lastSelectedBike =>
    myBikes.sortByDescending((myBike) => myBike.lastTimeSelected).first;

    User updateBike(Bike bike) {
    return _copyWith(
    myBikes: myBikes
    .map((myBike) => myBike.mac == bike.mac ? bike : myBike.copyWith())
    .toList());
    }

    bool get hasFinishedSignUp => _hasFinishedSignUp;

    factory User(String id, AuthenticationProvider authenticationProvider) {
    return User._(
    id: id,
    ).updateAuthenticationProvider([authenticationProvider]);
    }

    User._(
    {String id,
    this.name,
    this.birthday,
    this.email,
    bool hasFinishedSignUp = false,
    this.gender,
    this.address,
    Set<AuthenticationProvider> authenticationProvider = const {},
    Set<String> notificationTokens = const {},
    this.height,
    this.weight,
    this.myBikes = const []})
    : _hasFinishedSignUp = hasFinishedSignUp,
    _authenticationProvider = authenticationProvider,
    _notificationTokens = notificationTokens,
    super(id: id);

    @override
    User copyWith(
    {String id,
    Email email,
    Name name,
    Address address,
    Gender gender,
    Birthday birthDay,
    Weight weight,
    Length height,
    bool setNameNull = false,
    bool setAddressNull = false,
    bool setBirthdayNull = false,
    bool setWeightNull = false,
    bool setHeightNull = false,
    bool setGenderNull = false}) {
    return _copyWith(
    id: id,
    email: email,
    name: name,
    address: address,
    gender: gender,
    birthday: birthDay,
    weight: weight,
    height: height,
    setAddressNull: setAddressNull,
    setNameNull: setNameNull,
    setBirthdayNull: setBirthdayNull,
    setWeightNull: setWeightNull,
    setGenderNull: setGenderNull);
    }

    User _copyWith(
    {Email email,
    Address address,
    Gender gender,
    Birthday birthday,
    Name name,
    bool hasFinishedSignUp,
    Set<AuthenticationProvider> authenticationProvider,
    Set<String> notificationTokens,
    Length height,
    Weight weight,
    bool setNameNull = false,
    bool setAddressNull = false,
    bool setBirthdayNull = false,
    bool setWeightNull = false,
    bool setHeightNull = false,
    bool setGenderNull = false,
    List<Bike> myBikes,
    String id}) {
    return User._(
    id: id ?? this.id,
    myBikes: myBikes ?? this.myBikes,
    email: email ?? this.email,
    name: setNameNull ? null : name ?? this.name,
    hasFinishedSignUp: hasFinishedSignUp ?? _hasFinishedSignUp,
    address: setAddressNull ? null : address ?? this.address,
    gender: setGenderNull ? null : gender ?? this.gender,
    birthday: setBirthdayNull ? null : birthday ?? this.birthday,
    authenticationProvider:
    authenticationProvider ?? _authenticationProvider,
    notificationTokens: notificationTokens ?? _notificationTokens,
    height: setHeightNull ? null : height ?? this.height,
    weight: setWeightNull ? null : weight ?? this.weight);
    }

    @override
    List<Object> get props => [
    name,
    address,
    gender,
    birthday,
    email,
    weight,
    height,
    myBikes,
    _hasFinishedSignUp,
    _authenticationProvider
    ];

    @override
    Map<String, dynamic> toMap() => <String, dynamic>{
    "name": name?.toMap(),
    "address": address?.toMap(),
    "gender": EnumToString.parse(gender),
    "birthday": birthday?.toMap(),
    "email": email?.toMap(),
    "weight": weight?.toMap(),
    "height": height?.toMap(),
    "myBikes": myBikes.map((bike) => bike.toMap()).toList(),
    "hasFinishedSignUp": _hasFinishedSignUp,
    "authenticationProvider": _authenticationProvider
    .map((provider) => EnumToString.parse(provider))
    .toList()
    };

    User.fromMap(Map<String, dynamic> map)
    : name = map["name"] == null
    ? null
    : Name.fromMap(map["name"] as Map<String, dynamic>),
    address = map["address"] == null
    ? null
    : Address.fromMap(map["address"] as Map<String, dynamic>),
    gender =
    EnumToString.fromString(Gender.values, map["gender"] as String),
    birthday = map["birthday"] == null
    ? null
    : Birthday.fromMap(map["birthday"] as Map<String, dynamic>),
    email = map["email"] == null
    ? null
    : Email.fromMap(map["email"] as Map<String, dynamic>),
    weight = map["weight"] == null
    ? null
    : Weight.fromMap(map["weight"] as Map<String, dynamic>),
    height = map["height"] == null
    ? null
    : Length.fromMap(map["height"] as Map<String, dynamic>),
    myBikes = (map["myBikes"] as List<dynamic>)
    .map((dynamic bikeMap) =>
    Bike.fromMap(bikeMap as Map<String, dynamic>))
    .toList(),
    _hasFinishedSignUp = map["hasFinishedSignUp"] as bool,
    _authenticationProvider =
    (map["authenticationProvider"] as List<dynamic>)
    .map((dynamic providerMap) => EnumToString.fromString(
    AuthenticationProvider.values, providerMap as String))
    .toSet(),
    _notificationTokens = map["notificationTokens"] == null
    ? null
    : (map["notificationTokens"] as List<String>).toSet(),
    super.fromMap(map);
    }