diff --git a/web/src/lib/components/settings/tabs/KeysTab.svelte b/web/src/lib/components/settings/tabs/KeysTab.svelte
index 8adad51a..75228950 100644
--- a/web/src/lib/components/settings/tabs/KeysTab.svelte
+++ b/web/src/lib/components/settings/tabs/KeysTab.svelte
@@ -3,18 +3,22 @@
import { createBobbinClient } from "$lib/api/client";
import {
listPubKeys,
- createPubKey,
deletePubKey,
type ListedRecord,
type PublicKeyRecord
} from "$lib/api/settings";
- import Section from "$lib/components/ui/Section.svelte";
import Button from "$lib/components/ui/Button.svelte";
import Spinner from "$lib/components/ui/Spinner.svelte";
import ErrorAlert from "$lib/components/ui/Error.svelte";
- import KeyCard from "../KeyCard.svelte";
- import AddKeyForm from "../AddKeyForm.svelte";
+ import EmptyState from "$lib/components/ui/EmptyState.svelte";
+ import TimeAgo from "$lib/components/ui/TimeAgo.svelte";
+ import SettingsHeader from "../SettingsHeader.svelte";
+ import SettingsToolbar from "../SettingsToolbar.svelte";
+ import SettingsList from "../SettingsList.svelte";
+ import SettingsEntry from "../SettingsEntry.svelte";
import Plus from "$icon/plus";
+ import Trash from "$icon/trash-2";
+ import Key from "$icon/key";
const auth = getAuth();
const user = $derived(auth.currentUser);
@@ -23,12 +27,6 @@
let fingerprints = $state>({});
let loading = $state(true);
let loadError = $state(null);
-
- let popover = $state();
- let name = $state("");
- let key = $state("");
- let submitting = $state(false);
- let formError = $state(null);
let deleting = $state(null);
// ssh SHA256 fingerprint of the base64 key blob, matching `ssh-keygen -lf`.
@@ -70,41 +68,6 @@
if (user?.did) void load();
});
- const resetForm = () => {
- name = "";
- key = "";
- formError = null;
- };
-
- const add = async () => {
- if (!auth.agent) return;
- submitting = true;
- formError = null;
- try {
- const trimmedName = name.trim();
- const trimmedKey = key.trim();
- const rkey = await createPubKey(auth.agent, trimmedName, trimmedKey);
- const createdAt = new Date().toISOString();
- // prepend to local state (newest first) instead of refetching everything.
- keys = [
- {
- uri: `at://${auth.agent.sub}/sh.tangled.publicKey/${rkey}`,
- rkey,
- value: { $type: "sh.tangled.publicKey", name: trimmedName, key: trimmedKey, createdAt }
- },
- ...keys
- ];
- const fp = await sshFingerprint(trimmedKey);
- if (fp) fingerprints = { ...fingerprints, [rkey]: fp };
- resetForm();
- popover?.hidePopover();
- } catch (err) {
- formError = err instanceof Error ? err.message : "Failed to add key";
- } finally {
- submitting = false;
- }
- };
-
const remove = async (k: ListedRecord) => {
if (!auth.agent) return;
if (!confirm(`Are you sure you want to delete the key ${k.value.name}?`)) return;
@@ -121,60 +84,56 @@
};
-
-
-
-
SSH keys
-
-
-
- SSH public keys added here will be broadcasted to knots that you are a member of, allowing you
- to push to repositories there and verify commit signatures.
-
- Knots are lightweight headless servers that enable users to host Git repositories with ease.
- When creating a repository, you can choose a knot to store it on.
-