Skip to content

Commit

Permalink
feat: support discord share for android and ios (#1525)
Browse files Browse the repository at this point in the history
Co-authored-by: liuhengkang <hengkang.liu@js.design>
  • Loading branch information
Dokome and liuhengkang committed Apr 23, 2024
1 parent cba6206 commit ba75bd8
Show file tree
Hide file tree
Showing 9 changed files with 133 additions and 1 deletion.
6 changes: 5 additions & 1 deletion android/src/main/java/cl/json/RNShareImpl.java
Expand Up @@ -34,6 +34,7 @@
import cl.json.social.MessengerShare;
import cl.json.social.LinkedinShare;
import cl.json.social.ViberShare;
import cl.json.social.DiscordShare;

import java.util.HashMap;
import java.util.Locale;
Expand Down Expand Up @@ -90,7 +91,8 @@ private enum SHARES {
sms,
linkedin,
telegram,
viber;
viber,
discord;


public static ShareIntent getShareClass(String social, ReactApplicationContext reactContext) {
Expand Down Expand Up @@ -132,6 +134,8 @@ public static ShareIntent getShareClass(String social, ReactApplicationContext r
return new TelegramShare(reactContext);
case viber:
return new ViberShare(reactContext);
case discord:
return new DiscordShare(reactContext);
default:
return null;
}
Expand Down
43 changes: 43 additions & 0 deletions android/src/main/java/cl/json/social/DiscordShare.java
@@ -0,0 +1,43 @@
package cl.json.social;

import android.content.ActivityNotFoundException;
import android.content.Intent;
import java.io.File;
import android.os.Environment;
import android.net.Uri;

import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReadableMap;


public class DiscordShare extends SingleShareIntent {

private static final String PACKAGE = "com.discord";
private static final String PLAY_STORE_LINK = "https://play.google.com/store/apps/details?id=com.discord";

public DiscordShare(ReactApplicationContext reactContext) {
super(reactContext);
}

@Override
public void open(ReadableMap options) throws ActivityNotFoundException {
super.open(options);
// extra params here
this.openIntentChooser();
}

@Override
protected String getPackage() {
return PACKAGE;
}

@Override
protected String getDefaultWebLink() {
return null;
}

@Override
protected String getPlayStoreLink() {
return PLAY_STORE_LINK;
}
}
1 change: 1 addition & 0 deletions codegenSpec/NativeRNShare.ts
Expand Up @@ -25,6 +25,7 @@ export interface Spec extends TurboModule {
SHARE_BACKGROUND_AND_STICKER_IMAGE?: string;
SMS?: string;
GENERIC?: string;
DISCORD?: string;
};
open: (options: Object) => Promise<{ success: boolean; message: string }>;
shareSingle: (options: Object) => Promise<{ success: boolean; message: string }>;
Expand Down
20 changes: 20 additions & 0 deletions example/App.js
Expand Up @@ -343,6 +343,23 @@ const App = () => {
}
};

const shareToDiscord = async () => {
const shareOptions = {
message: 'Example Discord',
url: 'https://google.com',
social: Share.Social.DISCORD,
};

try {
const ShareResponse = await Share.shareSingle(shareOptions);
console.log('Response =>', ShareResponse);
setResult(JSON.stringify(ShareResponse, null, 2));
} catch (error) {
console.log('Error =>', error);
setResult('error: '.concat(getErrorString(error)));
}
};

const sharePdfBase64 = async () => {
const shareOptions = {
title: '',
Expand Down Expand Up @@ -413,6 +430,9 @@ const App = () => {
<View style={styles.button}>
<Button onPress={shareToWhatsApp} title="Share to WhatsApp" />
</View>
<View style={styles.button}>
<Button onPress={shareToDiscord} title="Share to Discord" />
</View>
<View style={styles.button}>
<Button onPress={shareEmailImages} title="Share to Email" />
</View>
Expand Down
15 changes: 15 additions & 0 deletions ios/DiscordShare.h
@@ -0,0 +1,15 @@
#import <UIKit/UIKit.h>
// import RCTConvert
#import <React/RCTConvert.h>
// import RCTBridge
#import <React/RCTBridge.h>
// import RCTUIManager
#import <React/RCTUIManager.h>
// import RCTLog
#import <React/RCTLog.h>
// import RCTUtils
#import <React/RCTUtils.h>
@interface DiscordShare : NSObject <RCTBridgeModule>

- (void) shareSingle:(NSDictionary *)options reject:(RCTPromiseRejectBlock)reject resolve:(RCTPromiseResolveBlock)resolve;
@end
41 changes: 41 additions & 0 deletions ios/DiscordShare.m
@@ -0,0 +1,41 @@
#import "DiscordShare.h"
#import <AVFoundation/AVFoundation.h>
@import Photos;

@implementation DiscordShare
RCT_EXPORT_MODULE();
- (void)shareSingle:(NSDictionary *)options
reject:(RCTPromiseRejectBlock)reject
resolve:(RCTPromiseResolveBlock)resolve {

NSString *text = [RCTConvert NSString:options[@"message"]];
text = (NSString*)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(NULL,(CFStringRef) text, NULL,CFSTR("!*'();:@&=+$,/?%#[]"),kCFStringEncodingUTF8));

NSString *url = [RCTConvert NSString:options[@"url"]];

NSString *discordMsg = [NSString stringWithFormat:@"discord://message?text=%@", text];
NSString *discordMsgUrl = [NSString stringWithFormat:@"discord://message?text=%@&url%@", text, url];

NSString * urlDiscord = url ? discordMsgUrl : discordMsg;
NSURL * shareURL = [NSURL URLWithString:urlDiscord];


if ([[UIApplication sharedApplication] canOpenURL: shareURL]) {
[[UIApplication sharedApplication] openURL: shareURL];
resolve(@[@true, @""]);
} else {
NSString *stringURL = @"https://apps.apple.com/us/app/discord-chat-talk-hangout/id985746746";
NSURL *url = [NSURL URLWithString:stringURL];

[[UIApplication sharedApplication] openURL:url options:@{} completionHandler:^(BOOL success) {}];

NSString *errorMessage = @"Not installed";
NSDictionary *userInfo = @{NSLocalizedFailureReasonErrorKey: NSLocalizedString(errorMessage, nil)};
NSError *error = [NSError errorWithDomain:@"com.rnshare" code:1 userInfo:userInfo];

NSLog(@"%@", errorMessage);
reject(@"Not installed",@"Not installed",error);
}
}

@end
6 changes: 6 additions & 0 deletions ios/RNShare.mm
Expand Up @@ -21,6 +21,7 @@
#import "ViberShare.h"
#import "MessengerShare.h"
#import "SmsShare.h"
#import "DiscordShare.h"
#import "RNShareActivityItemSource.h"
#import "RNShareUtils.h"

Expand Down Expand Up @@ -95,6 +96,7 @@ - (NSDictionary *)constantsToExport
@"MESSENGER": @"messenger",
@"VIBER": @"viber",
@"SMS": @"sms",
@"DISCORD": @"discord",
@"SHARE_BACKGROUND_IMAGE": @"shareBackgroundImage",
@"SHARE_BACKGROUND_VIDEO": @"shareBackgroundVideo",
@"SHARE_STICKER_IMAGE": @"shareStickerImage",
Expand Down Expand Up @@ -169,6 +171,10 @@ - (NSDictionary*) getConstants {
} else if([social isEqualToString:@"sms"]) {
NSLog(@"TRY OPEN sms");
[smsShareCtl shareSingle:options reject: reject resolve: resolve];
} else if([social isEqualToString:@"discord"]) {
NSLog(@"TRY OPEN discord");
DiscordShare *shareCtl = [[DiscordShare alloc] init];
[shareCtl shareSingle:options reject: reject resolve: resolve];
}
} else {
RCTLogError(@"key 'social' missing in options");
Expand Down
1 change: 1 addition & 0 deletions src/index.tsx
Expand Up @@ -42,6 +42,7 @@ const RNShare = {
MESSENGER: NativeRNShare.getConstants().MESSENGER || Social.Messenger,
SNAPCHAT: NativeRNShare.getConstants().SNAPCHAT || Social.Snapchat,
VIBER: NativeRNShare.getConstants().VIBER || Social.Viber,
DISCORD: NativeRNShare.getConstants().DISCORD || Social.Discord,
},

async open(options: ShareOptions) {
Expand Down
1 change: 1 addition & 0 deletions src/types.ts
Expand Up @@ -16,6 +16,7 @@ export enum Social {
Snapchat = 'snapchat',
Messenger = 'messenger',
Viber = 'viber',
Discord = 'discord',
}

export enum ShareAsset {
Expand Down

0 comments on commit ba75bd8

Please sign in to comment.