aboutsummaryrefslogtreecommitdiffstats
path: root/apps/web/components
diff options
context:
space:
mode:
authorMohamedBassem <me@mbassem.com>2024-09-01 19:29:11 +0000
committerMohamedBassem <me@mbassem.com>2024-09-01 19:29:11 +0000
commit300f3c5d0b661c430ad2f6b479b151ec65f14243 (patch)
tree7d4e18fdd00e44e845aacd5e490286e370b9c34f /apps/web/components
parent67729c131c92a2fab6d1422db34aa000c348af07 (diff)
downloadkarakeep-300f3c5d0b661c430ad2f6b479b151ec65f14243.tar.zst
fix(web): Add optimistic rendering for the tags editor
Diffstat (limited to 'apps/web/components')
-rw-r--r--apps/web/components/dashboard/bookmarks/TagsEditor.tsx26
1 files changed, 24 insertions, 2 deletions
diff --git a/apps/web/components/dashboard/bookmarks/TagsEditor.tsx b/apps/web/components/dashboard/bookmarks/TagsEditor.tsx
index d50acc60..4468b28a 100644
--- a/apps/web/components/dashboard/bookmarks/TagsEditor.tsx
+++ b/apps/web/components/dashboard/bookmarks/TagsEditor.tsx
@@ -1,4 +1,5 @@
import type { ActionMeta } from "react-select";
+import { useState } from "react";
import { useClientConfig } from "@/lib/clientConfig";
import { api } from "@/lib/trpc";
import { cn } from "@/lib/utils";
@@ -17,7 +18,7 @@ interface EditableTag {
}
export function TagsEditor({
- tags,
+ tags: _tags,
onAttach,
onDetach,
}: {
@@ -27,6 +28,8 @@ export function TagsEditor({
}) {
const demoMode = !!useClientConfig().demoMode;
+ const [optimisticTags, setOptimisticTags] = useState<ZBookmarkTags[]>(_tags);
+
const { data: existingTags, isLoading: isExistingTagsLoading } =
api.tags.list.useQuery();
@@ -40,6 +43,9 @@ export function TagsEditor({
case "pop-value":
case "remove-value": {
if (actionMeta.removedValue.value) {
+ setOptimisticTags((prev) =>
+ prev.filter((t) => t.id != actionMeta.removedValue.value),
+ );
onDetach({
tagId: actionMeta.removedValue.value,
tagName: actionMeta.removedValue.label,
@@ -48,11 +54,27 @@ export function TagsEditor({
break;
}
case "create-option": {
+ setOptimisticTags((prev) => [
+ ...prev,
+ {
+ id: "",
+ name: actionMeta.option.label,
+ attachedBy: "human" as const,
+ },
+ ]);
onAttach({ tagName: actionMeta.option.label });
break;
}
case "select-option": {
if (actionMeta.option) {
+ setOptimisticTags((prev) => [
+ ...prev,
+ {
+ id: actionMeta.option?.value ?? "",
+ name: actionMeta.option!.label,
+ attachedBy: "human" as const,
+ },
+ ]);
onAttach({
tagName: actionMeta.option.label,
tagId: actionMeta.option?.value,
@@ -74,7 +96,7 @@ export function TagsEditor({
attachedBy: "human" as const,
})) ?? []
}
- value={tags.map((t) => ({
+ value={optimisticTags.map((t) => ({
label: t.name,
value: t.id,
attachedBy: t.attachedBy,