remotely-save/pro/src/settingsAzureBlobStorage.ts
2024-06-22 21:03:43 +08:00

294 lines
9.3 KiB
TypeScript

import cloneDeep from "lodash/cloneDeep";
import { type App, Modal, Notice, Setting } from "obsidian";
import { getClient } from "../../src/fsGetter";
import type { TransItemType } from "../../src/i18n";
import type RemotelySavePlugin from "../../src/main";
import { stringToFragment } from "../../src/misc";
import { wrapTextWithPasswordHide } from "../../src/settings";
import {
DEFAULT_AZUREBLOBSTORAGE_CONFIG,
simpleTransRemotePrefix,
} from "./fsAzureBlobStorage";
class ChangeAzureBlobStorageRemotePrefixModal extends Modal {
readonly plugin: RemotelySavePlugin;
readonly newRemotePrefix: string;
constructor(app: App, plugin: RemotelySavePlugin, newRemotePrefix: string) {
super(app);
this.plugin = plugin;
this.newRemotePrefix = newRemotePrefix;
}
onOpen() {
const { contentEl } = this;
const t = (x: TransItemType, vars?: any) => {
return this.plugin.i18n.t(x, vars);
};
contentEl.createEl("h2", {
text: t("modal_remoteprefix_azureblobstorage_title"),
});
t("modal_remoteprefix_azureblobstorage_shortdesc")
.split("\n")
.forEach((val, idx) => {
contentEl.createEl("p", {
text: val,
});
});
contentEl.createEl("p", {
text: t("modal_remoteprefix_azureblobstorage_tosave", {
prefix: this.newRemotePrefix,
}),
});
new Setting(contentEl)
.addButton((button) => {
button.setButtonText(
t("modal_remoteprefix_azureblobstorage_secondconfirm_change")
);
button.onClick(async () => {
this.plugin.settings.azureblobstorage.remotePrefix =
this.newRemotePrefix;
await this.plugin.saveSettings();
new Notice(t("modal_remoteprefix_azureblobstorage_notice"));
this.close();
});
button.setClass("remoteprefix-azureblobstorage-second-confirm");
})
.addButton((button) => {
button.setButtonText(t("goback"));
button.onClick(() => {
this.close();
});
});
}
onClose() {
const { contentEl } = this;
contentEl.empty();
}
}
export const generateAzureBlobStorageSettingsPart = (
containerEl: HTMLElement,
t: (x: TransItemType, vars?: any) => string,
app: App,
plugin: RemotelySavePlugin,
saveUpdatedConfigFunc: () => Promise<any> | undefined
) => {
const azureBlobStorageDiv = containerEl.createEl("div", {
cls: "azureblobstorage-hide",
});
azureBlobStorageDiv.toggleClass(
"azureblobstorage-hide",
plugin.settings.serviceType !== "azureblobstorage"
);
azureBlobStorageDiv.createEl("h2", { text: t("settings_azureblobstorage") });
const azureBlobStorageLongDescDiv = azureBlobStorageDiv.createEl("div", {
cls: "settings-long-desc",
});
for (const c of [
t("settings_azureblobstorage_disclaimer1"),
stringToFragment(t("settings_azureblobstorage_disclaimer2")),
]) {
azureBlobStorageLongDescDiv.createEl("p", {
text: c,
cls: "azureblobstorage-disclaimer",
});
}
azureBlobStorageLongDescDiv.createEl("p", {
text: t("settings_azureblobstorage_folder", {
remotePrefix:
plugin.settings.azureblobstorage.remotePrefix ||
`${app.vault.getName()}/`,
}),
});
azureBlobStorageLongDescDiv.createDiv({
text: stringToFragment(t("settings_azureblobstorage_pro_desc")),
cls: "azureblobstorage-disclaimer",
});
const azureBlobStorageNotShowUpHintSetting = new Setting(azureBlobStorageDiv)
.setName(t("settings_azureblobstorage_notshowuphint"))
.setDesc(t("settings_azureblobstorage_notshowuphint_desc"))
.addButton(async (button) => {
button.setButtonText(
t("settings_azureblobstorage_notshowuphint_view_pro")
);
button.onClick(async () => {
window.location.href = "#settings-pro";
});
});
const azureBlobStorageAllowedToUsedDiv = azureBlobStorageDiv.createDiv();
// if pro enabled, show up; otherwise hide.
const allowAzureBlobStorage =
plugin.settings.pro?.enabledProFeatures.filter(
(x) => x.featureName === "feature-azure_blob_storage"
).length === 1;
console.debug(
`allow to show up azureBlobStorage settings? ${allowAzureBlobStorage}`
);
if (allowAzureBlobStorage) {
azureBlobStorageAllowedToUsedDiv.removeClass(
"azureblobstorage-allow-to-use-hide"
);
azureBlobStorageNotShowUpHintSetting.settingEl.addClass(
"azureblobstorage-allow-to-use-hide"
);
} else {
azureBlobStorageAllowedToUsedDiv.addClass(
"azureblobstorage-allow-to-use-hide"
);
azureBlobStorageNotShowUpHintSetting.settingEl.removeClass(
"azureblobstorage-allow-to-use-hide"
);
}
new Setting(azureBlobStorageAllowedToUsedDiv)
.setName(t("settings_azureblobstorage_containersasurl"))
.setDesc(
stringToFragment(t("settings_azureblobstorage_containersasurl_desc"))
)
.addText((text) => {
wrapTextWithPasswordHide(text);
text
.setPlaceholder("")
.setValue(`${plugin.settings.azureblobstorage.containerSasUrl}`)
.onChange(async (value) => {
plugin.settings.azureblobstorage.containerSasUrl = value.trim();
await plugin.saveSettings();
});
});
new Setting(azureBlobStorageAllowedToUsedDiv)
.setName(t("settings_azureblobstorage_containername"))
.setDesc(t("settings_azureblobstorage_containername_desc"))
.addText((text) => {
wrapTextWithPasswordHide(text);
text
.setPlaceholder("")
.setValue(`${plugin.settings.azureblobstorage.containerName}`)
.onChange(async (value) => {
plugin.settings.azureblobstorage.containerName = value.trim();
await plugin.saveSettings();
});
});
let newAzureBlobStorageRemotePrefix =
plugin.settings.azureblobstorage.remotePrefix || "";
new Setting(azureBlobStorageAllowedToUsedDiv)
.setName(t("settings_azureblobstorage_remoteprefix"))
.setDesc(t("settings_azureblobstorage_remoteprefix_desc"))
.addText((text) =>
text
.setPlaceholder(`${app.vault.getName()}/`)
.setValue(newAzureBlobStorageRemotePrefix)
.onChange((value) => {
const k = simpleTransRemotePrefix(value);
if (k === "") {
newAzureBlobStorageRemotePrefix = `${app.vault.getName()}/`;
} else {
newAzureBlobStorageRemotePrefix = k;
}
})
)
.addButton((button) => {
button.setButtonText(t("confirm"));
button.onClick(() => {
new ChangeAzureBlobStorageRemotePrefixModal(
app,
plugin,
newAzureBlobStorageRemotePrefix
).open();
});
});
new Setting(azureBlobStorageAllowedToUsedDiv)
.setName(t("settings_azureblobstorage_parts"))
.setDesc(t("settings_azureblobstorage_parts_desc"))
.addDropdown((dropdown) => {
dropdown.addOption("1", "1");
dropdown.addOption("2", "2");
dropdown.addOption("3", "3");
dropdown.addOption("5", "5");
dropdown.addOption("10", "10");
dropdown.addOption("15", "15");
dropdown.addOption("20", "20 (default)");
dropdown
.setValue(`${plugin.settings.azureblobstorage.partsConcurrency}`)
.onChange(async (val) => {
const realVal = Number.parseInt(val);
plugin.settings.azureblobstorage.partsConcurrency = realVal;
await plugin.saveSettings();
});
});
new Setting(azureBlobStorageAllowedToUsedDiv)
.setName(t("settings_azureblobstorage_generatefolderobject"))
.setDesc(t("settings_azureblobstorage_generatefolderobject_desc"))
.addDropdown((dropdown) => {
dropdown
.addOption(
"notgenerate",
t("settings_azureblobstorage_generatefolderobject_notgenerate")
)
.addOption(
"generate",
t("settings_azureblobstorage_generatefolderobject_generate")
);
dropdown
.setValue(
`${
plugin.settings.azureblobstorage.generateFolderObject
? "generate"
: "notgenerate"
}`
)
.onChange(async (val) => {
if (val === "generate") {
plugin.settings.azureblobstorage.generateFolderObject = true;
} else {
plugin.settings.azureblobstorage.generateFolderObject = false;
}
await plugin.saveSettings();
});
});
new Setting(azureBlobStorageAllowedToUsedDiv)
.setName(t("settings_checkonnectivity"))
.setDesc(t("settings_checkonnectivity_desc"))
.addButton(async (button) => {
button.setButtonText(t("settings_checkonnectivity_button"));
button.onClick(async () => {
new Notice(t("settings_checkonnectivity_checking"));
const client = getClient(plugin.settings, app.vault.getName(), () =>
plugin.saveSettings()
);
const errors = { msg: "" };
const res = await client.checkConnect((err: any) => {
errors.msg = `${err}`;
});
if (res) {
new Notice(t("settings_azureblobstorage_connect_succ"));
} else {
new Notice(t("settings_azureblobstorage_connect_fail"));
new Notice(errors.msg);
}
});
});
return {
azureBlobStorageDiv: azureBlobStorageDiv,
azureBlobStorageAllowedToUsedDiv: azureBlobStorageAllowedToUsedDiv,
azureBlobStorageNotShowUpHintSetting: azureBlobStorageNotShowUpHintSetting,
};
};