feat(PatchHelper): Paste Full Patch (#1982)
This commit is contained in:
parent
2ce3487477
commit
5646fe402a
2 changed files with 68 additions and 3 deletions
|
@ -16,7 +16,7 @@
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { React, TextInput } from "@webpack/common";
|
import { React, TextInput, useEffect } from "@webpack/common";
|
||||||
|
|
||||||
// TODO: Refactor settings to use this as well
|
// TODO: Refactor settings to use this as well
|
||||||
interface TextInputProps {
|
interface TextInputProps {
|
||||||
|
@ -55,6 +55,10 @@ export function CheckedTextInput({ value: initialValue, onChange, validate }: Te
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
handleChange(initialValue);
|
||||||
|
}, [initialValue]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<TextInput
|
<TextInput
|
||||||
|
|
|
@ -22,9 +22,9 @@ import { debounce } from "@shared/debounce";
|
||||||
import { Margins } from "@utils/margins";
|
import { Margins } from "@utils/margins";
|
||||||
import { canonicalizeMatch, canonicalizeReplace } from "@utils/patches";
|
import { canonicalizeMatch, canonicalizeReplace } from "@utils/patches";
|
||||||
import { makeCodeblock } from "@utils/text";
|
import { makeCodeblock } from "@utils/text";
|
||||||
import { ReplaceFn } from "@utils/types";
|
import { Patch, ReplaceFn } from "@utils/types";
|
||||||
import { search } from "@webpack";
|
import { search } from "@webpack";
|
||||||
import { Button, Clipboard, Forms, Parser, React, Switch, TextInput } from "@webpack/common";
|
import { Button, Clipboard, Forms, Parser, React, Switch, TextArea, TextInput } from "@webpack/common";
|
||||||
|
|
||||||
import { SettingsTab, wrapTab } from "./shared";
|
import { SettingsTab, wrapTab } from "./shared";
|
||||||
|
|
||||||
|
@ -218,6 +218,60 @@ function ReplacementInput({ replacement, setReplacement, replacementError }) {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface FullPatchInputProps {
|
||||||
|
setFind(v: string): void;
|
||||||
|
setMatch(v: string): void;
|
||||||
|
setReplacement(v: string | ReplaceFn): void;
|
||||||
|
}
|
||||||
|
|
||||||
|
function FullPatchInput({ setFind, setMatch, setReplacement }: FullPatchInputProps) {
|
||||||
|
const [fullPatch, setFullPatch] = React.useState<string>("");
|
||||||
|
const [fullPatchError, setFullPatchError] = React.useState<string>("");
|
||||||
|
|
||||||
|
function update() {
|
||||||
|
if (fullPatch === "") {
|
||||||
|
setFullPatchError("");
|
||||||
|
|
||||||
|
setFind("");
|
||||||
|
setMatch("");
|
||||||
|
setReplacement("");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const parsed = (0, eval)(`(${fullPatch})`) as Patch;
|
||||||
|
|
||||||
|
if (!parsed.find) throw new Error("No 'find' field");
|
||||||
|
if (!parsed.replacement) throw new Error("No 'replacement' field");
|
||||||
|
|
||||||
|
if (parsed.replacement instanceof Array) {
|
||||||
|
if (parsed.replacement.length === 0) throw new Error("Invalid replacement");
|
||||||
|
|
||||||
|
parsed.replacement = {
|
||||||
|
match: parsed.replacement[0].match,
|
||||||
|
replace: parsed.replacement[0].replace
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!parsed.replacement.match) throw new Error("No 'replacement.match' field");
|
||||||
|
if (!parsed.replacement.replace) throw new Error("No 'replacement.replace' field");
|
||||||
|
|
||||||
|
setFind(parsed.find);
|
||||||
|
setMatch(parsed.replacement.match instanceof RegExp ? parsed.replacement.match.source : parsed.replacement.match);
|
||||||
|
setReplacement(parsed.replacement.replace);
|
||||||
|
setFullPatchError("");
|
||||||
|
} catch (e) {
|
||||||
|
setFullPatchError((e as Error).message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return <>
|
||||||
|
<Forms.FormText>Paste your full JSON patch here to fill out the fields</Forms.FormText>
|
||||||
|
<TextArea value={fullPatch} onChange={setFullPatch} onBlur={update} />
|
||||||
|
{fullPatchError !== "" && <Forms.FormText style={{ color: "var(--text-danger)" }}>{fullPatchError}</Forms.FormText>}
|
||||||
|
</>;
|
||||||
|
}
|
||||||
|
|
||||||
function PatchHelper() {
|
function PatchHelper() {
|
||||||
const [find, setFind] = React.useState<string>("");
|
const [find, setFind] = React.useState<string>("");
|
||||||
const [match, setMatch] = React.useState<string>("");
|
const [match, setMatch] = React.useState<string>("");
|
||||||
|
@ -260,6 +314,13 @@ function PatchHelper() {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<SettingsTab title="Patch Helper">
|
<SettingsTab title="Patch Helper">
|
||||||
|
<Forms.FormTitle>full patch</Forms.FormTitle>
|
||||||
|
<FullPatchInput
|
||||||
|
setFind={onFindChange}
|
||||||
|
setMatch={onMatchChange}
|
||||||
|
setReplacement={setReplacement}
|
||||||
|
/>
|
||||||
|
|
||||||
<Forms.FormTitle>find</Forms.FormTitle>
|
<Forms.FormTitle>find</Forms.FormTitle>
|
||||||
<TextInput
|
<TextInput
|
||||||
type="text"
|
type="text"
|
||||||
|
|
Loading…
Reference in a new issue