Skip to content

Commit

Permalink
feat: monsters with unknown sources now prompt for a source
Browse files Browse the repository at this point in the history
  • Loading branch information
valentine195 committed Dec 16, 2021
1 parent 9db8769 commit 86d12b1
Show file tree
Hide file tree
Showing 5 changed files with 79 additions and 14 deletions.
3 changes: 1 addition & 2 deletions src/importers/5eToolsImport.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,7 @@ export async function build5eMonsterFromFile(file: File): Promise<Monster[]> {
const importedMonster: Monster = {
name: monster.name,
source: `${
SOURCE_JSON_TO_FULL[monster.source] ??
"5e.tools"
SOURCE_JSON_TO_FULL[monster.source] ?? "Unknown"
}`,
type: monster.type,
subtype: "",
Expand Down
2 changes: 1 addition & 1 deletion src/importers/ImprovedInitiativeImport.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ export async function buildMonsterFromImprovedInitiativeFile(
name: monster.Name,
source: monster.Source?.trim().length
? monster.Source.trim()
: "Unknown - Improved Initiative File",
: "Unknown",
type: monster.Type.split(/,\s?/)[0].trim(),
subtype: "",
size: "",
Expand Down
81 changes: 76 additions & 5 deletions src/importers/importer.ts
Original file line number Diff line number Diff line change
@@ -1,22 +1,93 @@
import { nanoid } from "src/data/constants";
import ImportWorker from "./importer.worker";
import type { Monster } from "@types";
import { Notice } from "obsidian";
import { App, Modal, Notice, Setting, TextComponent } from "obsidian";
import type StatBlockPlugin from "src/main";

class SourcePromptModal extends Modal {
source: string;
saved: boolean = false;
display() {
this.titleEl.createSpan({ text: "Set Sources" });
new Setting(this.contentEl)
.setName(
"A source could not be found for some imported monsters. Do you wish to manually add one?"
)
.addText((t) => {
t.setPlaceholder("Unknown").onChange((v) => {
this.source = v;
});
});
this.buildButtons(this.contentEl);
}
buildButtons(el: HTMLElement) {
new Setting(el)
.addButton((b) =>
b
.setCta()
.setIcon("checkmark")
.setTooltip("Save")
.onClick(() => {
this.saved = true;
this.close();
})
)
.addExtraButton((b) =>
b
.setIcon("cross")
.setTooltip("Cancel")
.onClick(() => {
this.close();
})
);
}
onOpen() {
this.display();
}
}

const getSourceFromPrompt = async (app: App): Promise<string> => {
return new Promise((resolve) => {
const modal = new SourcePromptModal(app);
modal.onClose = () => {
if (!modal.saved) resolve(null);
resolve(modal.source);
};
modal.open();
});
};

export default class Importer {
constructor(public plugin: StatBlockPlugin) {}
workers: Map<string, Worker> = new Map();
async import(files: FileList, source: string): Promise<Monster[]> {
return new Promise((resolve) => {
const worker = new ImportWorker();
const id = nanoid();
this.workers.set(id, worker);

worker.onmessage = (event) => {
const { monsters } = event.data ?? {};
worker.onmessage = async (event) => {
const { monsters }: { monsters: Monster[] } = event.data ?? {
monsters: []
};
if (monsters) {
console.log(monsters);
new Notice(
`Successfully imported ${monsters.length} Monsters`
);
const sourceless = monsters.filter(
(monster) =>
monster.source == "Unknown" || !monster.source
);
let source: string;
if (
sourceless.length &&
(source = await getSourceFromPrompt(this.plugin.app))
) {
sourceless.forEach(
(monster) => (monster.source = source)
);
}
}
new Notice(`Successfully imported ${monsters.length} Monsters`);
worker.terminate();
this.workers.delete(id);
resolve(monsters);
Expand Down
5 changes: 0 additions & 5 deletions src/importers/importer.worker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,6 @@ ctx.onmessage = async (event) => {
if (!event.data) return;

const { files, source } = event.data;
console.log(
"🚀 ~ file: importer.worker.ts ~ line 7 ~ files, source",
files,
source
);
const monsters: Monster[] = [];
for (const file of files) {
switch (source) {
Expand Down
2 changes: 1 addition & 1 deletion src/settings/settings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@ export default class StatblockSettingTab extends PluginSettingTab {
};
suggester._onInputChanged();
}
importer = new Importer();
importer = new Importer(this.plugin);
generateImports(containerEl: HTMLDivElement) {
const importSettingsContainer = containerEl.createDiv(
"statblock-additional-container"
Expand Down

0 comments on commit 86d12b1

Please sign in to comment.