/* * Vencord, a modification for Discord's desktop app * Copyright (c) 2023 Vendicated and contributors * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ import { showNotification } from "@api/Notifications"; import { Settings, useSettings } from "@api/settings"; import { CheckedTextInput } from "@components/CheckedTextInput"; import ErrorBoundary from "@components/ErrorBoundary"; import { Link } from "@components/Link"; import { authorizeCloud, cloudLogger, deauthorizeCloud, getCloudAuth, getCloudUrl } from "@utils/cloud"; import { Margins } from "@utils/margins"; import { deleteCloudSettings, getCloudSettings, putCloudSettings } from "@utils/settingsSync"; import { Alerts, Button, Forms, Switch, Tooltip } from "@webpack/common"; function validateUrl(url: string) { try { new URL(url); return true; } catch { return "Invalid URL"; } } async function eraseAllData() { const res = await fetch(new URL("/v1/", getCloudUrl()), { method: "DELETE", headers: new Headers({ Authorization: await getCloudAuth() }) }); if (!res.ok) { cloudLogger.error(`Failed to erase data, API returned ${res.status}`); showNotification({ title: "Cloud Integrations", body: `Could not erase all data (API returned ${res.status}), please contact support.`, color: "var(--red-360)" }); return; } Settings.cloud.authenticated = false; await deauthorizeCloud(); showNotification({ title: "Cloud Integrations", body: "Successfully erased all data.", color: "var(--green-360)" }); } function SettingsSyncSection() { const { cloud } = useSettings(["cloud.authenticated", "cloud.settingsSync"]); const sectionEnabled = cloud.authenticated && cloud.settingsSync; return ( Synchronize your settings to the cloud. This allows easy synchronization across multiple devices with minimal effort. { cloud.settingsSync = v; }} > Settings Sync
{({ onMouseLeave, onMouseEnter }) => ( )}
); } function CloudTab() { const settings = useSettings(["cloud.authenticated", "cloud.url"]); return ( <> Vencord comes with a cloud integration that adds goodies like settings sync across devices. It respects your privacy, and the source code is AGPL 3.0 licensed so you can host it yourself. { v && authorizeCloud(); if (!v) settings.cloud.authenticated = v; }} note="This will request authorization if you have not yet set up cloud integrations." > Enable Cloud Integrations Backend URL Which backend to use when using cloud integrations. { settings.cloud.url = v; settings.cloud.authenticated = false; deauthorizeCloud(); }} validate={validateUrl} /> ); } export default ErrorBoundary.wrap(CloudTab);