mirror of
https://github.com/vector-im/element-ios.git
synced 2024-09-29 07:42:40 +00:00
Send sticker: IntegrationManagerVC: add the ability to set a user widget
https://github.com/vector-im/riot-ios/issues/1860
This commit is contained in:
parent
6f893c9522
commit
9fb5930d02
2 changed files with 130 additions and 56 deletions
|
@ -37,4 +37,12 @@ FOUNDATION_EXPORT NSString *const kIntegrationManagerAddIntegrationScreen;
|
|||
*/
|
||||
- (instancetype)initForMXSession:(MXSession*)mxSession inRoom:(NSString*)roomId screen:(NSString*)screen widgetId:(NSString*)widgetId;
|
||||
|
||||
/**
|
||||
Get the integration manager settings screen for a given widget type.
|
||||
|
||||
@param widgetType the widget type.
|
||||
@return the screen id for that widget type.
|
||||
*/
|
||||
+ (NSString*)screenForWidget:(NSString*)widgetType;
|
||||
|
||||
@end
|
||||
|
|
|
@ -50,6 +50,11 @@ NSString *const kIntegrationManagerAddIntegrationScreen = @"add_integ";
|
|||
return self;
|
||||
}
|
||||
|
||||
+ (NSString*)screenForWidget:(NSString*)widgetType
|
||||
{
|
||||
return [NSString stringWithFormat:@"type_%@", widgetType];
|
||||
}
|
||||
|
||||
- (void)destroy
|
||||
{
|
||||
[super destroy];
|
||||
|
@ -147,8 +152,25 @@ NSString *const kIntegrationManagerAddIntegrationScreen = @"add_integ";
|
|||
|
||||
if (!roomIdInEvent)
|
||||
{
|
||||
[self sendLocalisedError:@"widget_integration_missing_room_id" toRequest:requestId];
|
||||
return;
|
||||
// These APIs don't require roomId
|
||||
// Get and set user widgets (not associated with a specific room)
|
||||
// If roomId is specified, it must be validated, so room-based widgets agreed
|
||||
// handled further down.
|
||||
if ([@"set_widget" isEqualToString:action])
|
||||
{
|
||||
[self setWidget:requestId data:requestData];
|
||||
return;
|
||||
}
|
||||
else if ([@"get_widgets" isEqualToString:action])
|
||||
{
|
||||
[self getWidgets:requestId data:requestData];
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
[self sendLocalisedError:@"widget_integration_missing_room_id" toRequest:requestId];
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (![roomIdInEvent isEqualToString:roomId])
|
||||
|
@ -157,7 +179,6 @@ NSString *const kIntegrationManagerAddIntegrationScreen = @"add_integ";
|
|||
return;
|
||||
}
|
||||
|
||||
|
||||
// These APIs don't require userId
|
||||
if ([@"join_rules_state" isEqualToString:action])
|
||||
{
|
||||
|
@ -281,75 +302,120 @@ NSString *const kIntegrationManagerAddIntegrationScreen = @"add_integ";
|
|||
|
||||
- (void)setWidget:(NSString*)requestId data:(NSDictionary*)requestData
|
||||
{
|
||||
NSLog(@"[IntegrationManagerVC] Received request to set widget in room %@.", roomId);
|
||||
NSLog(@"[IntegrationManagerVC] Received request to set widget");
|
||||
|
||||
MXRoom *room = [self roomCheckForRequest:requestId data:requestData];
|
||||
NSString *widget_id, *widgetType, *widgetUrl;
|
||||
NSString *widgetName; // optional
|
||||
NSDictionary *widgetData ; // optional
|
||||
BOOL userWidget = NO;
|
||||
|
||||
if (room)
|
||||
MXJSONModelSetString(widget_id, requestData[@"widget_id"]);
|
||||
MXJSONModelSetString(widgetType, requestData[@"type"]);
|
||||
MXJSONModelSetString(widgetUrl, requestData[@"url"]);
|
||||
MXJSONModelSetString(widgetName, requestData[@"name"]);
|
||||
MXJSONModelSetDictionary(widgetData, requestData[@"data"]);
|
||||
MXJSONModelSetBoolean(userWidget, requestData[@"userWidget"]);
|
||||
|
||||
if (!widget_id)
|
||||
{
|
||||
NSString *widget_id, *widgetType, *widgetUrl;
|
||||
NSString *widgetName; // optional
|
||||
NSDictionary *widgetData ; // optional
|
||||
[self sendLocalisedError:@"widget_integration_unable_to_create" toRequest:requestId]; // new Error("Missing required widget fields."));
|
||||
return;
|
||||
}
|
||||
|
||||
MXJSONModelSetString(widget_id, requestData[@"widget_id"]);
|
||||
MXJSONModelSetString(widgetType, requestData[@"type"]);
|
||||
MXJSONModelSetString(widgetUrl, requestData[@"url"]);
|
||||
MXJSONModelSetString(widgetName, requestData[@"name"]);
|
||||
MXJSONModelSetDictionary(widgetData, requestData[@"data"]);
|
||||
if (!widgetType)
|
||||
{
|
||||
[self sendLocalisedError:@"widget_integration_unable_to_create" toRequest:requestId];
|
||||
return;
|
||||
}
|
||||
|
||||
if (!widget_id)
|
||||
NSMutableDictionary *widgetEventContent = [NSMutableDictionary dictionary];
|
||||
if (widgetUrl)
|
||||
{
|
||||
widgetEventContent[@"type"] = widgetType;
|
||||
widgetEventContent[@"url"] = widgetUrl;
|
||||
|
||||
if (widgetName)
|
||||
{
|
||||
[self sendLocalisedError:@"widget_integration_unable_to_create" toRequest:requestId]; // new Error("Missing required widget fields."));
|
||||
return;
|
||||
widgetEventContent[@"name"] = widgetName;
|
||||
}
|
||||
if (widgetData)
|
||||
{
|
||||
widgetEventContent[@"data"] = widgetData;
|
||||
}
|
||||
}
|
||||
// else this is a deletion
|
||||
|
||||
NSMutableDictionary *widgetEventContent = [NSMutableDictionary dictionary];
|
||||
__weak __typeof__(self) weakSelf = self;
|
||||
|
||||
if (userWidget)
|
||||
{
|
||||
// Update the user account data
|
||||
NSMutableDictionary *userWidgets = [NSMutableDictionary dictionaryWithDictionary:[mxSession.accountData accountDataForEventType:kMXAccountDataTypeUserWidgets]];
|
||||
|
||||
// Delete existing widget with ID
|
||||
[userWidgets removeObjectForKey:widget_id];
|
||||
|
||||
// Add new widget / update
|
||||
if (widgetUrl)
|
||||
{
|
||||
if (!widgetType)
|
||||
{
|
||||
[self sendLocalisedError:@"widget_integration_unable_to_create" toRequest:requestId];
|
||||
return;
|
||||
}
|
||||
|
||||
widgetEventContent[@"type"] = widgetType;
|
||||
widgetEventContent[@"url"] = widgetUrl;
|
||||
|
||||
if (widgetName)
|
||||
{
|
||||
widgetEventContent[@"name"] = widgetName;
|
||||
}
|
||||
if (widgetData)
|
||||
{
|
||||
widgetEventContent[@"data"] = widgetData;
|
||||
}
|
||||
userWidgets[widget_id] = @{
|
||||
@"content": widgetEventContent,
|
||||
@"sender": mxSession.myUser.userId,
|
||||
@"state_key": widget_id,
|
||||
@"type": kWidgetMatrixEventTypeString,
|
||||
@"id": widget_id,
|
||||
};
|
||||
}
|
||||
|
||||
__weak __typeof__(self) weakSelf = self;
|
||||
[mxSession setAccountData:userWidgets forType:kMXAccountDataTypeUserWidgets success:^{
|
||||
|
||||
// TODO: Move to kWidgetMatrixEventTypeString ("m.widget") type but when?
|
||||
[room sendStateEventOfType:kWidgetModularEventTypeString
|
||||
content:widgetEventContent
|
||||
stateKey:widget_id
|
||||
success:^(NSString *eventId) {
|
||||
typeof(self) self = weakSelf;
|
||||
if (self)
|
||||
{
|
||||
[self sendNSObjectResponse:@{
|
||||
@"success": @(YES)
|
||||
}
|
||||
toRequest:requestId];
|
||||
}
|
||||
} failure:^(NSError *error) {
|
||||
|
||||
typeof(self) self = weakSelf;
|
||||
if (self)
|
||||
{
|
||||
[self sendNSObjectResponse:@{
|
||||
@"success": @(YES)
|
||||
}
|
||||
toRequest:requestId];
|
||||
typeof(self) self = weakSelf;
|
||||
if (self)
|
||||
{
|
||||
[self sendLocalisedError:@"widget_integration_unable_to_create" toRequest:requestId];
|
||||
}
|
||||
}];
|
||||
}
|
||||
else
|
||||
{
|
||||
// Room widget
|
||||
MXRoom *room = [self roomCheckForRequest:requestId data:requestData];
|
||||
if (room)
|
||||
{
|
||||
// TODO: Move to kWidgetMatrixEventTypeString ("m.widget") type but when?
|
||||
[room sendStateEventOfType:kWidgetModularEventTypeString
|
||||
content:widgetEventContent
|
||||
stateKey:widget_id
|
||||
success:^(NSString *eventId) {
|
||||
|
||||
typeof(self) self = weakSelf;
|
||||
if (self)
|
||||
{
|
||||
[self sendNSObjectResponse:@{
|
||||
@"success": @(YES)
|
||||
}
|
||||
toRequest:requestId];
|
||||
}
|
||||
}
|
||||
}
|
||||
failure:^(NSError *error) {
|
||||
failure:^(NSError *error) {
|
||||
|
||||
typeof(self) self = weakSelf;
|
||||
if (self)
|
||||
{
|
||||
[self sendLocalisedError:@"widget_integration_failed_to_send_request" toRequest:requestId];
|
||||
}
|
||||
}];
|
||||
typeof(self) self = weakSelf;
|
||||
if (self)
|
||||
{
|
||||
[self sendLocalisedError:@"widget_integration_failed_to_send_request" toRequest:requestId];
|
||||
}
|
||||
}];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue