From 0d41a65435581914a7d6ff7dbb7ccf7b2081970b Mon Sep 17 00:00:00 2001 From: John Costa Date: Sun, 5 Oct 2025 14:10:25 +0100 Subject: [PATCH] feat: deleting column from frontend --- backend/stacks/handler.go | 9 +-- frontend/src/contexts/SearchImageContext.tsx | 62 ++++++++++++-------- frontend/src/network/index.ts | 12 ++++ 3 files changed, 53 insertions(+), 30 deletions(-) diff --git a/backend/stacks/handler.go b/backend/stacks/handler.go index 7748eeb..76c0b4a 100644 --- a/backend/stacks/handler.go +++ b/backend/stacks/handler.go @@ -147,10 +147,10 @@ func (h *StackHandler) deleteImageFromStack(w http.ResponseWriter, r *http.Reque func (h *StackHandler) deleteImageStackSchemaItem(w http.ResponseWriter, r *http.Request) { ctx := r.Context() - stringImageID := chi.URLParam(r, "stackID") + stringStackID := chi.URLParam(r, "stackID") stringSchemaItemID := chi.URLParam(r, "schemaItemID") - imageID, err := uuid.Parse(stringImageID) + stackID, err := uuid.Parse(stringStackID) if err != nil { w.WriteHeader(http.StatusBadRequest) return @@ -169,8 +169,9 @@ func (h *StackHandler) deleteImageStackSchemaItem(w http.ResponseWriter, r *http return } - stack, err := h.stackModel.Get(ctx, schemaItemID) + stack, err := h.stackModel.Get(ctx, stackID) if err != nil { + h.logger.Error("could not get stack model", "err", err) w.WriteHeader(http.StatusInternalServerError) return } @@ -185,7 +186,7 @@ func (h *StackHandler) deleteImageStackSchemaItem(w http.ResponseWriter, r *http // manipulations. So we could create a middleware. // If you repeat this 3 times, then organise it :) - err = h.stackModel.DeleteSchemaItem(ctx, schemaItemID, imageID) + err = h.stackModel.DeleteSchemaItem(ctx, stackID, schemaItemID) if err != nil { h.logger.Warn("failed to delete image from list", "error", err) w.WriteHeader(http.StatusInternalServerError) diff --git a/frontend/src/contexts/SearchImageContext.tsx b/frontend/src/contexts/SearchImageContext.tsx index 7f122d9..a4dd6ff 100644 --- a/frontend/src/contexts/SearchImageContext.tsx +++ b/frontend/src/contexts/SearchImageContext.tsx @@ -7,7 +7,13 @@ import { createResource, useContext, } from "solid-js"; -import { deleteImage, deleteImageFromStack, getUserImages, JustTheImageWhatAreTheseNames } from "../network"; +import { + deleteImage, + deleteImageFromStack, + deleteStackItem, + getUserImages, + JustTheImageWhatAreTheseNames, +} from "../network"; export type SearchImageStore = { imagesByDate: Accessor< @@ -21,40 +27,41 @@ export type SearchImageStore = { onRefetchImages: () => void; onDeleteImage: (imageID: string) => void; onDeleteImageFromStack: (stackID: string, imageID: string) => void; + onDeleteStackItem: (stackID: string, schemaItemID: string) => void; }; const SearchImageContext = createContext(); export const SearchImageContextProvider: Component = (props) => { const [data, { refetch }] = createResource(getUserImages); - const sortedImages = createMemo>( - () => { - const d = data(); - if (d == null) { - return []; + const sortedImages = createMemo< + ReturnType + >(() => { + const d = data(); + if (d == null) { + return []; + } + + // Sorted by day. But we could potentially add more in the future. + const buckets: Record = {}; + + for (const image of d.UserImages) { + if (image.CreatedAt == null) { + continue; } - // Sorted by day. But we could potentially add more in the future. - const buckets: Record = {}; - - for (const image of d.UserImages) { - if (image.CreatedAt == null) { - continue; - } - - const date = new Date(image.CreatedAt).toDateString(); - if (!(date in buckets)) { - buckets[date] = []; - } - - buckets[date].push(image); + const date = new Date(image.CreatedAt).toDateString(); + if (!(date in buckets)) { + buckets[date] = []; } - return Object.entries(buckets) - .map(([date, images]) => ({ date: new Date(date), images })) - .sort((a, b) => b.date.getTime() - a.date.getTime()); - }, - ); + buckets[date].push(image); + } + + return Object.entries(buckets) + .map(([date, images]) => ({ date: new Date(date), images })) + .sort((a, b) => b.date.getTime() - a.date.getTime()); + }); return ( = (props) => { }, onDeleteImageFromStack: (stackID: string, imageID: string) => { deleteImageFromStack(stackID, imageID).then(refetch); - } + }, + onDeleteStackItem: (stackID: string, schemaItemID: string) => { + deleteStackItem(stackID, schemaItemID).then(refetch); + }, }} > {props.children} diff --git a/frontend/src/network/index.ts b/frontend/src/network/index.ts index 2c7147f..13e009c 100644 --- a/frontend/src/network/index.ts +++ b/frontend/src/network/index.ts @@ -121,6 +121,18 @@ export const deleteImageFromStack = async (listID: string, imageID: string): Pro await fetch(request); } +export const deleteStackItem = async ( + stackID: string, + schemaItemID: string, +): Promise => { + const request = await getBaseAuthorizedRequest({ + path: `stacks/${stackID}/${schemaItemID}`, + method: "DELETE", + }); + + await fetch(request); +} + export const deleteList = async (listID: string): Promise => { const request = await getBaseAuthorizedRequest({ path: `stacks/${listID}`,