feat(NoAutoReplyMention): exempt users
This commit is contained in:
parent
b84db804ad
commit
c304668b9b
2 changed files with 121 additions and 1 deletions
99
plugins/NoAutoReplyMention/src/Settings.tsx
Normal file
99
plugins/NoAutoReplyMention/src/Settings.tsx
Normal file
|
|
@ -0,0 +1,99 @@
|
||||||
|
import { findByStoreName } from "@vendetta/metro";
|
||||||
|
import { NavigationNative, React, ReactNative, stylesheet } from "@vendetta/metro/common";
|
||||||
|
import { storage } from "@vendetta/plugin";
|
||||||
|
import { useProxy } from "@vendetta/storage";
|
||||||
|
import { getAssetIDByName } from "@vendetta/ui/assets";
|
||||||
|
import { Forms } from "@vendetta/ui/components";
|
||||||
|
import { SettingsSchema } from ".";
|
||||||
|
|
||||||
|
const UserStore = findByStoreName("UserStore");
|
||||||
|
|
||||||
|
const { ScrollView, TouchableOpacity, Image, FlatList } = ReactNative;
|
||||||
|
const { FormInput, FormDivider, FormText, FormIcon, FormRow, FormSection } = Forms;
|
||||||
|
|
||||||
|
const styles = stylesheet.createThemedStyleSheet({
|
||||||
|
avatar: {
|
||||||
|
height: 36,
|
||||||
|
width: 36,
|
||||||
|
borderRadius: 18,
|
||||||
|
},
|
||||||
|
button: {
|
||||||
|
marginRight: 12,
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
function AddButton({ callback }: { callback: () => void }) {
|
||||||
|
return <TouchableOpacity onPress={callback}>
|
||||||
|
<FormText style={styles.button}>ADD</FormText>
|
||||||
|
</TouchableOpacity>;
|
||||||
|
}
|
||||||
|
|
||||||
|
function AddRow({ onFinish }: { onFinish: () => void }) {
|
||||||
|
const [value, setValue] = React.useState("");
|
||||||
|
|
||||||
|
const onPressCallback = () => {
|
||||||
|
if (value && +value && UserStore.getUser(value) && !storage.exempted.includes(value)) {
|
||||||
|
storage.exempted = [...storage.exempted, value];
|
||||||
|
setValue("");
|
||||||
|
}
|
||||||
|
onFinish();
|
||||||
|
};
|
||||||
|
|
||||||
|
return <>
|
||||||
|
<FormDivider />
|
||||||
|
<FormRow
|
||||||
|
leading={<FormIcon source={getAssetIDByName("ic_add_friend")} />}
|
||||||
|
label={<FormInput autoFocus
|
||||||
|
title="User ID"
|
||||||
|
placeholder="123456789012345678"
|
||||||
|
value={value}
|
||||||
|
keyboardType="numeric"
|
||||||
|
onChangeText={(value: string) => setValue(value.replace(/[^0-9]/g, "").trim())}
|
||||||
|
returnKeyType="done"
|
||||||
|
/>}
|
||||||
|
trailing={(
|
||||||
|
<TouchableOpacity onPress={onPressCallback}>
|
||||||
|
<FormIcon source={getAssetIDByName("ic_add_24px")} />
|
||||||
|
</TouchableOpacity>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
</>;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function Settings() {
|
||||||
|
const [shouldShowAdd, setShouldShowAdd] = React.useState(false);
|
||||||
|
const settings = useProxy(storage) as SettingsSchema;
|
||||||
|
const navigation = NavigationNative.useNavigation();
|
||||||
|
|
||||||
|
React.useEffect(() => {
|
||||||
|
navigation.setOptions({
|
||||||
|
headerRight: () => <AddButton callback={() => setShouldShowAdd(true)} />
|
||||||
|
});
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<ScrollView>
|
||||||
|
<FormSection title="Exempted Users" titleStyleType="no_border">
|
||||||
|
{settings.exempted?.length > 0 && <FlatList
|
||||||
|
data={settings.exempted}
|
||||||
|
keyExtractor={(item) => item}
|
||||||
|
renderItem={({ item }) => {
|
||||||
|
const user = UserStore.getUser(item);
|
||||||
|
|
||||||
|
return (<FormRow
|
||||||
|
label={user.username}
|
||||||
|
leading={<Image style={styles.avatar} source={{ uri: user.getAvatarURL() }} />}
|
||||||
|
trailing={<TouchableOpacity onPress={() => {
|
||||||
|
storage.exempted = storage.exempted.filter((id) => id !== item);
|
||||||
|
}}>
|
||||||
|
<FormIcon source={getAssetIDByName("Small")} disableColor />
|
||||||
|
</TouchableOpacity>}
|
||||||
|
/>);
|
||||||
|
}}
|
||||||
|
ItemSeparatorComponent={FormDivider}
|
||||||
|
/>}
|
||||||
|
{shouldShowAdd && <AddRow onFinish={() => setShouldShowAdd(false)} />}
|
||||||
|
</FormSection>
|
||||||
|
</ScrollView>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
@ -1 +1,22 @@
|
||||||
export const onUnload = globalThis.vendetta.patcher.before("createPendingReply", globalThis.vendetta.metro.findByProps("createPendingReply"), ([arg]) => arg.shouldMention &&= false);
|
// export const onUnload = globalThis.vendetta.patcher.before("createPendingReply", globalThis.vendetta.metro.findByProps("createPendingReply"), ([arg]) => arg.shouldMention &&= false);
|
||||||
|
|
||||||
|
import { patcher } from "@vendetta";
|
||||||
|
import { findByProps } from "@vendetta/metro";
|
||||||
|
import { storage } from "@vendetta/plugin";
|
||||||
|
import Settings from "./Settings";
|
||||||
|
|
||||||
|
export interface SettingsSchema {
|
||||||
|
exempted: string[];
|
||||||
|
}
|
||||||
|
|
||||||
|
const ReplyManager = findByProps("createPendingReply");
|
||||||
|
|
||||||
|
storage.exempted ??= [];
|
||||||
|
|
||||||
|
export default new class NoAutoReplyMention {
|
||||||
|
settings = Settings;
|
||||||
|
|
||||||
|
onUnload = patcher.before("createPendingReply", ReplyManager, ([arg]) => {
|
||||||
|
arg.shouldMention &&= storage.exempted.includes(arg.message?.author?.id);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue