Compare commits
3 Commits
feat/due-d
...
fix/delete
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5fcd0e8688 | ||
|
|
d208952d15 | ||
|
|
88f1aa0ec4 |
@@ -156,6 +156,7 @@ export default function CardPage({ isTemplate }: { isTemplate?: boolean }) {
|
||||
getModalState,
|
||||
clearModalState,
|
||||
isOpen,
|
||||
modalStates,
|
||||
} = useModal();
|
||||
const { showPopup } = usePopup();
|
||||
const { workspace } = useWorkspace();
|
||||
@@ -192,6 +193,21 @@ export default function CardPage({ isTemplate }: { isTemplate?: boolean }) {
|
||||
},
|
||||
});
|
||||
|
||||
const addOrRemoveLabel = api.card.addOrRemoveLabel.useMutation({
|
||||
onError: () => {
|
||||
showPopup({
|
||||
header: t`Unable to add label`,
|
||||
message: t`Please try again later, or contact customer support.`,
|
||||
icon: "error",
|
||||
});
|
||||
},
|
||||
onSettled: async () => {
|
||||
if (cardId) {
|
||||
await utils.card.byId.invalidate({ cardPublicId: cardId });
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
const { register, handleSubmit, setValue, watch } = useForm<FormValues>({
|
||||
values: {
|
||||
cardId: cardId ?? "",
|
||||
@@ -208,6 +224,24 @@ export default function CardPage({ isTemplate }: { isTemplate?: boolean }) {
|
||||
});
|
||||
};
|
||||
|
||||
// this adds the new created label to selected labels
|
||||
useEffect(() => {
|
||||
const newLabelId = modalStates.NEW_LABEL_CREATED;
|
||||
if (newLabelId && cardId) {
|
||||
const isAlreadyAdded = card?.labels.some(
|
||||
(label) => label.publicId === newLabelId,
|
||||
);
|
||||
|
||||
if (!isAlreadyAdded) {
|
||||
addOrRemoveLabel.mutate({
|
||||
cardPublicId: cardId,
|
||||
labelPublicId: newLabelId,
|
||||
});
|
||||
}
|
||||
clearModalState("NEW_LABEL_CREATED");
|
||||
}
|
||||
}, [modalStates.NEW_LABEL_CREATED, card, cardId]);
|
||||
|
||||
// Open the new item form after creating a new checklist
|
||||
useEffect(() => {
|
||||
if (!card) return;
|
||||
|
||||
@@ -9,7 +9,7 @@ import { generateUID } from "@kan/shared/utils";
|
||||
|
||||
import { createTRPCRouter, protectedProcedure } from "../trpc";
|
||||
import { assertUserInWorkspace } from "../utils/auth";
|
||||
import { generateUploadUrl } from "../utils/s3";
|
||||
import { deleteObject, generateUploadUrl } from "../utils/s3";
|
||||
|
||||
export const attachmentRouter = createTRPCRouter({
|
||||
generateUploadUrl: protectedProcedure
|
||||
@@ -189,6 +189,18 @@ export const attachmentRouter = createTRPCRouter({
|
||||
|
||||
await assertUserInWorkspace(ctx.db, userId, workspaceId);
|
||||
|
||||
const bucket = process.env.NEXT_PUBLIC_ATTACHMENTS_BUCKET_NAME;
|
||||
if (bucket) {
|
||||
try {
|
||||
await deleteObject(bucket, attachment.s3Key);
|
||||
} catch (error) {
|
||||
console.error(
|
||||
`Failed to delete attachment from S3: ${attachment.s3Key}`,
|
||||
error,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
await cardAttachmentRepo.softDelete(ctx.db, {
|
||||
attachmentId: attachment.id,
|
||||
deletedAt: new Date(),
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import {
|
||||
DeleteObjectCommand,
|
||||
GetObjectCommand,
|
||||
PutObjectCommand,
|
||||
S3Client,
|
||||
@@ -56,3 +57,13 @@ export async function generateDownloadUrl(
|
||||
{ expiresIn },
|
||||
);
|
||||
}
|
||||
|
||||
export async function deleteObject(bucket: string, key: string) {
|
||||
const client = createS3Client();
|
||||
await client.send(
|
||||
new DeleteObjectCommand({
|
||||
Bucket: bucket,
|
||||
Key: key,
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user