Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import 'dart:typed_data';
import 'package:google_sign_in/google_sign_in.dart';
import 'package:googleapis/drive/v3.dart' as drive;
import 'package:http/http.dart' as http;
class GoogleDriveService {
static final GoogleDriveService instance = GoogleDriveService._();
GoogleDriveService._();
final GoogleSignIn _googleSignIn = GoogleSignIn(
scopes: [drive.DriveApi.driveFileScope],
);
GoogleSignInAccount? _currentUser;
Future<GoogleSignInAccount?> signIn() async {
_currentUser = await _googleSignIn.signInSilently();
_currentUser ??= await _googleSignIn.signIn();
return _currentUser;
}
Future<void> signOut() async {
await _googleSignIn.signOut();
_currentUser = null;
}
Future<String?> uploadAsGoogleSheet(List<int> excelBytes, String fileName) async {
_currentUser ??= await signIn();
if (_currentUser == null) return null;
final authHeaders = await _currentUser!.authHeaders;
final authenticatedClient = _AuthenticatedClient(authHeaders);
final driveApi = drive.DriveApi(authenticatedClient);
final fileMetadata = drive.File()
..name = fileName
..mimeType = 'application/vnd.google-apps.spreadsheet';
final media = drive.Media(
Stream.value(Uint8List.fromList(excelBytes)),
excelBytes.length,
contentType: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
);
final result = await driveApi.files.create(
fileMetadata,
uploadMedia: media,
);
authenticatedClient.close();
return result.id;
}
}
class _AuthenticatedClient extends http.BaseClient {
final Map<String, String> _headers;
final http.Client _inner = http.Client();
_AuthenticatedClient(this._headers);
@override
Future<http.StreamedResponse> send(http.BaseRequest request) {
request.headers.addAll(_headers);
return _inner.send(request);
}
@override
void close() {
_inner.close();
}
}