diff --git a/README.md b/README.md
index ab791da..3a2b70f 100644
--- a/README.md
+++ b/README.md
@@ -8,8 +8,10 @@
-
+
+
+
## Introduction
@@ -39,4 +41,4 @@ You are welcome to contribute to Plunk. You can find a guide on how to contribut
-
\ No newline at end of file
+
diff --git a/package.json b/package.json
index 1e60e5e..d3bc611 100644
--- a/package.json
+++ b/package.json
@@ -1,40 +1,38 @@
{
- "name": "plunk",
- "version": "1.0.3",
- "private": true,
- "license": "agpl-3.0",
- "workspaces": {
- "packages": [
- "packages/*"
- ]
- },
- "engines": {
- "npm": ">=6.14.x",
- "yarn": "1.22.x",
- "node": ">=18.x"
- },
- "devDependencies": {
- "@biomejs/biome": "^1.8.3",
- "lerna": "^8.1.6",
- "prisma": "^5.17.0",
- "rimraf": "^5.0.9"
- },
- "dependencies": {
- "@prisma/client": "^5.17.0"
- },
- "scripts": {
- "dev:api": "yarn workspace @plunk/api dev",
- "dev:dashboard": "yarn workspace @plunk/dashboard dev",
- "dev:shared": "yarn workspace @plunk/shared dev",
- "build:api": "yarn build:shared && yarn workspace @plunk/api build",
- "build:dashboard": "yarn build:shared && yarn workspace @plunk/dashboard build",
- "build:shared": "yarn generate && yarn workspace @plunk/shared build",
- "clean": "rimraf node_modules yarn.lock && yarn add lerna -DW && lerna run clean",
- "preinstall": "node tools/preinstall.js",
- "migrate": "prisma migrate dev",
- "migrate:deploy": "prisma migrate deploy",
- "generate": "prisma generate",
- "services:up": "docker compose -f docker-compose.dev.yml up -d",
- "services:down": "docker compose -f docker-compose.dev.yml down"
- }
+ "name": "plunk",
+ "version": "1.0.5",
+ "private": true,
+ "license": "agpl-3.0",
+ "workspaces": {
+ "packages": ["packages/*"]
+ },
+ "engines": {
+ "npm": ">=6.14.x",
+ "yarn": "1.22.x",
+ "node": ">=18.x"
+ },
+ "devDependencies": {
+ "@biomejs/biome": "^1.8.3",
+ "lerna": "^8.1.6",
+ "prisma": "^5.17.0",
+ "rimraf": "^5.0.9"
+ },
+ "dependencies": {
+ "@prisma/client": "^5.17.0"
+ },
+ "scripts": {
+ "dev:api": "yarn workspace @plunk/api dev",
+ "dev:dashboard": "yarn workspace @plunk/dashboard dev",
+ "dev:shared": "yarn workspace @plunk/shared dev",
+ "build:api": "yarn build:shared && yarn workspace @plunk/api build",
+ "build:dashboard": "yarn build:shared && yarn workspace @plunk/dashboard build",
+ "build:shared": "yarn generate && yarn workspace @plunk/shared build",
+ "clean": "rimraf node_modules yarn.lock && yarn add lerna -DW && lerna run clean",
+ "preinstall": "node tools/preinstall.js",
+ "migrate": "prisma migrate dev",
+ "migrate:deploy": "prisma migrate deploy",
+ "generate": "prisma generate",
+ "services:up": "docker compose -f docker-compose.dev.yml up -d",
+ "services:down": "docker compose -f docker-compose.dev.yml down"
+ }
}
diff --git a/packages/api/src/controllers/v1/Contacts.ts b/packages/api/src/controllers/v1/Contacts.ts
index 76a124a..7389975 100644
--- a/packages/api/src/controllers/v1/Contacts.ts
+++ b/packages/api/src/controllers/v1/Contacts.ts
@@ -103,13 +103,13 @@ export class Contacts {
const { id, email } = ContactSchemas.manage.parse(req.body);
- const contact = id ? await ContactService.id(id) : await ContactService.email(project.id, email as string);
+ let contact = id ? await ContactService.id(id) : await ContactService.email(project.id, email as string);
if (!contact || contact.projectId !== project.id) {
throw new NotFound("contact");
}
- await prisma.contact.update({
+ contact = await prisma.contact.update({
where: { id: contact.id },
data: { subscribed: false },
});
@@ -154,13 +154,13 @@ export class Contacts {
const { id, email } = ContactSchemas.manage.parse(req.body);
- const contact = id ? await ContactService.id(id) : await ContactService.email(project.id, email as string);
+ let contact = id ? await ContactService.id(id) : await ContactService.email(project.id, email as string);
if (!contact || contact.projectId !== project.id) {
throw new NotFound("contact");
}
- await prisma.contact.update({
+ contact = await prisma.contact.update({
where: { id: contact.id },
data: { subscribed: true },
});
diff --git a/packages/api/src/controllers/v1/Events.ts b/packages/api/src/controllers/v1/Events.ts
index d10c97d..9cf699f 100644
--- a/packages/api/src/controllers/v1/Events.ts
+++ b/packages/api/src/controllers/v1/Events.ts
@@ -33,6 +33,7 @@ export class Events {
await prisma.event.delete({ where: { id } });
await redis.del(Keys.Event.id(id));
+ await redis.del(Keys.Event.event(project.id, event.name));
return res.status(200).json(event);
}
diff --git a/packages/dashboard/src/components/Input/MarkdownEditor/Editor.tsx b/packages/dashboard/src/components/Input/MarkdownEditor/Editor.tsx
index d9ecfd6..c7fdad0 100644
--- a/packages/dashboard/src/components/Input/MarkdownEditor/Editor.tsx
+++ b/packages/dashboard/src/components/Input/MarkdownEditor/Editor.tsx
@@ -108,6 +108,22 @@ export default function Editor({ value, onChange, mode, modeSwitcher }: Markdown
keydown: (_view, event) => {
return event.key === "Enter" && !event.shiftKey;
},
+ paste: (view, event) => {
+ const text = event.clipboardData?.getData("text");
+ const urlPattern = /^(https?:\/\/)?([\w-]+\.)+[\w-]+(\/[\w- ./?%&=]*({{[\w-]+}})?)*$/;
+
+ if (editor && text && urlPattern.test(text)) {
+ event.preventDefault();
+ editor
+ .chain()
+ .focus()
+ .extendMarkRange("link")
+ .setLink({ href: text.startsWith("http") ? text : `https://${text}`, target: "_blank" })
+ .run();
+ editor.commands.insertContent(text);
+ }
+ return true;
+ },
},
},
onUpdate: ({ editor }) => {