import "./setup.css"; import { LOCALES, SetupSyncFromServerResponse } from "@triliumnext/commons"; import clsx from "clsx"; import { ComponentChildren, render } from "preact"; import { useEffect, useMemo, useRef, useState } from "preact/hooks"; import { useTranslation } from "react-i18next"; import logo from "./assets/icon-color.svg?url"; import { initLocale, t } from "./services/i18n"; import server from "./services/server"; import { isElectron, replaceHtmlEscapedSlashes } from "./services/utils"; import ActionButton from "./widgets/react/ActionButton"; import Admonition from "./widgets/react/Admonition"; import Button from "./widgets/react/Button"; import { Card, CardFrame, CardSection } from "./widgets/react/Card"; import FormGroup from "./widgets/react/FormGroup"; import FormList, { FormListItem } from "./widgets/react/FormList"; import FormTextBox from "./widgets/react/FormTextBox"; import Icon from "./widgets/react/Icon"; async function main() { await initLocale(); const bodyWrapper = document.createElement("div"); bodyWrapper.classList.add("setup-outer-wrapper"); document.body.classList.add("setup"); if (isElectron()) { document.body.classList.add("electron"); } render(, bodyWrapper); document.body.replaceChildren(bodyWrapper); } type State = "selectLanguage" | "firstOptions" | "createNewDocumentOptions" | "createNewDocumentWithDemo" | "createNewDocumentEmpty" | "syncFromDesktop" | "syncFromServer" | "syncInProgress" | "syncFailed"; const STATE_ORDER: State[] = ["selectLanguage", "firstOptions", "createNewDocumentOptions", "createNewDocumentWithDemo", "createNewDocumentEmpty", "syncFromDesktop", "syncFromServer", "syncInProgress", "syncFailed"]; function renderState(state: State, setState: (state: State) => void) { switch (state) { case "selectLanguage": return ; case "firstOptions": return ; case "createNewDocumentOptions": return ; case "createNewDocumentWithDemo": return ; case "createNewDocumentEmpty": return ; case "syncFromServer": return ; case "syncFromDesktop": return ; case "syncInProgress": return ; default: return null; } } function App() { const [state, setState] = useState("syncFromDesktop"); const [prevState, setPrevState] = useState(null); const [transitioning, setTransitioning] = useState(false); const prevStateRef = useRef(state); function handleSetState(newState: State) { setPrevState(prevStateRef.current); prevStateRef.current = newState; setTransitioning(true); setState(newState); } const direction = prevState !== null ? STATE_ORDER.indexOf(state) > STATE_ORDER.indexOf(prevState) ? "forward" : "backward" : "forward"; return (
{transitioning && prevState !== null && (
{ setTransitioning(false); setPrevState(null); }} > {renderState(prevState, handleSetState)}
)}
{renderState(state, handleSetState)}
); } function SelectLanguage({ setState }: { setState: (state: State) => void }) { const { t, i18n } = useTranslation(); const [ currentLocale, setCurrentLocale ] = useState(i18n.language); const filteredLocales = useMemo(() => LOCALES.filter(l => !l.contentOnly), []); return ( } footer={