iykyk_msn/mobile/lib/core/msn_api.dart

138 lines
4.6 KiB
Dart

import 'package:dio/dio.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../models/context_member_model.dart';
import '../models/context_model.dart';
import '../models/message_model.dart';
import '../models/profile_model.dart';
import '../models/room_model.dart';
import 'api_client.dart';
final msnApiProvider = Provider<MsnApi>((ref) => MsnApi(ref.watch(dioProvider)));
class MsnApi {
MsnApi(this._dio);
final Dio _dio;
Future<List<ContextModel>> listContexts() async {
final res = await _dio.get<Map<String, dynamic>>('/api/contexts');
final list = res.data!['contexts'] as List<dynamic>;
return list.map((e) => ContextModel.fromJson(e as Map<String, dynamic>)).toList();
}
Future<ContextModel> createContext({required String name, String kind = 'work'}) async {
final res = await _dio.post<Map<String, dynamic>>(
'/api/contexts',
data: {'name': name, 'kind': kind},
);
final d = res.data!;
return ContextModel(
id: d['id'] as String,
name: d['name'] as String,
kind: d['kind'] as String,
);
}
Future<void> inviteToContext(String contextId, String email) async {
await _dio.post('/api/contexts/$contextId/members', data: {'email': email});
}
Future<List<ContextMember>> listContextMembers(String contextId) async {
final res = await _dio.get<Map<String, dynamic>>('/api/contexts/$contextId/members');
final list = res.data!['members'] as List<dynamic>? ?? [];
return list.map((e) => ContextMember.fromJson(e as Map<String, dynamic>)).toList();
}
Future<ProfileModel> getMyProfile(String contextId) async {
final res = await _dio.get<Map<String, dynamic>>(
'/api/profiles/me',
queryParameters: {'contextId': contextId},
);
return ProfileModel.fromJson(res.data!);
}
Future<ProfileModel> getUserProfile(String contextId, String userId) async {
final res = await _dio.get<Map<String, dynamic>>(
'/api/profiles/user/$userId',
queryParameters: {'contextId': contextId},
);
return ProfileModel.fromJson(res.data!);
}
Future<void> updateMyProfile(
String contextId, {
String? displayName,
String? statusMessage,
}) async {
await _dio.patch(
'/api/profiles/me',
queryParameters: {'contextId': contextId},
data: {
if (displayName != null) 'displayName': displayName,
if (statusMessage != null) 'statusMessage': statusMessage,
},
);
}
Future<List<RoomModel>> listRooms(String contextId) async {
final res = await _dio.get<Map<String, dynamic>>(
'/api/rooms',
queryParameters: {'contextId': contextId},
);
final list = res.data!['rooms'] as List<dynamic>? ?? [];
return list.map((e) => RoomModel.fromJson(e as Map<String, dynamic>)).toList();
}
Future<String> openDirectRoom(String contextId, String otherUserId) async {
final res = await _dio.post<Map<String, dynamic>>(
'/api/rooms/direct',
data: {'contextId': contextId, 'otherUserId': otherUserId},
);
return res.data!['roomId'] as String;
}
Future<List<MessageModel>> fetchMessages(String roomId, {String? before}) async {
final res = await _dio.get<Map<String, dynamic>>(
'/api/messages',
queryParameters: {
'roomId': roomId,
'limit': 50,
if (before != null) 'before': before,
},
);
final list = res.data!['messages'] as List<dynamic>? ?? [];
return list.map((e) => MessageModel.fromJson(e as Map<String, dynamic>)).toList();
}
Future<void> registerPushToken(String token, {String platform = 'fcm'}) async {
await _dio.post('/api/push/register', data: {'token': token, 'platform': platform});
}
Future<String> createGroupRoom(String contextId, String name, List<String> memberIds) async {
final res = await _dio.post<Map<String, dynamic>>(
'/api/rooms/group',
data: {'contextId': contextId, 'name': name, 'memberIds': memberIds},
);
return res.data!['roomId'] as String;
}
Future<List<Map<String, dynamic>>> searchMessages(String contextId, String q) async {
final res = await _dio.get<Map<String, dynamic>>(
'/api/messages/search',
queryParameters: {'contextId': contextId, 'q': q},
);
final list = res.data!['results'] as List<dynamic>? ?? [];
return list.cast<Map<String, dynamic>>();
}
/// Latest message id read by the other participant in a 1:1 room (null if none / group).
Future<String?> getReadState(String roomId) async {
final res = await _dio.get<Map<String, dynamic>>(
'/api/messages/read-state',
queryParameters: {'roomId': roomId},
);
return res.data!['lastReadMessageId'] as String?;
}
}