From a549481b61d8cc66e706b684580c22700bc588b3 Mon Sep 17 00:00:00 2001 From: oiov Date: Sat, 29 Mar 2025 17:18:05 +0800 Subject: [PATCH] chore style --- .../dashboard/records/record-list.tsx | 2 + app/(protected)/dashboard/urls/meta-chart.tsx | 53 ++- app/(protected)/dashboard/urls/url-list.tsx | 27 +- app/api/v1/email-catcher/route.ts | 8 + components/forms/record-form.tsx | 332 +++++++++--------- components/forms/url-form.tsx | 300 ++++++++-------- emails/magic-link-email.tsx | 68 ---- public/sw.js.map | 2 +- 8 files changed, 393 insertions(+), 399 deletions(-) create mode 100644 app/api/v1/email-catcher/route.ts delete mode 100644 emails/magic-link-email.tsx diff --git a/app/(protected)/dashboard/records/record-list.tsx b/app/(protected)/dashboard/records/record-list.tsx index 9430920..744a16f 100644 --- a/app/(protected)/dashboard/records/record-list.tsx +++ b/app/(protected)/dashboard/records/record-list.tsx @@ -233,6 +233,8 @@ export default function UserRecordsList({ user, action }: RecordListProps) { + + ) : data && data.list && data.list.length ? ( data.list.map((record) => ( diff --git a/app/(protected)/dashboard/urls/meta-chart.tsx b/app/(protected)/dashboard/urls/meta-chart.tsx index cbe1705..a96155f 100644 --- a/app/(protected)/dashboard/urls/meta-chart.tsx +++ b/app/(protected)/dashboard/urls/meta-chart.tsx @@ -170,9 +170,6 @@ export function DailyPVUVChart({ .filter(Boolean) .join(" "); - const areaData = data.map((item) => ({ - id: item.country, - })); // const pointData = data.map((item) => ({ // id: item.id, // city: item.city, @@ -194,6 +191,13 @@ export function DailyPVUVChart({ } }); + const areaData = Object.entries(countryClicks).map( + ([country, clicks], index) => ({ + id: country, + // color: getColorByClicks(clicks, index, countryClicks), + }), + ); + const triggers = { [TopoJSONMap.selectors.feature]: (d: any) => `${getCountryName(d.id)} · ${countryClicks[d.id] || 0}`, @@ -441,3 +445,46 @@ export function StatsList({ data, title }: { data: Stat[]; title: string }) { ); } + +// const baseColors = [ +// "#ff6b7e", +// "#a6cc74", +// "#4d8cfd", +// "#f4b83e", +// "#FF00FF", +// "#6859be", +// ]; + +// const hexToRgb = (hex: string) => { +// const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); +// return result +// ? { +// r: parseInt(result[1], 16), +// g: parseInt(result[2], 16), +// b: parseInt(result[3], 16), +// } +// : null; +// }; + +// const getColorByClicks = ( +// clicks: number, +// baseColorIndex: number, +// countryClicks: { [key: string]: number }, +// ) => { +// const maxClicks = Math.max(...Object.values(countryClicks)); +// const minClicks = Math.min(...Object.values(countryClicks)); + +// // 归一化点击次数 +// const normalized = +// maxClicks === minClicks +// ? 0 +// : (clicks - minClicks) / (maxClicks - minClicks); + +// // 获取基础颜色 +// const baseColor = hexToRgb(baseColors[baseColorIndex % baseColors.length]); + +// // 最低60%透明度,最高100%不透明 +// const alpha = 0.5 + normalized * 0.5; + +// return `rgba(${baseColor!.r}, ${baseColor!.g}, ${baseColor!.b}, ${alpha})`; +// }; diff --git a/app/(protected)/dashboard/urls/url-list.tsx b/app/(protected)/dashboard/urls/url-list.tsx index ff906df..3ad1242 100644 --- a/app/(protected)/dashboard/urls/url-list.tsx +++ b/app/(protected)/dashboard/urls/url-list.tsx @@ -66,8 +66,8 @@ export interface UrlListProps { function TableColumnSekleton() { return ( - - + + @@ -223,6 +223,17 @@ export default function UserUrlsList({ user, action }: UrlListProps) { + {isShowForm && ( + + )}
)}
- {isShowForm && ( - - )} + diff --git a/app/api/v1/email-catcher/route.ts b/app/api/v1/email-catcher/route.ts new file mode 100644 index 0000000..0bb9487 --- /dev/null +++ b/app/api/v1/email-catcher/route.ts @@ -0,0 +1,8 @@ +export async function POST(req: Request) { + try { + const { email } = await req.json(); + return Response.json({ email }); + } catch (error) { + return Response.json({ statusText: "Server error" }, { status: 500 }); + } +} diff --git a/components/forms/record-form.tsx b/components/forms/record-form.tsx index cc6f9e1..e38b14b 100644 --- a/components/forms/record-form.tsx +++ b/components/forms/record-form.tsx @@ -155,144 +155,145 @@ export function RecordForm({ }; return ( -
-
- - { + setValue("type", value); + setCurrentRecordType(value); + }} + name={"type"} + defaultValue={initData?.type || "CNAME"} + > + + + + + {RECORD_TYPE_ENUMS.map((type) => ( + + {type.label} + + ))} + + +

Required.

+
+ +
+ +
+ + {currentRecordType === "CNAME" || + (currentRecordType === "A" && ( + + .wr.do + + ))} +
+
+
+ {errors?.name ? ( +

+ {errors.name.message} +

+ ) : ( +

+ Required. Use @ for root. +

+ )} +
+
+ - - - - - {RECORD_TYPE_ENUMS.map((type) => ( - - {type.label} - - ))} - - -

Required.

-
- -
- -
+
+ - {currentRecordType === "CNAME" || - (currentRecordType === "A" && ( - - .wr.do - - ))}
-
-
- {errors?.name ? ( -

- {errors.name.message} -

- ) : ( -

- Required. Use @ for root. -

- )} -
- - -
- - -
-
- {errors?.content ? ( -

- {errors.content.message} -

- ) : ( -

- {currentRecordType === "CNAME" - ? "Required. E.g. www.example.com" - : currentRecordType === "A" - ? "Required. E.g. 8.8.8.8" - : "Required."} -

- )} -
-
-
+
+ {errors?.content ? ( +

+ {errors.content.message} +

+ ) : ( +

+ {currentRecordType === "CNAME" + ? "Required. E.g. www.example.com" + : currentRecordType === "A" + ? "Required. E.g. 8.8.8.8" + : "Required."} +

+ )} +
+
+
-
- - -

- Optional. Time To Live. -

-
- -
- - -
-

- Enter your comment here (up to 100 characters) -

-
- {/* +
+ + +

+ Optional. Time To Live. +

+
+ +
+ + +
+

+ Enter your comment here (up to 100 characters) +

+
+ {/*

Proxy status

*/} -
+
- {/* Action buttons */} -
- {type === "edit" && ( + {/* Action buttons */} +
+ {type === "edit" && ( + + )} + - )} - - -
- +
+ + ); } diff --git a/components/forms/url-form.tsx b/components/forms/url-form.tsx index 6c47921..7436bb3 100644 --- a/components/forms/url-form.tsx +++ b/components/forms/url-form.tsx @@ -145,124 +145,125 @@ export function UrlForm({ }; return ( -
-
- -
- - -
-
- {errors?.target ? ( -

- {errors.target.message} -

- ) : ( -

- Required. https://your-origin-url -

- )} -
-
- -
- +
+
+ {type === "add" ? "Create" : "Edit"} short link +
+ +
+ +
+ + +
+
+ {errors?.target ? ( +

+ {errors.target.message} +

+ ) : ( +

+ Required. https://your-origin-url +

+ )} +
+
+ +
+ -
- - {/* +
+ + {/* /s/ */} - - + + +
-
-
- {errors?.url ? ( -

- {errors.url.message} -

- ) : ( -

- A random url suffix. Final url like「wr.do/s/suffix」 -

- )} -
-
-
+
+ {errors?.url ? ( +

+ {errors.url.message} +

+ ) : ( +

+ A random url suffix. Final url like「wr.do/s/suffix」 +

+ )} +
+ +
-
- - -

- Expiration time, default for never. -

-
- {/*
+
+ + +

+ Expiration time, default for never. +

+
+ {/*

Your Final URL:

@@ -270,7 +271,7 @@ export function UrlForm({ {getValues("prefix")}/s/{getValues("url")}

*/} - {/* + {/*
- {/* Action buttons */} -
- {type === "edit" && ( + {/* Action buttons */} +
+ {type === "edit" && ( + + )} + - )} - - -
- +
+ +
); } diff --git a/emails/magic-link-email.tsx b/emails/magic-link-email.tsx deleted file mode 100644 index da80713..0000000 --- a/emails/magic-link-email.tsx +++ /dev/null @@ -1,68 +0,0 @@ -import { - Body, - Button, - Container, - Head, - Hr, - Html, Preview, - Section, - Tailwind, - Text -} from '@react-email/components'; -import { Icons } from '../components/shared/icons'; - -type MagicLinkEmailProps = { - actionUrl: string - firstName: string - mailType: "login" | "register" - siteName: string -} - -export const MagicLinkEmail = ({ - firstName = '', - actionUrl, - mailType, - siteName -}: MagicLinkEmailProps) => ( - - - - The sales intelligence platform that helps you uncover qualified leads. - - - - - - - Hi {firstName}, - - - Welcome to {siteName} ! Click the link below to {mailType === "login" ? "sign in to" : "activate"} your account. - -
- -
- - This link expires in 24 hours and can only be used once. - - {mailType === "login" ? ( - - If you did not try to log into your account, you can safely ignore it. - - ) : null} -
- - 123 Code Street, Suite 404, Devtown, CA 98765 - -
- -
- -); - -export default MagicLinkEmail; \ No newline at end of file diff --git a/public/sw.js.map b/public/sw.js.map index f1fd01e..57700f9 100644 --- a/public/sw.js.map +++ b/public/sw.js.map @@ -1 +1 @@ -{"version":3,"file":"sw.js","sources":["../../../../../private/var/folders/9b/3qmyp8zd2xvdspdrp149fyg00000gn/T/f83ff6a791ead8769131962af5e0eb7f/sw.js"],"sourcesContent":["import {registerRoute as workbox_routing_registerRoute} from '/Users/songjunxi/Desktop/repos/wr.do/node_modules/.pnpm/workbox-routing@6.6.0/node_modules/workbox-routing/registerRoute.mjs';\nimport {NetworkFirst as workbox_strategies_NetworkFirst} from '/Users/songjunxi/Desktop/repos/wr.do/node_modules/.pnpm/workbox-strategies@6.6.0/node_modules/workbox-strategies/NetworkFirst.mjs';\nimport {NetworkOnly as workbox_strategies_NetworkOnly} from '/Users/songjunxi/Desktop/repos/wr.do/node_modules/.pnpm/workbox-strategies@6.6.0/node_modules/workbox-strategies/NetworkOnly.mjs';\nimport {clientsClaim as workbox_core_clientsClaim} from '/Users/songjunxi/Desktop/repos/wr.do/node_modules/.pnpm/workbox-core@6.6.0/node_modules/workbox-core/clientsClaim.mjs';/**\n * Welcome to your Workbox-powered service worker!\n *\n * You'll need to register this file in your web app.\n * See https://goo.gl/nhQhGp\n *\n * The rest of the code is auto-generated. Please don't update this file\n * directly; instead, make changes to your Workbox build configuration\n * and re-run your build process.\n * See https://goo.gl/2aRDsh\n */\n\n\nimportScripts(\n \n);\n\n\n\n\n\n\n\nself.skipWaiting();\n\nworkbox_core_clientsClaim();\n\n\n\nworkbox_routing_registerRoute(\"/\", new workbox_strategies_NetworkFirst({ \"cacheName\":\"start-url\", plugins: [{ cacheWillUpdate: async ({ request, response, event, state }) => { if (response && response.type === 'opaqueredirect') { return new Response(response.body, { status: 200, statusText: 'OK', headers: response.headers }) } return response } }] }), 'GET');\nworkbox_routing_registerRoute(/.*/i, new workbox_strategies_NetworkOnly({ \"cacheName\":\"dev\", plugins: [] }), 'GET');\n\n\n\n\n"],"names":["importScripts","self","skipWaiting","workbox_core_clientsClaim","workbox_routing_registerRoute","workbox_strategies_NetworkFirst","plugins","cacheWillUpdate","request","response","event","state","type","Response","body","status","statusText","headers","workbox_strategies_NetworkOnly"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"sw.js","sources":["../../../../../private/var/folders/9b/3qmyp8zd2xvdspdrp149fyg00000gn/T/21566116a716f05d035ef2d41ee1447a/sw.js"],"sourcesContent":["import {registerRoute as workbox_routing_registerRoute} from '/Users/songjunxi/Desktop/repos/wr.do/node_modules/.pnpm/workbox-routing@6.6.0/node_modules/workbox-routing/registerRoute.mjs';\nimport {NetworkFirst as workbox_strategies_NetworkFirst} from '/Users/songjunxi/Desktop/repos/wr.do/node_modules/.pnpm/workbox-strategies@6.6.0/node_modules/workbox-strategies/NetworkFirst.mjs';\nimport {NetworkOnly as workbox_strategies_NetworkOnly} from '/Users/songjunxi/Desktop/repos/wr.do/node_modules/.pnpm/workbox-strategies@6.6.0/node_modules/workbox-strategies/NetworkOnly.mjs';\nimport {clientsClaim as workbox_core_clientsClaim} from '/Users/songjunxi/Desktop/repos/wr.do/node_modules/.pnpm/workbox-core@6.6.0/node_modules/workbox-core/clientsClaim.mjs';/**\n * Welcome to your Workbox-powered service worker!\n *\n * You'll need to register this file in your web app.\n * See https://goo.gl/nhQhGp\n *\n * The rest of the code is auto-generated. Please don't update this file\n * directly; instead, make changes to your Workbox build configuration\n * and re-run your build process.\n * See https://goo.gl/2aRDsh\n */\n\n\nimportScripts(\n \n);\n\n\n\n\n\n\n\nself.skipWaiting();\n\nworkbox_core_clientsClaim();\n\n\n\nworkbox_routing_registerRoute(\"/\", new workbox_strategies_NetworkFirst({ \"cacheName\":\"start-url\", plugins: [{ cacheWillUpdate: async ({ request, response, event, state }) => { if (response && response.type === 'opaqueredirect') { return new Response(response.body, { status: 200, statusText: 'OK', headers: response.headers }) } return response } }] }), 'GET');\nworkbox_routing_registerRoute(/.*/i, new workbox_strategies_NetworkOnly({ \"cacheName\":\"dev\", plugins: [] }), 'GET');\n\n\n\n\n"],"names":["importScripts","self","skipWaiting","workbox_core_clientsClaim","workbox_routing_registerRoute","workbox_strategies_NetworkFirst","plugins","cacheWillUpdate","request","response","event","state","type","Response","body","status","statusText","headers","workbox_strategies_NetworkOnly"],"mappings":"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"} \ No newline at end of file