remotely-save/src/importExport.ts

121 lines
3.3 KiB
TypeScript
Raw Permalink Normal View History

2022-01-01 15:26:01 +00:00
import cloneDeep from "lodash/cloneDeep";
2024-05-07 16:20:15 +00:00
import QRCode from "qrcode";
2021-12-11 09:33:55 +00:00
import {
COMMAND_URI,
2024-05-07 16:20:15 +00:00
type QRExportType,
type RemotelySavePluginSettings,
type UriParams,
2021-12-11 09:33:55 +00:00
} from "./baseTypes";
2024-04-26 18:27:24 +00:00
import { getShrinkedSettings } from "./fsOnedrive";
2021-12-11 09:33:55 +00:00
export const exportQrCodeUri = async (
settings: RemotelySavePluginSettings,
currentVaultName: string,
pluginVersion: string,
exportFields: QRExportType
2021-12-11 09:33:55 +00:00
) => {
let settings2: Partial<RemotelySavePluginSettings> = {};
2024-05-25 07:22:19 +00:00
if (exportFields === "basic_and_advanced") {
settings2 = cloneDeep(settings);
2024-05-25 07:22:19 +00:00
delete settings2.s3;
delete settings2.dropbox;
delete settings2.onedrive;
2024-05-25 07:22:19 +00:00
delete settings2.webdav;
delete settings2.webdis;
2024-06-02 15:37:53 +00:00
delete settings2.googledrive;
2024-05-26 16:33:49 +00:00
delete settings2.pro;
2024-05-25 07:22:19 +00:00
} else if (exportFields === "s3") {
settings2 = { s3: cloneDeep(settings.s3) };
} else if (exportFields === "dropbox") {
settings2 = { dropbox: cloneDeep(settings.dropbox) };
} else if (exportFields === "onedrive") {
settings2 = { onedrive: getShrinkedSettings(settings.onedrive) };
2024-05-25 07:22:19 +00:00
} else if (exportFields === "webdav") {
settings2 = { webdav: cloneDeep(settings.webdav) };
} else if (exportFields === "webdis") {
settings2 = { webdis: cloneDeep(settings.webdis) };
2024-06-02 15:37:53 +00:00
} else if (exportFields === "googledrive") {
settings2 = { googledrive: cloneDeep(settings.googledrive) };
}
2022-01-08 17:06:50 +00:00
delete settings2.vaultRandomID;
2022-01-01 15:26:01 +00:00
const data = encodeURIComponent(JSON.stringify(settings2));
2021-12-11 09:33:55 +00:00
const vault = encodeURIComponent(currentVaultName);
const version = encodeURIComponent(pluginVersion);
const rawUri = `obsidian://${COMMAND_URI}?func=settings&version=${version}&vault=${vault}&data=${data}`;
2024-03-17 08:03:40 +00:00
// console.info(uri)
2021-12-11 09:33:55 +00:00
const imgUri = await QRCode.toDataURL(rawUri);
return {
rawUri,
imgUri,
};
};
export interface ProcessQrCodeResultType {
status: "error" | "ok";
message: string;
result?: RemotelySavePluginSettings;
}
/**
* we also support directly parse the uri, instead of relying on web browser
* @param input
*/
export const parseUriByHand = (input: string) => {
if (!input.startsWith("obsidian://remotely-save?func=settings&")) {
throw Error(`not valid string`);
}
const k = new URL(input);
const output = Object.fromEntries(k.searchParams);
return output;
};
2021-12-11 09:33:55 +00:00
export const importQrCodeUri = (
inputParams: any,
currentVaultName: string
): ProcessQrCodeResultType => {
2024-05-07 16:20:15 +00:00
const params = inputParams as UriParams;
2021-12-11 09:33:55 +00:00
if (
params.func === undefined ||
params.func !== "settings" ||
params.vault === undefined ||
params.data === undefined
) {
return {
status: "error",
message: `the uri is not for exporting/importing settings: ${JSON.stringify(
inputParams
)}`,
};
}
if (params.vault !== currentVaultName) {
return {
status: "error",
message: `the target vault is ${
params.vault
} but you are currently in ${currentVaultName}: ${JSON.stringify(
inputParams
)}`,
};
}
let settings = {} as RemotelySavePluginSettings;
try {
settings = JSON.parse(params.data);
} catch (e) {
return {
status: "error",
message: `errors while parsing settings: ${JSON.stringify(inputParams)}`,
};
}
return {
status: "ok",
message: "ok",
result: settings,
};
};