mirror of
https://github.com/Vendicated/Vencord.git
synced 2025-01-26 17:26:22 +00:00
add import/export functionality for notes
This commit is contained in:
parent
2e9e14b447
commit
97242d5cd9
3 changed files with 107 additions and 0 deletions
|
@ -8,6 +8,7 @@ import { ModalCloseButton, ModalContent, ModalFooter, ModalHeader, ModalProps, M
|
||||||
import { findByProps } from "@webpack";
|
import { findByProps } from "@webpack";
|
||||||
import { Button, Forms, Text } from "@webpack/common";
|
import { Button, Forms, Text } from "@webpack/common";
|
||||||
import noteHandler from "plugins/holynotes/noteHandler";
|
import noteHandler from "plugins/holynotes/noteHandler";
|
||||||
|
import { downloadNotes, uploadNotes } from "plugins/holynotes/utils";
|
||||||
|
|
||||||
export default ({ onClose, ...modalProps }: ModalProps & { onClose: () => void; }) => {
|
export default ({ onClose, ...modalProps }: ModalProps & { onClose: () => void; }) => {
|
||||||
const { colorStatusGreen } = findByProps("colorStatusGreen");
|
const { colorStatusGreen } = findByProps("colorStatusGreen");
|
||||||
|
@ -60,6 +61,21 @@ export default ({ onClose, ...modalProps }: ModalProps & { onClose: () => void;
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
noteHandler.refreshAvatars();
|
noteHandler.refreshAvatars();
|
||||||
}}>Refresh Avatars</Button>
|
}}>Refresh Avatars</Button>
|
||||||
|
|
||||||
|
<Button
|
||||||
|
look={Button.Looks.FILLED}
|
||||||
|
color={Button.Colors.GREEN}
|
||||||
|
style={{ marginRight: "10px" }}
|
||||||
|
onClick={() => {
|
||||||
|
uploadNotes();
|
||||||
|
}}>Import Notes</Button>
|
||||||
|
<Button
|
||||||
|
look={Button.Looks.FILLED}
|
||||||
|
color={Button.Colors.GREEN}
|
||||||
|
style={{ marginRight: "70px" }}
|
||||||
|
onClick={() => {
|
||||||
|
downloadNotes();
|
||||||
|
}}>Export Notes</Button>
|
||||||
<Button
|
<Button
|
||||||
look={Button.Looks.FILLED}
|
look={Button.Looks.FILLED}
|
||||||
color={Button.Colors.RED}
|
color={Button.Colors.RED}
|
||||||
|
|
|
@ -181,4 +181,34 @@ export default new (class NoteHandler {
|
||||||
type: Toasts.Type.SUCCESS,
|
type: Toasts.Type.SUCCESS,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
public exportNotes = async () => {
|
||||||
|
return this.getAllNotes();
|
||||||
|
};
|
||||||
|
|
||||||
|
public importNotes = async (notes: HolyNotes.Note[]) => {
|
||||||
|
try {
|
||||||
|
var parseNotes = JSON.parse(notes as unknown as string);
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e);
|
||||||
|
return Toasts.show({
|
||||||
|
id: Toasts.genId(),
|
||||||
|
message: "Invalid JSON.",
|
||||||
|
type: Toasts.Type.FAILURE,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const notebook in parseNotes) {
|
||||||
|
noteHandlerCache.set(notebook, parseNotes[notebook]);
|
||||||
|
saveCacheToDataStore(notebook, parseNotes[notebook] as unknown as HolyNotes.Note[]);
|
||||||
|
}
|
||||||
|
|
||||||
|
Toasts.show({
|
||||||
|
id: Toasts.genId(),
|
||||||
|
message: "Successfully imported notes.",
|
||||||
|
type: Toasts.Type.SUCCESS,
|
||||||
|
});
|
||||||
|
|
||||||
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,7 @@ import { DataStore } from "@api/index";
|
||||||
|
|
||||||
import noteHandler, { noteHandlerCache } from "./noteHandler";
|
import noteHandler, { noteHandlerCache } from "./noteHandler";
|
||||||
import { HolyNotes } from "./types";
|
import { HolyNotes } from "./types";
|
||||||
|
import { Toasts } from "@webpack/common";
|
||||||
|
|
||||||
export const HolyNoteStore = createStore("HolyNoteData", "HolyNoteStore");
|
export const HolyNoteStore = createStore("HolyNoteData", "HolyNoteStore");
|
||||||
|
|
||||||
|
@ -42,3 +43,63 @@ export async function DeleteEntireStore() {
|
||||||
await DataStore.clear(HolyNoteStore);
|
await DataStore.clear(HolyNoteStore);
|
||||||
return noteHandler.newNoteBook("Main", true);
|
return noteHandler.newNoteBook("Main", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function downloadNotes() {
|
||||||
|
const filename = "notes.json";
|
||||||
|
const exportData = await noteHandler.exportNotes();
|
||||||
|
const data = JSON.stringify(exportData, null, 2);
|
||||||
|
|
||||||
|
if (IS_VESKTOP || IS_WEB) {
|
||||||
|
const file = new File([data], filename, { type: "application/json" });
|
||||||
|
const a = document.createElement("a");
|
||||||
|
a.href = URL.createObjectURL(file);
|
||||||
|
a.download = filename;
|
||||||
|
|
||||||
|
document.body.appendChild(a);
|
||||||
|
a.click();
|
||||||
|
setImmediate(() => {
|
||||||
|
URL.revokeObjectURL(a.href);
|
||||||
|
document.body.removeChild(a);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
DiscordNative.fileManager.saveWithDialog(data, filename);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function uploadNotes() {
|
||||||
|
if (IS_VESKTOP || IS_WEB) {
|
||||||
|
const input = document.createElement("input");
|
||||||
|
input.type = "file";
|
||||||
|
input.style.display = "none";
|
||||||
|
input.accept = "application/json";
|
||||||
|
input.onchange = async () => {
|
||||||
|
const file = input.files?.[0];
|
||||||
|
if (!file) return;
|
||||||
|
|
||||||
|
const reader = new FileReader();
|
||||||
|
reader.onload = async () => {
|
||||||
|
try {
|
||||||
|
await noteHandler.importNotes(reader.result as unknown as HolyNotes.Note[]);
|
||||||
|
} catch (err) {
|
||||||
|
console.error(err);
|
||||||
|
Toasts.show({
|
||||||
|
id: Toasts.genId(),
|
||||||
|
message: "Invalid JSON.",
|
||||||
|
type: Toasts.Type.FAILURE,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
reader.readAsText(file);
|
||||||
|
};
|
||||||
|
|
||||||
|
document.body.appendChild(input);
|
||||||
|
input.click();
|
||||||
|
setImmediate(() => document.body.removeChild(input));
|
||||||
|
} else {
|
||||||
|
const [file] = await DiscordNative.fileManager.openFiles({ filters: [{ name: "notes", extensions: ["json"] }] });
|
||||||
|
|
||||||
|
if (file) {
|
||||||
|
await noteHandler.importNotes(new TextDecoder().decode(file.data) as unknown as HolyNotes.Note[]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue