import { faAngleDoubleDown, faAngleDoubleUp } from '@fortawesome/free-solid-svg-icons'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import axios from 'axios'; import React, { Component } from 'react'; import Button from 'react-bootstrap/Button'; import Col from 'react-bootstrap/Col'; import Collapse from 'react-bootstrap/Collapse'; import Form from 'react-bootstrap/Form'; import Spinner from 'react-bootstrap/Spinner'; import { handleChange, RequiredBoolean, RequiredField, validateRequiredFields } from './forms'; import { SetupAzure } from './SetupAzure'; import { SetupB2 } from "./SetupB2"; import { SetupFilesystem } from './SetupFilesystem'; import { SetupGCS } from './SetupGCS'; import { SetupKopiaServer } from './SetupKopiaServer'; import { SetupRclone } from './SetupRclone'; import { SetupS3 } from './SetupS3'; import { SetupSFTP } from './SetupSFTP'; import { SetupToken } from './SetupToken'; import { SetupWebDAV } from './SetupWebDAV'; const supportedProviders = [ { provider: "filesystem", description: "Filesystem", component: SetupFilesystem }, { provider: "gcs", description: "Google Cloud Storage", component: SetupGCS }, { provider: "s3", description: "Amazon S3, Minio, Wasabi, etc.", component: SetupS3 }, { provider: "b2", description: "Backblaze B2", component: SetupB2 }, { provider: "azureBlob", description: "Azure Blob Storage", component: SetupAzure }, { provider: "sftp", description: "SFTP server", component: SetupSFTP }, { provider: "rclone", description: "Rclone remote", component: SetupRclone }, { provider: "webdav", description: "WebDAV server", component: SetupWebDAV }, { provider: "_server", description: "Kopia Repository Server", component: SetupKopiaServer }, { provider: "_token", description: "Use Repository Token", component: SetupToken }, ]; export class SetupRepository extends Component { constructor() { super(); this.state = { confirmCreate: false, isLoading: false, showAdvanced: false, storageVerified: false, providerSettings: {}, description: "My Repository", }; this.handleChange = handleChange.bind(this); this.optionsEditor = React.createRef(); this.connectToRepository = this.connectToRepository.bind(this); this.createRepository = this.createRepository.bind(this); this.cancelCreate = this.cancelCreate.bind(this); this.toggleAdvanced = this.toggleAdvanced.bind(this); this.verifyStorage = this.verifyStorage.bind(this); } componentDidMount() { axios.get('/api/v1/repo/algorithms').then(result => { this.setState({ algorithms: result.data, hash: result.data.defaultHash, encryption: result.data.defaultEncryption, splitter: result.data.defaultSplitter, indexVersion: "", }); }); axios.get('/api/v1/current-user').then(result => { this.setState({ username: result.data.username, hostname: result.data.hostname, }); }); } validate() { const ed = this.optionsEditor.current; let valid = true; if (this.state.provider !== "_token") { if (!validateRequiredFields(this, ["password"])) { valid = false; } } if (ed && !ed.validate()) { valid = false; } if (this.state.confirmCreate) { if (!validateRequiredFields(this, ["confirmPassword"])) { valid = false; } if (valid && this.state.password !== this.state.confirmPassword) { alert("Passwords don't match"); return false; } } return valid; } createRepository(e) { e.preventDefault(); if (!this.validate()) { return; } let request = { storage: { type: this.state.provider, config: this.state.providerSettings, }, password: this.state.password, options: { blockFormat: { hash: this.state.hash, encryption: this.state.encryption, }, objectFormat: { splitter: this.state.splitter, }, }, }; if (this.state.indexVersion) { request.options.blockFormat.indexVersion = parseInt(this.state.indexVersion) } request.clientOptions = this.clientOptions(); axios.post('/api/v1/repo/create', request).then(result => { window.location.replace("/"); }).catch(error => { if (error.response.data) { this.setState({ connectError: error.response.data.code + ": " + error.response.data.error, }); } }); } connectToRepository(e) { e.preventDefault(); if (!this.validate()) { return; } let request = null; switch (this.state.provider) { case "_token": request = { token: this.state.providerSettings.token, }; break; case "_server": request = { apiServer: this.state.providerSettings, password: this.state.password, }; break; default: request = { storage: { type: this.state.provider, config: this.state.providerSettings, }, password: this.state.password, }; break; } request.clientOptions = this.clientOptions(); this.setState({ isLoading: true }); axios.post('/api/v1/repo/connect', request).then(result => { this.setState({ isLoading: false }); window.location.replace("/"); }).catch(error => { this.setState({ isLoading: false }); if (error.response.data) { this.setState({ confirmCreate: false, connectError: error.response.data.code + ": " + error.response.data.error, }); } }); } clientOptions() { return { description: this.state.description, username: this.state.username, readonly: this.state.readonly, hostname: this.state.hostname, }; } toggleAdvanced() { this.setState({ showAdvanced: !this.state.showAdvanced }); } cancelCreate() { this.setState({ confirmCreate: false }); } renderProviderSelection() { return <>
To connect to a repository or create one, select the preferred storage type.
{JSON.stringify(this.state, null, 2)} */}
>;
}
}