2025-02-19 07:01:20 +00:00
|
|
|
import { App, Modal } from "obsidian";
|
|
|
|
|
import React, { useState } from "react";
|
2026-05-15 18:49:03 +00:00
|
|
|
import { Root } from "react-dom/client";
|
2025-02-19 07:01:20 +00:00
|
|
|
import { Button } from "@/components/ui/button";
|
|
|
|
|
import { Input } from "@/components/ui/input";
|
2026-05-15 18:49:03 +00:00
|
|
|
import { createPluginRoot } from "@/utils/react/createPluginRoot";
|
2025-02-19 07:01:20 +00:00
|
|
|
|
|
|
|
|
function ExtensionInputModalContent({
|
|
|
|
|
onConfirm,
|
|
|
|
|
onCancel,
|
|
|
|
|
}: {
|
|
|
|
|
onConfirm: (extension: string) => void;
|
|
|
|
|
onCancel: () => void;
|
|
|
|
|
}) {
|
|
|
|
|
const [extension, setExtension] = useState("");
|
|
|
|
|
const [error, setError] = useState<string | null>(null);
|
|
|
|
|
|
|
|
|
|
const validateAndConfirm = (value: string) => {
|
|
|
|
|
if (value.includes(" ")) {
|
|
|
|
|
setError("Extension cannot contain spaces");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
setError(null);
|
|
|
|
|
onConfirm(value);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const handleKeyDown = (e: React.KeyboardEvent) => {
|
|
|
|
|
if (e.key === "Enter") {
|
2025-06-24 19:35:48 +00:00
|
|
|
e.preventDefault();
|
|
|
|
|
e.stopPropagation();
|
2025-02-19 07:01:20 +00:00
|
|
|
validateAndConfirm(extension);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
return (
|
2025-06-01 05:30:54 +00:00
|
|
|
<div className="tw-flex tw-flex-col tw-gap-4">
|
|
|
|
|
<div className="tw-flex tw-flex-col tw-gap-2">
|
2025-02-19 07:01:20 +00:00
|
|
|
<Input
|
2025-02-22 06:03:52 +00:00
|
|
|
placeholder="Enter the extension (e.g. txt, excalidraw.md)"
|
2025-02-19 07:01:20 +00:00
|
|
|
value={extension}
|
|
|
|
|
onChange={(e) => {
|
|
|
|
|
setExtension(e.target.value);
|
|
|
|
|
setError(null);
|
|
|
|
|
}}
|
|
|
|
|
onKeyDown={handleKeyDown}
|
|
|
|
|
/>
|
2025-06-01 05:30:54 +00:00
|
|
|
{error && <p className="tw-text-sm tw-text-error">{error}</p>}
|
2025-02-19 07:01:20 +00:00
|
|
|
</div>
|
2025-06-01 05:30:54 +00:00
|
|
|
<div className="tw-flex tw-justify-end tw-gap-2">
|
2025-02-19 07:01:20 +00:00
|
|
|
<Button variant="secondary" onClick={onCancel}>
|
|
|
|
|
Cancel
|
|
|
|
|
</Button>
|
|
|
|
|
<Button variant="default" onClick={() => validateAndConfirm(extension)}>
|
|
|
|
|
Confirm
|
|
|
|
|
</Button>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export class ExtensionInputModal extends Modal {
|
|
|
|
|
private root: Root;
|
|
|
|
|
|
|
|
|
|
constructor(
|
|
|
|
|
app: App,
|
|
|
|
|
private onConfirm: (extension: string) => void
|
|
|
|
|
) {
|
|
|
|
|
super(app);
|
|
|
|
|
// https://docs.obsidian.md/Reference/TypeScript+API/Modal/setTitle
|
|
|
|
|
// @ts-ignore
|
|
|
|
|
this.setTitle("Add Extension");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
onOpen() {
|
|
|
|
|
const { contentEl } = this;
|
2026-05-15 18:49:03 +00:00
|
|
|
this.root = createPluginRoot(contentEl, this.app);
|
2025-02-19 07:01:20 +00:00
|
|
|
|
|
|
|
|
const handleConfirm = (extension: string) => {
|
|
|
|
|
this.onConfirm(extension);
|
|
|
|
|
this.close();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const handleCancel = () => {
|
|
|
|
|
this.close();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
this.root.render(
|
|
|
|
|
<ExtensionInputModalContent onConfirm={handleConfirm} onCancel={handleCancel} />
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
onClose() {
|
|
|
|
|
this.root.unmount();
|
|
|
|
|
}
|
|
|
|
|
}
|