- Compress responses: page scripts and styles once (brotli or gzip, in memory) and cached immutable; pages and API JSON gzipped as they stream - Service worker serves content-named assets cache-first - Load the models modal's data when it opens (cached in localStorage) instead of shipping the model catalog in every conversation page - Lazy-load the Tiptap composer and memoize thread messages - Import lucide icons directly; twui 0.1.4 drops by-name icons from Button - bun run start builds the pages minified before serving Co-Authored-By: Claude Opus 5.5 <[email protected]>
45 lines
1.2 KiB
TypeScript
45 lines
1.2 KiB
TypeScript
import { DatabaseBackup } from "lucide-react";
|
|
import Button from "@moduletrace/twui/layout/Button";
|
|
import Tag from "@moduletrace/twui/elements/Tag";
|
|
import Row from "@moduletrace/twui/layout/Row";
|
|
import useStatus from "@moduletrace/twui/hooks/useStatus";
|
|
import createBackup from "../(functions)/create-backup";
|
|
|
|
export default function CreateBackupButton() {
|
|
const { loading, setLoading, status, setStatus } = useStatus();
|
|
|
|
const create_backup = async () => {
|
|
setStatus(undefined);
|
|
setLoading(true);
|
|
|
|
const res = await createBackup();
|
|
|
|
if (res.success) {
|
|
window.location.reload();
|
|
return;
|
|
}
|
|
|
|
setLoading(false);
|
|
|
|
if (res.msg) {
|
|
setStatus({ error: true, msg: res.msg });
|
|
}
|
|
};
|
|
|
|
return (
|
|
<Row className="gap-2! flex-nowrap">
|
|
{status?.error && <Tag color="error">{status.msg}</Tag>}
|
|
<Button
|
|
title="Create Backup"
|
|
beforeIcon={<DatabaseBackup />}
|
|
loading={loading}
|
|
onClick={() => {
|
|
create_backup();
|
|
}}
|
|
>
|
|
Create backup
|
|
</Button>
|
|
</Row>
|
|
);
|
|
}
|