Initial commit
This commit is contained in:
commit
af3b49f756
16065 files changed
+2938410
No files matched your search
@@ -0,0 +1,39 @@
|
||||
/* Metro module 15690; source: modules/dm_settings_upsell/DmSettingsUpsellActionCreators.native.tsx; dependencies: [15691, 587, 4080, 15692, 1962, 15693, 2] */
|
||||
function _fun120383(global, require, importDefault, importAll, module, exports, dependencyMap) { // fn#120383, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:15898:6, offset: 0x02529a8c, size: 141 bytes, params: 8, frame: 18
|
||||
var object2;
|
||||
const env0_0 = require;
|
||||
const Object = global.Object;
|
||||
Object.defineProperty(exports, '__esModule', {value: true});
|
||||
const dmSettingsUpsellConstantsModule = require(15691) /* metro dependency 15691: DmSettingsUpsellConstants */;
|
||||
const env0_3 = dmSettingsUpsellConstantsModule.DM_SETTINGS_UPSELL_LAST_SHOWN_KEY;
|
||||
const env0_4 = dmSettingsUpsellConstantsModule.DM_SETTINGS_UPSELL_LAST_SHOWN_MAX_TIME_MS;
|
||||
object2 = {openDmSettingsUpsellModal: openDmSettingsUpsellModal};
|
||||
(require(2) /* metro dependency 2 */).fileFinishedImporting('modules/dm_settings_upsell/DmSettingsUpsellActionCreators.native.tsx');
|
||||
exports.default = object2;
|
||||
}
|
||||
|
||||
function openDmSettingsUpsellModal(a0) { // fn#120384, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:15898:193, offset: 0x02529b19, size: 249 bytes, params: 2, frame: 22
|
||||
var defaultImport;
|
||||
var moduleValue;
|
||||
const Storage = require(dependencyMap[1]).Storage;
|
||||
const value2 = Storage.get(DM_SETTINGS_UPSELL_LAST_SHOWN_KEY);
|
||||
const Date = global.Date;
|
||||
const value3 = Date.now();
|
||||
if (value2 == null) {
|
||||
defaultImport = importDefault(dependencyMap[2]);
|
||||
defaultImport.openLazy(require(dependencyMap[4])(dependencyMap[3], dependencyMap.paths),
|
||||
'dm_settings_upsell_modal',
|
||||
{guildId: a0});
|
||||
Storage.set(DM_SETTINGS_UPSELL_LAST_SHOWN_KEY, value3);
|
||||
} else if (value3 - value2 > DM_SETTINGS_UPSELL_LAST_SHOWN_MAX_TIME_MS) {
|
||||
defaultImport = importDefault(dependencyMap[2]);
|
||||
defaultImport.openLazy(require(dependencyMap[4])(dependencyMap[3], dependencyMap.paths),
|
||||
'dm_settings_upsell_modal',
|
||||
{guildId: a0});
|
||||
Storage.set(DM_SETTINGS_UPSELL_LAST_SHOWN_KEY, value3);
|
||||
} else {
|
||||
moduleValue = require(dependencyMap[5]);
|
||||
moduleValue.trackEvent(require(dependencyMap[5]).DmUpsellActionTypes.SUPPRESSED_BY_COOLDOWN, a0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
/* Metro module 15691; source: modules/dm_settings_upsell/DmSettingsUpsellConstants.tsx; dependencies: [2] */
|
||||
function _fun120385(global, require, importDefault, importAll, module, exports, dependencyMap) { // fn#120385, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:15899:6, offset: 0x02529c12, size: 96 bytes, params: 8, frame: 15
|
||||
const Object = global.Object;
|
||||
Object.defineProperty(exports, '__esModule', {value: true});
|
||||
(require(2) /* metro dependency 2 */).fileFinishedImporting('modules/dm_settings_upsell/DmSettingsUpsellConstants.tsx');
|
||||
exports.DM_SETTINGS_UPSELL_LAST_SHOWN_KEY = 'dmSettingsUpsellLastShown';
|
||||
exports.DM_SETTINGS_UPSELL_LAST_SHOWN_MAX_TIME_MS = 604800000;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,89 @@
|
||||
/* Metro module 15689; source: modules/dm_settings_upsell/DmSettingsUpsellManager.tsx; dependencies: [6, 7, 15, 17, 18, 661, 15690, 4860, 507, 2] */
|
||||
function _fun120375(global, require, importDefault, importAll, module, exports, dependencyMap) { // fn#120375, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:15897:6, offset: 0x025297cb, size: 265 bytes, params: 8, frame: 19
|
||||
const env0_0 = require;
|
||||
const Object = global.Object;
|
||||
Object.defineProperty(exports, '__esModule', {value: true});
|
||||
const env0_3 = importDefault(6) /* metro dependency 6 */;
|
||||
const env0_4 = importDefault(7) /* metro dependency 7 */;
|
||||
const env0_5 = importDefault(15) /* metro dependency 15 */;
|
||||
const env0_6 = importDefault(17) /* metro dependency 17 */;
|
||||
const env0_7 = importDefault(18) /* metro dependency 18 */;
|
||||
const env0_8 = (require(661) /* metro dependency 661: Constants */).Endpoints;
|
||||
let value = importDefault(4860) /* metro dependency 4860: AutomaticLifecycleManager */;
|
||||
value = _fun120379(value);
|
||||
value = new value();
|
||||
(require(2) /* metro dependency 2 */).fileFinishedImporting('modules/dm_settings_upsell/DmSettingsUpsellManager.tsx');
|
||||
exports.default = value;
|
||||
exports.acknowledgeDmSettingsUpsell = function(a0) {
|
||||
var HTTP = require(dependencyMap[8]).HTTP;
|
||||
var object = {};
|
||||
object.url = Endpoints.DM_SETTINGS_UPSELL_ACK(a0);
|
||||
object.rejectWithError = false;
|
||||
return HTTP.post(object);
|
||||
};
|
||||
}
|
||||
|
||||
function _isNativeReflectConstruct_120376() { // fn#120376, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:15897:168, offset: 0x025298d4, size: 98 bytes, params: 1, frame: 18
|
||||
var Boolean;
|
||||
var prototype;
|
||||
var valueOf;
|
||||
var call;
|
||||
var Reflect;
|
||||
var construct;
|
||||
var closure;
|
||||
var value;
|
||||
var error;
|
||||
try {
|
||||
Boolean = global.Boolean;
|
||||
prototype = Boolean.prototype;
|
||||
valueOf = prototype.valueOf;
|
||||
call = valueOf.call;
|
||||
Reflect = global.Reflect;
|
||||
construct = Reflect.construct;
|
||||
Boolean = global.Boolean;
|
||||
closure = function() {
|
||||
};
|
||||
value = Reflect.apply(construct, Reflect, [Boolean, [], closure]);
|
||||
value = Reflect.apply(call, valueOf, [value]);
|
||||
var result = !value;
|
||||
} catch (error) {
|
||||
}
|
||||
return (_isNativeReflectConstruct_120376_isNativeReflectConstruct = function() {
|
||||
return !!result;
|
||||
})();
|
||||
}
|
||||
|
||||
function _fun120379(a0) { // fn#120379, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:15897:371, offset: 0x02529936, size: 74 bytes, params: 2, frame: 15
|
||||
const closure = DmSettingsUpsellManager;
|
||||
env0_7(closure, a0);
|
||||
return env0_4(closure, [{key: 'handleDmSettingsUpsellShow', value: value_120381}]);
|
||||
}
|
||||
|
||||
function DmSettingsUpsellManager(a0) { // fn#120380, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:15897:383, offset: 0x02529980, size: 149 bytes, params: 2, frame: 19
|
||||
var r0;
|
||||
var Reflect;
|
||||
let value = copyRestArgs(0, undefined);
|
||||
let binding = env1_3;
|
||||
binding(this, DmSettingsUpsellManager);
|
||||
const items = [];
|
||||
arraySpread(items, value, 0, items);
|
||||
value = env1_6(DmSettingsUpsellManager);
|
||||
binding = env1_5;
|
||||
if (_isNativeReflectConstruct_120376()) {
|
||||
Reflect = global.Reflect;
|
||||
value = Reflect.construct(value, items, env1_6(this).constructor);
|
||||
r0 = value;
|
||||
} else {
|
||||
value = value.apply(this, items);
|
||||
r0 = value;
|
||||
}
|
||||
value = binding(this, r0);
|
||||
value.actions = {DM_SETTINGS_UPSELL_SHOW: value.handleDmSettingsUpsellShow};
|
||||
return value;
|
||||
}
|
||||
|
||||
function value_120381({guildId}) { // fn#120381, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:15897:808, offset: 0x02529a15, size: 46 bytes, params: 2, frame: 12
|
||||
const value = environment.__proto__;
|
||||
(importDefault(15690) /* metro dependency 15690: DmSettingsUpsellActionCreatorsNative */).openDmSettingsUpsellModal(guildId);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
/* Metro module 15693; source: modules/dm_settings_upsell/DmSettingsUpsellUtils.tsx; dependencies: [661, 683, 2] */
|
||||
function _fun120394(global, require, importDefault, importAll, module, exports, dependencyMap) { // fn#120394, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:15901:6, offset: 0x0252a4ef, size: 188 bytes, params: 8, frame: 18
|
||||
const Object = global.Object;
|
||||
Object.defineProperty(exports, '__esModule', {value: true});
|
||||
const env0_2 = (require(661) /* metro dependency 661: Constants */).AnalyticEvents;
|
||||
(require(2) /* metro dependency 2 */).fileFinishedImporting('modules/dm_settings_upsell/DmSettingsUpsellUtils.tsx');
|
||||
exports.trackEvent = function(a0, a1) {
|
||||
var defaultImport = importDefault(dependencyMap[1]);
|
||||
var DM_SETTINGS_UPSELL_ACTION = AnalyticEvents.DM_SETTINGS_UPSELL_ACTION;
|
||||
defaultImport.track(DM_SETTINGS_UPSELL_ACTION, {action: a0, guild_id: a1});
|
||||
};
|
||||
exports.DmUpsellActionTypes = {MODAL_VIEWED: 'modal_viewed', MODAL_DISMISSED: 'modal_dismissed',
|
||||
MODAL_GUILD_SETTINGS_CLICKED: 'modal_guild_settings_clicked', SUPPRESSED_BY_COOLDOWN: 'suppressed_by_cooldown',
|
||||
MODAL_DISABLED_DMS: 'modal_disabled_dms'};
|
||||
}
|
||||
|
||||
@@ -0,0 +1,167 @@
|
||||
/* Metro module 15692; source: modules/dm_settings_upsell/native/DmSettingsUpsellActionSheet.tsx; dependencies: [31, 27, 1867, 33, 4501, 697, 566, 15689, 15693, 6805, 11300, 4573, 1244, 6819, 4578, 7004, 3829, 3857, 8096, 4080, 6766, 12681, 2] */
|
||||
function _fun120386(global, require, importDefault, importAll, module, exports, dependencyMap) { // fn#120386, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:15900:6, offset: 0x02529c72, size: 540 bytes, params: 8, frame: 23
|
||||
var object3;
|
||||
const env0_0 = require;
|
||||
const Object = global.Object;
|
||||
Object.defineProperty(exports, '__esModule', {value: true});
|
||||
const env0_3 = importAll(31) /* metro dependency 31 */;
|
||||
let value = require(27) /* metro dependency 27 */;
|
||||
const env0_4 = value.View;
|
||||
const env0_5 = value.Image;
|
||||
const guildStore = importDefault(1867) /* metro dependency 1867: GuildStore */;
|
||||
value = require(33) /* metro dependency 33 */;
|
||||
const env0_7 = value.jsx;
|
||||
const env0_8 = value.jsxs;
|
||||
value = require(4501) /* metro dependency 4501: createStyles */;
|
||||
const createStyles = value.createStyles;
|
||||
object3 = {};
|
||||
const object4 = {};
|
||||
let PX_12 = (importDefault(697) /* metro dependency 697: native */).space.PX_12;
|
||||
object4.paddingVertical = PX_12;
|
||||
const PX_8 = (importDefault(697) /* metro dependency 697: native */).space.PX_8;
|
||||
object4.gap = PX_8;
|
||||
object3.container = object4;
|
||||
object3.headerImage = {'alignSelf': 'center', 'width': 73, 'height': 86};
|
||||
object3.title = {'textAlign': 'center', 'alignSelf': 'center', 'width': 250};
|
||||
object3.body = {textAlign: 'center'};
|
||||
let PX_16 = (importDefault(697) /* metro dependency 697: native */).space.PX_16;
|
||||
object3.guildContainer = {paddingVertical: PX_16};
|
||||
const object6 = {'marginTop': null, 'flexDirection': 'row', 'alignItems': 'center'};
|
||||
const PX_4 = (importDefault(697) /* metro dependency 697: native */).space.PX_4;
|
||||
object6.marginTop = PX_4;
|
||||
PX_12 = (importDefault(697) /* metro dependency 697: native */).space.PX_12;
|
||||
object6.gap = PX_12;
|
||||
PX_12 = (importDefault(697) /* metro dependency 697: native */).space.PX_12;
|
||||
object6.padding = PX_12;
|
||||
const BACKGROUND_SURFACE_HIGH = (importDefault(697) /* metro dependency 697: native */).colors.BACKGROUND_SURFACE_HIGH;
|
||||
object6.backgroundColor = BACKGROUND_SURFACE_HIGH;
|
||||
object6.borderRadius = (importDefault(697) /* metro dependency 697: native */).radii.md;
|
||||
object3.guildInfo = object6;
|
||||
PX_16 = (importDefault(697) /* metro dependency 697: native */).space.PX_16;
|
||||
object3.footer = {textAlign: 'center', paddingHorizontal: PX_16};
|
||||
const env0_9 = Reflect.apply(createStyles, value, [object3]);
|
||||
(require(2) /* metro dependency 2 */).fileFinishedImporting('modules/dm_settings_upsell/native/DmSettingsUpsellActionSheet.tsx');
|
||||
exports.default = DmSettingsUpsellActionSheet;
|
||||
}
|
||||
|
||||
function DmSettingsUpsellActionSheet({guildId}) { // fn#120387, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:15900:850, offset: 0x02529e8e, size: 1022 bytes, params: 2, frame: 33
|
||||
var r0;
|
||||
var ActionSheet;
|
||||
var items4;
|
||||
const Text = (require(4573) /* metro dependency 4573: Text */).Text;
|
||||
const intl = (require(1244) /* metro dependency 1244: indexNative */).intl;
|
||||
var string;
|
||||
const t = (require(1244) /* metro dependency 1244: indexNative */).t;
|
||||
var format;
|
||||
var Depjkv;
|
||||
var name;
|
||||
var items2;
|
||||
var items3;
|
||||
const Button = (require(4578) /* metro dependency 4578: ButtonNative */).Button;
|
||||
var object12;
|
||||
var TextWithIOSLinkWorkaround;
|
||||
var value;
|
||||
const styles = useStyles();
|
||||
const guild = (require(566) /* metro dependency 566: flux */).useStateFromStores([GuildStore], function() {
|
||||
return GuildStore.getGuild(guildId);
|
||||
});
|
||||
env0_3.useEffect(_fun120389, [guildId]);
|
||||
if (guild == null) {
|
||||
r0 = null;
|
||||
} else {
|
||||
ActionSheet = (require(6805) /* metro dependency 6805: ActionSheetNative */).ActionSheet;
|
||||
var viewBindingProps = {style: styles.container};
|
||||
value = <Image source={importDefault(11300) /* metro dependency 11300 */} style={styles.headerImage} />;
|
||||
items4 = [value];
|
||||
string = intl.string;
|
||||
items4[1] = <Text variant="heading-lg/bold" color="mobile-text-heading-primary" style={styles.title}>{Reflect.apply(string,
|
||||
|
||||
intl, [t.w2BvnL])}</Text>;
|
||||
format = intl.format;
|
||||
Depjkv = t.Depjkv;
|
||||
name = guild.name;
|
||||
items4[2] = <Text variant="text-md/normal" color="text-default" style={styles.body}>{Reflect.apply(format, intl,
|
||||
[Depjkv, {guild_name: name}])}</Text>;
|
||||
var viewBindingProps2 = {style: styles.guildContainer};
|
||||
string = intl.string;
|
||||
value = <Text variant="eyebrow" color="text-default">{Reflect.apply(string, intl, [t.KPB2iw])}</Text>;
|
||||
items2 = [value];
|
||||
var viewBindingProps3 = {style: styles.guildInfo};
|
||||
value = importDefault(6819) /* metro dependency 6819: GuildIcon */;
|
||||
value = ((Component) => <Component guild={guild} size={(require(6819) /* metro dependency 6819: GuildIcon */).GuildIconSizes.SMALL_32} />)(value);
|
||||
items3 = [value];
|
||||
name = guild.name;
|
||||
items3[1] = <Text variant="text-md/semibold" color="mobile-text-heading-primary">{name}</Text>;
|
||||
items2[1] = <View {...viewBindingProps3}>{items3}</View>;
|
||||
items4[3] = <View {...viewBindingProps2}>{items2}</View>;
|
||||
items4[4] = <Button size="lg" onPress={onPress_120390} text={intl.string(t.TD7iUx)} />;
|
||||
items4[5] = <Button size="lg" variant="secondary" onPress={onPress_120392} text={intl.string(t.PsWbcp)} />;
|
||||
TextWithIOSLinkWorkaround = (require(6766) /* metro dependency 6766: TextWithIOSLinkWorkaround */).TextWithIOSLinkWorkaround;
|
||||
format = intl.format;
|
||||
items4[6] = <TextWithIOSLinkWorkaround variant="text-xs/normal" style={styles.footer}>{Reflect.apply(format,
|
||||
intl,
|
||||
[t.IzZxXW, {onClick: onClick_120393}])}</TextWithIOSLinkWorkaround>;
|
||||
value = <ActionSheet startExpanded><View {...viewBindingProps}>{items4}</View></ActionSheet>;
|
||||
r0 = value;
|
||||
}
|
||||
return r0;
|
||||
}
|
||||
|
||||
function _fun120389() { // fn#120389, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:15900:984, offset: 0x0252a28c, size: 90 bytes, params: 1, frame: 16
|
||||
let value = environment.__proto__;
|
||||
value = require(15689) /* metro dependency 15689: DmSettingsUpsellManager */;
|
||||
const acknowledgeDmSettingsUpsell = value.acknowledgeDmSettingsUpsell;
|
||||
const guildIdBinding = guildId;
|
||||
Reflect.apply(acknowledgeDmSettingsUpsell, value, [guildIdBinding]);
|
||||
value = require(15693) /* metro dependency 15693: DmSettingsUpsellUtils */;
|
||||
const trackEvent = value.trackEvent;
|
||||
const DmUpsellActionTypes = (require(15693) /* metro dependency 15693: DmSettingsUpsellUtils */).DmUpsellActionTypes;
|
||||
const MODAL_VIEWED = DmUpsellActionTypes.MODAL_VIEWED;
|
||||
Reflect.apply(trackEvent, value, [MODAL_VIEWED, guildIdBinding]);
|
||||
}
|
||||
|
||||
function DmSettingsUpsellActionSheetOnPress() { // fn#120390, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:15900:1906, owner: DmSettingsUpsellActionSheet.onPress, offset: 0x0252a2e6, size: 191 bytes, params: 1, frame: 19
|
||||
var environment;
|
||||
let value = environment.__proto__;
|
||||
const sanitizedRestrictedGuilds = (require(7004) /* metro dependency 7004: UserSettingsUtils */).getSanitizedRestrictedGuilds();
|
||||
const add = sanitizedRestrictedGuilds.add;
|
||||
const guildIdBinding = guildId;
|
||||
Reflect.apply(add, sanitizedRestrictedGuilds, [guildIdBinding]);
|
||||
const RestrictedGuildIds = (require(3829) /* metro dependency 3829: UserSettings */).RestrictedGuildIds;
|
||||
const updateSetting = RestrictedGuildIds.updateSetting;
|
||||
const Array = global.Array;
|
||||
Reflect.apply(updateSetting, RestrictedGuildIds, [Array.from(sanitizedRestrictedGuilds)]).then(function() {
|
||||
var defaultImport = importDefault(dependencyMap[17]);
|
||||
var object = {key: 'DM_SETTINGS_UPSELL_SUCCESS_TOAST', icon: importDefault(dependencyMap[18])};
|
||||
object.content = require(dependencyMap[12]).intl.string(require(dependencyMap[12]).t.rlYD1W);
|
||||
defaultImport.open(object);
|
||||
});
|
||||
(importDefault(4080) /* metro dependency 4080: ActionSheetActionCreators */).hideActionSheet();
|
||||
value = require(15693) /* metro dependency 15693: DmSettingsUpsellUtils */;
|
||||
const trackEvent = value.trackEvent;
|
||||
const DmUpsellActionTypes = (require(15693) /* metro dependency 15693: DmSettingsUpsellUtils */).DmUpsellActionTypes;
|
||||
const MODAL_DISABLED_DMS = DmUpsellActionTypes.MODAL_DISABLED_DMS;
|
||||
Reflect.apply(trackEvent, value, [MODAL_DISABLED_DMS, guildIdBinding]);
|
||||
}
|
||||
|
||||
function DmSettingsUpsellActionSheetOnPress_120392() { // fn#120392, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:15900:2356, owner: DmSettingsUpsellActionSheet.onPress, offset: 0x0252a420, size: 93 bytes, params: 1, frame: 15
|
||||
let value = environment.__proto__;
|
||||
(importDefault(4080) /* metro dependency 4080: ActionSheetActionCreators */).hideActionSheet();
|
||||
value = require(15693) /* metro dependency 15693: DmSettingsUpsellUtils */;
|
||||
const trackEvent = value.trackEvent;
|
||||
const DmUpsellActionTypes = (require(15693) /* metro dependency 15693: DmSettingsUpsellUtils */).DmUpsellActionTypes;
|
||||
const MODAL_DISMISSED = DmUpsellActionTypes.MODAL_DISMISSED;
|
||||
Reflect.apply(trackEvent, value, [MODAL_DISMISSED, guildId]);
|
||||
}
|
||||
|
||||
function DmSettingsUpsellActionSheetOnClick() { // fn#120393, source: /ci/build/discord/discord/discord_android_rn/android/app/src/main/assets/index.android.bundle:15900:2637, owner: DmSettingsUpsellActionSheet.onClick, offset: 0x0252a47d, size: 114 bytes, params: 1, frame: 16
|
||||
let value = environment.__proto__;
|
||||
(importDefault(4080) /* metro dependency 4080: ActionSheetActionCreators */).hideActionSheet();
|
||||
(importDefault(12681) /* metro dependency 12681: openGuildActionSheet */)(guild);
|
||||
value = require(15693) /* metro dependency 15693: DmSettingsUpsellUtils */;
|
||||
const trackEvent = value.trackEvent;
|
||||
const DmUpsellActionTypes = (require(15693) /* metro dependency 15693: DmSettingsUpsellUtils */).DmUpsellActionTypes;
|
||||
const MODAL_GUILD_SETTINGS_CLICKED = DmUpsellActionTypes.MODAL_GUILD_SETTINGS_CLICKED;
|
||||
Reflect.apply(trackEvent, value, [MODAL_GUILD_SETTINGS_CLICKED, guildId]);
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user