kraken9054 nsarrazin HF Staff commited on
Commit
b21a61b
·
unverified ·
1 Parent(s): 3c43b1b

Feat: Delete branch #1210 (#1240)

Browse files

* feat: delete branch #1210

* removed some files

* lint

* types & error handling

* Improve query efficiency & add auth check

* Icon styling

* make it hover only

---------

Co-authored-by: Nathan Sarrazin <[email protected]>

src/lib/components/chat/ChatMessage.svelte CHANGED
@@ -10,6 +10,7 @@
10
  import CopyToClipBoardBtn from "../CopyToClipBoardBtn.svelte";
11
  import IconLoading from "../icons/IconLoading.svelte";
12
  import CarbonRotate360 from "~icons/carbon/rotate-360";
 
13
  import CarbonDownload from "~icons/carbon/download";
14
  import CarbonThumbsUp from "~icons/carbon/thumbs-up";
15
  import CarbonThumbsDown from "~icons/carbon/thumbs-down";
@@ -512,7 +513,7 @@
512
  <svelte:fragment slot="childrenNav">
513
  {#if nChildren > 1 && $convTreeStore.editing === null}
514
  <div
515
- class="font-white z-10 -mt-1 ml-3.5 mr-auto flex h-6 w-fit select-none flex-row items-center justify-center gap-1 text-sm"
516
  >
517
  <button
518
  class="inline text-lg font-thin text-gray-400 disabled:pointer-events-none disabled:opacity-25 hover:text-gray-800 dark:text-gray-500 dark:hover:text-gray-200"
@@ -535,6 +536,19 @@
535
  >
536
  <CarbonChevronRight class="text-sm" />
537
  </button>
 
 
 
 
 
 
 
 
 
 
 
 
 
538
  </div>
539
  {/if}
540
  </svelte:fragment>
 
10
  import CopyToClipBoardBtn from "../CopyToClipBoardBtn.svelte";
11
  import IconLoading from "../icons/IconLoading.svelte";
12
  import CarbonRotate360 from "~icons/carbon/rotate-360";
13
+ import CarbonTrashCan from "~icons/carbon/trash-can";
14
  import CarbonDownload from "~icons/carbon/download";
15
  import CarbonThumbsUp from "~icons/carbon/thumbs-up";
16
  import CarbonThumbsDown from "~icons/carbon/thumbs-down";
 
513
  <svelte:fragment slot="childrenNav">
514
  {#if nChildren > 1 && $convTreeStore.editing === null}
515
  <div
516
+ class="font-white group/navbranch z-10 -mt-1 ml-3.5 mr-auto flex h-6 w-fit select-none flex-row items-center justify-center gap-1 text-sm"
517
  >
518
  <button
519
  class="inline text-lg font-thin text-gray-400 disabled:pointer-events-none disabled:opacity-25 hover:text-gray-800 dark:text-gray-500 dark:hover:text-gray-200"
 
536
  >
537
  <CarbonChevronRight class="text-sm" />
538
  </button>
539
+ {#if !loading && message.children}<form
540
+ method="POST"
541
+ action="?/deleteBranch"
542
+ class="hidden group-hover/navbranch:block"
543
+ >
544
+ <input name="messageId" value={message.children[childrenToRender]} type="hidden" />
545
+ <button
546
+ class="flex items-center justify-center text-xs text-gray-400 hover:text-gray-800 dark:text-gray-500 dark:hover:text-gray-200"
547
+ type="submit"
548
+ ><CarbonTrashCan />
549
+ </button>
550
+ </form>
551
+ {/if}
552
  </div>
553
  {/if}
554
  </svelte:fragment>
src/routes/conversation/[id]/+page.server.ts CHANGED
@@ -66,3 +66,44 @@ export const load = async ({ params, depends, locals }) => {
66
  shared,
67
  };
68
  };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
66
  shared,
67
  };
68
  };
69
+
70
+ export const actions = {
71
+ deleteBranch: async ({ request, locals, params }) => {
72
+ const data = await request.formData();
73
+ const messageId = data.get("messageId");
74
+
75
+ if (!messageId || typeof messageId !== "string") {
76
+ throw error(400, "Invalid message id");
77
+ }
78
+
79
+ const conversation = await collections.conversations.findOne({
80
+ ...authCondition(locals),
81
+ _id: new ObjectId(params.id),
82
+ });
83
+
84
+ if (!conversation) {
85
+ throw error(404, "Conversation not found");
86
+ }
87
+
88
+ const filteredMessages = conversation.messages
89
+ .filter(
90
+ (message) =>
91
+ // not the message AND the message is not in ancestors
92
+ !(message.id === messageId) && message.ancestors && !message.ancestors.includes(messageId)
93
+ )
94
+ .map((message) => {
95
+ // remove the message from children if it's there
96
+ if (message.children && message.children.includes(messageId)) {
97
+ message.children = message.children.filter((child) => child !== messageId);
98
+ }
99
+ return message;
100
+ });
101
+
102
+ await collections.conversations.updateOne(
103
+ { _id: conversation._id, ...authCondition(locals) },
104
+ { $set: { messages: filteredMessages } }
105
+ );
106
+
107
+ return { from: "deleteBranch", ok: true };
108
+ },
109
+ };