-
Notifications
You must be signed in to change notification settings - Fork 128
Expand file tree
/
Copy pathFirestackStorage.m
More file actions
139 lines (116 loc) · 5.1 KB
/
FirestackStorage.m
File metadata and controls
139 lines (116 loc) · 5.1 KB
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
//
// FirestackStorage.m
// Firestack
//
// Created by Ari Lerner on 8/24/16.
// Copyright © 2016 Facebook. All rights reserved.
//
#import "FirestackStorage.h"
#import "FirestackEvents.h"
@import FirebaseStorage;
@implementation FirestackStorage
RCT_EXPORT_MODULE(FirestackStorage);
- (void) setStorageUrl:(NSString *)storageBucket
{
NSString *storageUrl = [NSString stringWithFormat:@"gs://%@", storageBucket];
self._storageUrl = storageUrl;
}
//- (NSString *) getStorageUrl
//{
// NSDictionary *cfg = [self getConfig];
// NSString *storageUrl = [NSString stringWithFormat:@"gs://%@", [cfg valueForKey:@"storageBucket"]];
// return storageUrl;
//}
RCT_EXPORT_METHOD(uploadFile:(NSString *) name
path:(NSString *)path
metadata:(NSDictionary *)metadata
callback:(RCTResponseSenderBlock) callback)
{
NSString *urlStr = self._storageUrl;
if (urlStr == nil) {
NSError *err = [[NSError alloc] init];
[err setValue:@"Storage configuration error" forKey:@"name"];
[err setValue:@"Call setStorageUrl() first" forKey:@"description"];
return callback(@[err]);
}
FIRStorageReference *storageRef = [[FIRStorage storage] referenceForURL:urlStr];
FIRStorageReference *uploadRef = [storageRef child:name];
NSURL *localFile = [NSURL fileURLWithPath:path];
FIRStorageMetadata *firmetadata = [[FIRStorageMetadata alloc] initWithDictionary:metadata];
FIRStorageUploadTask *uploadTask = [uploadRef putFile:localFile
metadata:firmetadata];
// Listen for state changes, errors, and completion of the upload.
[uploadTask observeStatus:FIRStorageTaskStatusResume handler:^(FIRStorageTaskSnapshot *snapshot) {
// Upload resumed, also fires when the upload starts
[self sendJSEvent:STORAGE_UPLOAD_RESUMED props:@{
@"ref": snapshot.reference.bucket
}];
}];
[uploadTask observeStatus:FIRStorageTaskStatusPause handler:^(FIRStorageTaskSnapshot *snapshot) {
// Upload paused
[self sendJSEvent:STORAGE_UPLOAD_PAUSED props:@{
@"ref": snapshot.reference.bucket
}];
}];
[uploadTask observeStatus:FIRStorageTaskStatusProgress handler:^(FIRStorageTaskSnapshot *snapshot) {
// Upload reported progress
double percentComplete = 100.0 * (snapshot.progress.completedUnitCount) / (snapshot.progress.totalUnitCount);
[self sendJSEvent:STORAGE_UPLOAD_PROGRESS props:@{
@"progress": @(percentComplete || 0.0)
}];
}];
[uploadTask observeStatus:FIRStorageTaskStatusSuccess handler:^(FIRStorageTaskSnapshot *snapshot) {
// Upload completed successfully
FIRStorageReference *ref = snapshot.reference;
NSDictionary *props = @{
@"fullPath": ref.fullPath,
@"bucket": ref.bucket,
@"name": ref.name,
@"metadata": [snapshot.metadata dictionaryRepresentation]
};
callback(@[[NSNull null], props]);
}];
[uploadTask observeStatus:FIRStorageTaskStatusFailure handler:^(FIRStorageTaskSnapshot *snapshot) {
if (snapshot.error != nil) {
NSError *err = [[NSError alloc] init];
switch (snapshot.error.code) {
case FIRStorageErrorCodeObjectNotFound:
// File doesn't exist
[err setValue:@"File does not exist" forKey:@"description"];
break;
case FIRStorageErrorCodeUnauthorized:
// User doesn't have permission to access file
[err setValue:@"You do not have permissions" forKey:@"description"];
break;
case FIRStorageErrorCodeCancelled:
// User canceled the upload
[err setValue:@"Upload cancelled" forKey:@"description"];
break;
case FIRStorageErrorCodeUnknown:
// Unknown error occurred, inspect the server response
[err setValue:@"Unknown error" forKey:@"description"];
break;
}
callback(@[err]);
}}];
}
// Not sure how to get away from this... yet
- (NSArray<NSString *> *)supportedEvents {
return @[
STORAGE_UPLOAD_PAUSED,
STORAGE_UPLOAD_RESUMED,
STORAGE_UPLOAD_PROGRESS
];
}
- (void) sendJSEvent:(NSString *)title
props:(NSDictionary *)props
{
@try {
[self sendEventWithName:title
body:props];
}
@catch (NSException *err) {
NSLog(@"An error occurred in sendJSEvent: %@", [err debugDescription]);
}
}
@end