108 lines
2.7 KiB
TypeScript
108 lines
2.7 KiB
TypeScript
import cloneDeep from "lodash/cloneDeep";
|
|
import QRCode from "qrcode";
|
|
|
|
import {
|
|
COMMAND_URI,
|
|
type QRExportType,
|
|
type RemotelySavePluginSettings,
|
|
type UriParams,
|
|
} from "./baseTypes";
|
|
import { getShrinkedSettings } from "./fsOnedrive";
|
|
|
|
export const exportQrCodeUri = async (
|
|
settings: RemotelySavePluginSettings,
|
|
currentVaultName: string,
|
|
pluginVersion: string,
|
|
exportFields: QRExportType
|
|
) => {
|
|
let settings2: Partial<RemotelySavePluginSettings> = {};
|
|
|
|
if (exportFields === "all_but_oauth2") {
|
|
settings2 = cloneDeep(settings);
|
|
delete settings2.dropbox;
|
|
delete settings2.onedrive;
|
|
} else if (exportFields === "dropbox") {
|
|
settings2 = { dropbox: cloneDeep(settings.dropbox) };
|
|
} else if (exportFields === "onedrive") {
|
|
settings2 = { onedrive: getShrinkedSettings(settings.onedrive) };
|
|
}
|
|
|
|
delete settings2.vaultRandomID;
|
|
const data = encodeURIComponent(JSON.stringify(settings2));
|
|
const vault = encodeURIComponent(currentVaultName);
|
|
const version = encodeURIComponent(pluginVersion);
|
|
const rawUri = `obsidian://${COMMAND_URI}?func=settings&version=${version}&vault=${vault}&data=${data}`;
|
|
// console.info(uri)
|
|
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;
|
|
};
|
|
|
|
export const importQrCodeUri = (
|
|
inputParams: any,
|
|
currentVaultName: string
|
|
): ProcessQrCodeResultType => {
|
|
const params = inputParams as UriParams;
|
|
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,
|
|
};
|
|
};
|