remove "display name" from adding new friends

This commit is contained in:
2026-08-28 14:21:36 +08:00
parent a042945f5d
commit eb689210d4
17 changed files with 749 additions and 317 deletions
@@ -1,13 +1,24 @@
<script lang="ts">
import { getCurrentWindow } from "@tauri-apps/api/window";
import { onDestroy } from "svelte";
import { commands } from "$lib/bindings";
import PanelMessage from "$lib/components/control-panel/panel-message.svelte";
import Info from "$lib/icons/info.svelte";
let displayName = $state("");
let friendId = $state("");
let busy = $state(false);
let error = $state("");
let preview = $state<{
status: "idle" | "loading" | "resolved" | "unresolved" | "unavailable";
text: string;
}>({ status: "idle", text: "" });
let lookupTimer: ReturnType<typeof setTimeout> | undefined;
let lookupGeneration = 0;
onDestroy(() => {
lookupGeneration += 1;
if (lookupTimer) clearTimeout(lookupTimer);
});
async function closeWindow() {
await getCurrentWindow().close();
@@ -15,23 +26,52 @@
async function submit(event: SubmitEvent) {
event.preventDefault();
const name = displayName.trim();
const id = friendId.trim();
if (!name || !id) {
error = "Both display name and public key are required.";
if (!id) {
error = "Identification key is required.";
return;
}
busy = true;
error = "";
try {
await commands.createFriend({ id, displayName: name });
await commands.createFriend(id);
await closeWindow();
} catch (cause) {
error = String(cause);
busy = false;
}
}
function scheduleProfilePreview(event: Event) {
const id = (event.currentTarget as HTMLTextAreaElement).value.trim();
const generation = ++lookupGeneration;
if (lookupTimer) clearTimeout(lookupTimer);
if (!id) {
preview = { status: "idle", text: "" };
return;
}
preview = { status: "loading", text: "Resolving…" };
lookupTimer = setTimeout(
() => void resolveProfilePreview(id, generation),
250,
);
}
async function resolveProfilePreview(id: string, generation: number) {
try {
const displayName = await commands.resolveFriendDisplayName(id);
if (generation !== lookupGeneration) return;
preview = displayName
? { status: "resolved", text: displayName }
: { status: "unresolved", text: "Unresolved user" };
} catch {
if (generation === lookupGeneration) {
preview = { status: "unavailable", text: "Unresolved" };
}
}
}
</script>
<svelte:head><title>Add Friend</title></svelte:head>
@@ -46,18 +86,14 @@
<div class="min-h-0 flex-1 space-y-2">
{#if error}<PanelMessage kind="error">{error}</PanelMessage>{/if}
<PanelMessage>
Their display name will appear after Wyd learns their profile from a
shared server.
</PanelMessage>
<fieldset class="fieldset border border-base-300 bg-base-100 p-3">
<legend class="fieldset-legend px-1">Friend identity</legend>
<label class="fieldset-label" for="friend-name">Display name</label>
<input
id="friend-name"
class="input w-full"
bind:value={displayName}
maxlength="64"
autocomplete="off"
required
/>
<label class="fieldset-label mt-1" for="friend-key"
<label class="fieldset-label" for="friend-key"
>Identification Key <div
class="tooltip tooltip-primary"
data-tip="Verify with your friend before adding."
@@ -71,7 +107,20 @@
id="friend-key"
class="textarea h-20 w-full resize-none font-mono text-[10px]"
bind:value={friendId}
autocomplete="off"
oninput={scheduleProfilePreview}
required></textarea>
<label class="fieldset-label mt-1" for="friend-display-name"
>Display name</label
>
<input
id="friend-display-name"
class:italic={preview.status !== "resolved"}
class="input w-full"
value={preview.text}
aria-busy={preview.status === "loading"}
readonly
/>
</fieldset>
</div>
+5 -3
View File
@@ -1,7 +1,7 @@
<script lang="ts">
import { onMount } from "svelte";
import Popover from "$lib/components/popover.svelte";
import { friends } from "$lib/listeners/friends";
import { friendName, friends } from "$lib/listeners/friends";
import { onlineFriendIds } from "$lib/listeners/friend-statuses";
import { incomingInteraction } from "$lib/listeners/interactions";
import { liveMetadata } from "$lib/listeners/live-metadata";
@@ -44,8 +44,10 @@
function displayName(userId: string) {
return $profile?.id === userId
? $profile.displayName
: ($friends.find((friend) => friend.id === userId)?.displayName ??
"Unknown user");
: friendName(
$friends.find((friend) => friend.id === userId),
"Unknown user",
);
}
function dismissInteraction(interactionId: string) {
@@ -4,7 +4,7 @@
type AppMeta,
type InteractionContent,
} from "$lib/bindings";
import { friends } from "$lib/listeners/friends";
import { friendName, friends } from "$lib/listeners/friends";
import { profile } from "$lib/listeners/profile";
type Props = {
@@ -33,8 +33,10 @@
let username = $derived(
$profile?.id === userId
? $profile.displayName
: ($friends.find((friend) => friend.id === userId)?.displayName ??
"Unknown user"),
: friendName(
$friends.find((friend) => friend.id === userId),
"Unknown user",
),
);
function selectMode(nextMode: "message" | "image") {