Skip to content

Commit ca7158d

Browse files
Fix/user local setting (#42)
* fix: not saving the image into local storage * fix: social authentication * fix: image wasn't stored on local on image chage * feat: check platform
1 parent 9496d31 commit ca7158d

12 files changed

Lines changed: 57 additions & 49 deletions

lib/core/models/user_model.dart

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -61,20 +61,28 @@ class UserModel {
6161
required this.phone,
6262
required this.id,
6363
this.photoBytes,
64-
}) {
65-
_setPhotoBytes();
66-
}
64+
});
6765

6866
_setPhotoBytes() async {
69-
// todo: check if the photo is a total url
70-
String url = '${API_URL_PICTURES}/$photo';
71-
Uint8List? tempImage;
72-
// todo: add try catch block
73-
tempImage = await downloadImage(url);
74-
if(tempImage != null) {
75-
photoBytes = tempImage;
67+
late String url;
68+
if (photo?.startsWith('http') ?? false) {
69+
url = photo!;
70+
} else if (photo?.isNotEmpty ?? false) {
71+
url = '$API_URL_PICTURES/$photo';
72+
} else {
73+
url = '';
7674
}
75+
if (url.isEmpty) return;
7776

77+
Uint8List? tempImage;
78+
try {
79+
tempImage = await downloadImage(url);
80+
if (tempImage != null) {
81+
photoBytes = tempImage;
82+
}
83+
} catch (e) {
84+
photoBytes = null;
85+
}
7886
}
7987

8088
@override
@@ -119,7 +127,7 @@ class UserModel {
119127

120128
@override
121129
String toString() {
122-
return 'UserModel(username: $username, screenName: $screenName, email: $email, photo: $photo, status: $status, bio: $bio, maxFileSize: $maxFileSize, automaticDownloadEnable: $automaticDownloadEnable, lastSeenPrivacy: $lastSeenPrivacy, readReceiptsEnablePrivacy: $readReceiptsEnablePrivacy, storiesPrivacy: $storiesPrivacy, picturePrivacy: $picturePrivacy, invitePermissionsPrivacy: $invitePermissionsPrivacy, phone: $phone, id: $id)';
130+
return 'UserModel(\n username: $username,\n screenName: $screenName,\n email: $email,\n photo: $photo,\n status: $status,\n bio: $bio,\n maxFileSize: $maxFileSize,\n automaticDownloadEnable: $automaticDownloadEnable,\n lastSeenPrivacy: $lastSeenPrivacy,\n readReceiptsEnablePrivacy: $readReceiptsEnablePrivacy,\n storiesPrivacy: $storiesPrivacy,\n picturePrivacy: $picturePrivacy,\n invitePermissionsPrivacy: $invitePermissionsPrivacy,\n phone: $phone,\n id: $id,\n isPhotoBytesSet: ${photoBytes != null}\n)';
123131
}
124132

125133
UserModel copyWith({
@@ -159,7 +167,7 @@ class UserModel {
159167
invitePermissionsPrivacy ?? this.invitePermissionsPrivacy,
160168
phone: phone ?? this.phone,
161169
id: id ?? this.id,
162-
photoBytes: photoBytes?? this.photoBytes,
170+
photoBytes: photoBytes ?? this.photoBytes,
163171
);
164172
}
165173

@@ -183,15 +191,15 @@ class UserModel {
183191
};
184192
}
185193

186-
factory UserModel.fromMap(Map<String, dynamic> map) {
194+
static Future<UserModel> fromMap(Map<String, dynamic> map) async {
187195
String screenName = (map['screenName'] as String?) ?? '';
188196
if (screenName.isEmpty) {
189197
screenName = 'No Name';
190198
}
191-
return UserModel(
199+
final user = UserModel(
192200
username: map['username'] as String,
193201
screenName: screenName,
194-
email:(map['email'] as String?) ?? '',
202+
email: (map['email'] as String?) ?? '',
195203
photo: map['photo'] != null ? map['photo'] as String : null,
196204
status: map['status'] as String,
197205
bio: map['bio'] as String,
@@ -205,10 +213,9 @@ class UserModel {
205213
phone: (map['phoneNumber'] as String?) ?? '',
206214
id: map['id'] as String,
207215
);
216+
await user._setPhotoBytes();
217+
return user;
208218
}
209219

210220
String toJson() => json.encode(toMap());
211-
212-
factory UserModel.fromJson(String source) =>
213-
UserModel.fromMap(json.decode(source) as Map<String, dynamic>);
214221
}

lib/core/models/user_model.g.dart

Lines changed: 2 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/features/auth/models/auth_response_model.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,14 @@ class AuthResponseModel {
99
required this.token,
1010
});
1111

12-
factory AuthResponseModel.fromMap(Map<String, dynamic> map) {
12+
static Future<AuthResponseModel> fromMap(Map<String, dynamic> map) async {
1313
map.forEach(
1414
(key, value) {
1515
print('key: $key, value: $value, value type: ${value.runtimeType}');
1616
},
1717
);
1818
return AuthResponseModel(
19-
user: UserModel.fromMap(map['user'] as Map<String, dynamic>),
19+
user: await UserModel.fromMap(map['user'] as Map<String, dynamic>),
2020
token: map['sessionId'] as String,
2121
);
2222
}

lib/features/auth/repository/auth_local_repository.dart

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,8 @@ class AuthLocalRepository {
4040
await _tokenBox.delete('token');
4141
}
4242

43-
// todo: create the user setting and getting methods
4443
Future<void> setUser(UserModel user) async {
45-
Uint8List? imageBytes = await _fetchUserImage(user.photo!);
46-
47-
if (imageBytes != null) {
48-
final userWithImage = user.copyWith(photoBytes: imageBytes);
49-
await _userBox.put('user', userWithImage);
50-
}
44+
await _userBox.put('user', user);
5145
}
5246

5347
Future<Uint8List?> _fetchUserImage(String photoUrl) async {

lib/features/auth/repository/auth_local_repository.g.dart

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/features/auth/repository/auth_remote_repository.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,8 @@ class AuthRemoteRepository {
115115

116116
debugPrint('=========================================');
117117
debugPrint('Get me was successful');
118-
final user = UserModel.fromMap(response.data['data']['user']);
118+
final user = await UserModel.fromMap(response.data['data']['user']);
119+
debugPrint('** First Creation done');
119120
return Right(user);
120121
} on DioException catch (dioException) {
121122
return Left(handleDioException(dioException));
@@ -140,7 +141,7 @@ class AuthRemoteRepository {
140141
);
141142

142143
// todo(ahmed): check response body from the back side
143-
final AuthResponseModel logInResponse = AuthResponseModel.fromMap(
144+
final AuthResponseModel logInResponse = await AuthResponseModel.fromMap(
144145
(response.data['data']) as Map<String, dynamic>);
145146

146147
return Right(logInResponse);

lib/features/auth/repository/auth_remote_repository.g.dart

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/features/auth/view_model/auth_view_model.dart

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
// ignore_for_file: avoid_manual_providers_as_generated_provider_dependency
2+
import 'dart:io';
3+
24
import 'package:riverpod_annotation/riverpod_annotation.dart';
35
import 'package:telware_cross_platform/core/constants/server_constants.dart';
46
import 'package:telware_cross_platform/core/mock/constants_mock.dart';
@@ -210,6 +212,9 @@ class AuthViewModel extends _$AuthViewModel {
210212
void githubLogIn() => _launchSocialAuth(GITHUB_AUTH_URL);
211213

212214
Future<void> _launchSocialAuth(String authUrl) async {
215+
if (Platform.isAndroid || Platform.isIOS) {
216+
authUrl += '?platform=mobile';
217+
}
213218
final Uri authUri = Uri.parse(authUrl);
214219
try {
215220
if (await canLaunchUrl(authUri)) {
@@ -321,8 +326,9 @@ class AuthViewModel extends _$AuthViewModel {
321326

322327
response.match((appError) {
323328
}, (user) {
324-
ref.read(authLocalRepositoryProvider).setUser(user);
329+
debugPrint('** getMe is called\nuser supposed to have img');
325330
print(user);
331+
ref.read(authLocalRepositoryProvider).setUser(user);
326332
ref.read(userProvider.notifier).update((_) => user);
327333
});
328334
}

lib/features/auth/view_model/auth_view_model.g.dart

Lines changed: 1 addition & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/features/stories/repository/contacts_remote_repository.dart

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,23 +5,22 @@ import 'package:flutter_dotenv/flutter_dotenv.dart';
55
import 'package:flutter_riverpod/flutter_riverpod.dart';
66
import 'package:http_parser/http_parser.dart';
77
import 'package:riverpod_annotation/riverpod_annotation.dart';
8+
import 'package:telware_cross_platform/core/providers/token_provider.dart';
89
import 'package:telware_cross_platform/features/stories/models/contact_model.dart';
910
import 'package:telware_cross_platform/features/stories/models/story_model.dart';
1011
import 'package:http/http.dart' as http;
11-
import '../../auth/repository/auth_local_repository.dart';
1212

1313
part 'contacts_remote_repository.g.dart';
1414

1515
@Riverpod(keepAlive: true)
1616
ContactsRemoteRepository contactsRemoteRepository(
1717
ContactsRemoteRepositoryRef ref) {
18-
final authLocalRepository = ref.read(authLocalRepositoryProvider);
19-
return ContactsRemoteRepository(authLocalRepository);
18+
return ContactsRemoteRepository(ref);
2019
}
2120

2221
class ContactsRemoteRepository {
23-
late final AuthLocalRepository authLocalRepository;
24-
ContactsRemoteRepository(this.authLocalRepository);
22+
final ProviderRef _ref;
23+
ContactsRemoteRepository(this._ref);
2524

2625
Future<List<ContactModel>> fetchContactsFromBackend() async {
2726
await Future.delayed(const Duration(seconds: 2));
@@ -157,7 +156,7 @@ class ContactsRemoteRepository {
157156
String uploadUrl = '${dotenv.env['BASE_URL']}/users/stories';
158157
var uri = Uri.parse(uploadUrl);
159158
var request = http.MultipartRequest('POST', uri);
160-
request.headers['X-Session-Token'] = authLocalRepository.getToken() ?? '';
159+
request.headers['X-Session-Token'] = _ref.read(tokenProvider) ?? '';
161160
var multipartFile = await http.MultipartFile.fromPath(
162161
'file',
163162
storyImage.path,
@@ -184,7 +183,7 @@ class ContactsRemoteRepository {
184183
String uploadUrl = '${dotenv.env['API_URL']}/users/picture';
185184
var uri = Uri.parse(uploadUrl);
186185
var request = http.MultipartRequest('PATCH', uri);
187-
request.headers['X-Session-Token'] = authLocalRepository.getToken()!;
186+
request.headers['X-Session-Token'] = _ref.read(tokenProvider)!;
188187
var multipartFile = await http.MultipartFile.fromPath(
189188
'file',
190189
storyImage.path,
@@ -194,6 +193,7 @@ class ContactsRemoteRepository {
194193

195194
try {
196195
var response = await request.send();
196+
debugPrint('** status Code: ${response.statusCode.toString()}');
197197
return response.statusCode == 201;
198198
} catch (e) {
199199
if (kDebugMode) {
@@ -207,7 +207,7 @@ class ContactsRemoteRepository {
207207
String uploadUrl = '${dotenv.env['API_URL']}/users/picture';
208208
var uri = Uri.parse(uploadUrl);
209209
var request = http.MultipartRequest('DELETE', uri);
210-
request.headers['X-Session-Token'] = authLocalRepository.getToken()!;
210+
request.headers['X-Session-Token'] = _ref.read(tokenProvider)!;
211211

212212
try {
213213
var response = await request.send();
@@ -226,7 +226,7 @@ class ContactsRemoteRepository {
226226
var uri = Uri.parse(uploadUrl);
227227
var request = http.MultipartRequest('GET', uri);
228228

229-
request.headers['X-Session-Token'] = authLocalRepository.getToken()!;
229+
request.headers['X-Session-Token'] = _ref.read(tokenProvider)!;
230230

231231
try {
232232
var response = await request.send();
@@ -257,7 +257,7 @@ class ContactsRemoteRepository {
257257
'${dotenv.env['BASE_URL']}/stories/:storyId/views';
258258
// var uri = Uri.parse(uploadUrl);
259259
// var request = http.MultipartRequest('POST', uri);
260-
// String? token = authLocalRepository.getToken();
260+
// String? token = _ref.read(tokenProvider);
261261
// if (token != null) {
262262
// request.headers['Authorization'] = 'Bearer $token';
263263
// }
@@ -276,7 +276,7 @@ class ContactsRemoteRepository {
276276
// String uploadUrl = '\${domain}:\${port}/users/stories/$storyId';
277277
// var uri = Uri.parse(uploadUrl);
278278
// var request = http.MultipartRequest('DELETE', uri);
279-
// String? token = authLocalRepository.getToken();
279+
// String? token = _ref.read(tokenProvider);
280280
// if (token != null) {
281281
// request.headers['Authorization'] = 'Bearer $token';
282282
// }

0 commit comments

Comments
 (0)