From c61188d52482160b2c93585505ac702c0752677e Mon Sep 17 00:00:00 2001 From: TinsFox Date: Sat, 16 Aug 2025 22:45:46 +0800 Subject: [PATCH 1/3] feat: add invitation and join team features --- src/app/(main)/invite/InviteForm.module.css | 22 ++++++++ src/app/(main)/invite/InviteForm.tsx | 55 +++++++++++++++++++ src/app/(main)/invite/InvitePage.tsx | 11 ++++ src/app/(main)/invite/page.tsx | 10 ++++ .../[teamId]/settings/team/TeamEditForm.tsx | 9 +++ src/components/messages.ts | 1 + src/lang/en-US.json | 1 + src/lang/zh-CN.json | 1 + 8 files changed, 110 insertions(+) create mode 100644 src/app/(main)/invite/InviteForm.module.css create mode 100644 src/app/(main)/invite/InviteForm.tsx create mode 100644 src/app/(main)/invite/InvitePage.tsx create mode 100644 src/app/(main)/invite/page.tsx diff --git a/src/app/(main)/invite/InviteForm.module.css b/src/app/(main)/invite/InviteForm.module.css new file mode 100644 index 0000000000..bdd5a56456 --- /dev/null +++ b/src/app/(main)/invite/InviteForm.module.css @@ -0,0 +1,22 @@ +.container { + margin: 0 auto; + max-width: 400px; + padding: 20px; +} + +.form { + background: var(--base50); + border-radius: 8px; + padding: 20px; +} + +@media screen and (max-width: 768px) { + .container { + margin: 0; + padding: 10px; + } + + .form { + padding: 15px; + } +} diff --git a/src/app/(main)/invite/InviteForm.tsx b/src/app/(main)/invite/InviteForm.tsx new file mode 100644 index 0000000000..34f9bf49c5 --- /dev/null +++ b/src/app/(main)/invite/InviteForm.tsx @@ -0,0 +1,55 @@ +'use client'; +import { Form, FormRow, FormInput, FormButtons, TextField, Button } from 'react-basics'; +import { useApi, useMessages, useModified } from '@/components/hooks'; +import styles from './InviteForm.module.css'; +import { useSearchParams } from 'next/navigation'; + +export function InviteForm() { + const searchParams = useSearchParams(); + + const accessCode = searchParams.get('accessCode'); + const { formatMessage, labels } = useMessages(); + const { post, useMutation } = useApi(); + + const { mutate, error } = useMutation({ + mutationFn: (data: any) => post('/teams/join', data), + }); + + const { touch } = useModified(); + + const handleSubmit = async (data: any) => { + mutate(data, { + onSuccess: async () => { + touch('teams:members'); + }, + }); + }; + + return ( +
+
+
+ + + + + + + + + +
+
+
+ ); +} diff --git a/src/app/(main)/invite/InvitePage.tsx b/src/app/(main)/invite/InvitePage.tsx new file mode 100644 index 0000000000..6b6f949d30 --- /dev/null +++ b/src/app/(main)/invite/InvitePage.tsx @@ -0,0 +1,11 @@ +'use client'; + +import { InviteForm } from './InviteForm'; + +export default function InvitePage() { + return ( +
+ +
+ ); +} diff --git a/src/app/(main)/invite/page.tsx b/src/app/(main)/invite/page.tsx new file mode 100644 index 0000000000..47b9b1e457 --- /dev/null +++ b/src/app/(main)/invite/page.tsx @@ -0,0 +1,10 @@ +import { Metadata } from 'next'; +import InvitePage from './InvitePage'; + +export const metadata: Metadata = { + title: 'Join team', +}; + +export default function () { + return ; +} diff --git a/src/app/(main)/teams/[teamId]/settings/team/TeamEditForm.tsx b/src/app/(main)/teams/[teamId]/settings/team/TeamEditForm.tsx index ac158fa709..83c9cfee70 100644 --- a/src/app/(main)/teams/[teamId]/settings/team/TeamEditForm.tsx +++ b/src/app/(main)/teams/[teamId]/settings/team/TeamEditForm.tsx @@ -71,6 +71,15 @@ export function TeamEditForm({ teamId, allowEdit }: { teamId: string; allowEdit? )} + + + + + {allowEdit && ( {formatMessage(labels.save)} diff --git a/src/components/messages.ts b/src/components/messages.ts index 27086b49d7..68c05c0e35 100644 --- a/src/components/messages.ts +++ b/src/components/messages.ts @@ -33,6 +33,7 @@ export const labels = defineMessages({ member: { id: 'label.member', defaultMessage: 'Member' }, members: { id: 'label.members', defaultMessage: 'Members' }, accessCode: { id: 'label.access-code', defaultMessage: 'Access code' }, + invitationLink: { id: 'label.invitation-link', defaultMessage: 'Invitation link' }, teamId: { id: 'label.team-id', defaultMessage: 'Team ID' }, team: { id: 'label.team', defaultMessage: 'Team' }, teamName: { id: 'label.team-name', defaultMessage: 'Team name' }, diff --git a/src/lang/en-US.json b/src/lang/en-US.json index 8fe3314592..186f6b0229 100644 --- a/src/lang/en-US.json +++ b/src/lang/en-US.json @@ -235,6 +235,7 @@ "label.websites": "Websites", "label.window": "Window", "label.yesterday": "Yesterday", + "label.invitation-link": "邀请链接", "message.action-confirmation": "Type {confirmation} in the box below to confirm.", "message.active-users": "{x} current {x, plural, one {visitor} other {visitors}}", "message.collected-data": "Collected data", diff --git a/src/lang/zh-CN.json b/src/lang/zh-CN.json index 6892f2e591..18ade4b367 100644 --- a/src/lang/zh-CN.json +++ b/src/lang/zh-CN.json @@ -236,6 +236,7 @@ "label.websites": "网站", "label.window": "窗口", "label.yesterday": "昨天", + "label.invitation-link": "邀请链接", "message.action-confirmation": "请在下方输入框中输入 {confirmation} 以确认操作。", "message.active-users": "当前在线 {x} 位访客", "message.collected-data": "已收集的数据", From b6d136278d2e126f97607ba3d132cab68b9f4d81 Mon Sep 17 00:00:00 2001 From: TinsFox Date: Sat, 16 Aug 2025 22:58:27 +0800 Subject: [PATCH 2/3] fix: add miss cancel operation --- src/app/(main)/invite/InviteForm.tsx | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/app/(main)/invite/InviteForm.tsx b/src/app/(main)/invite/InviteForm.tsx index 34f9bf49c5..a6cb5de1ef 100644 --- a/src/app/(main)/invite/InviteForm.tsx +++ b/src/app/(main)/invite/InviteForm.tsx @@ -2,11 +2,11 @@ import { Form, FormRow, FormInput, FormButtons, TextField, Button } from 'react-basics'; import { useApi, useMessages, useModified } from '@/components/hooks'; import styles from './InviteForm.module.css'; -import { useSearchParams } from 'next/navigation'; +import { useRouter, useSearchParams } from 'next/navigation'; export function InviteForm() { const searchParams = useSearchParams(); - + const router = useRouter(); const accessCode = searchParams.get('accessCode'); const { formatMessage, labels } = useMessages(); const { post, useMutation } = useApi(); @@ -24,7 +24,9 @@ export function InviteForm() { }, }); }; - + const onClose = () => { + router.replace('/dashboard'); + }; return (
@@ -46,7 +48,7 @@ export function InviteForm() { - +
From a62cf4ca27af094e3ac5ad06d82c71a65f370cc9 Mon Sep 17 00:00:00 2001 From: TinsFox Date: Sat, 16 Aug 2025 22:58:37 +0800 Subject: [PATCH 3/3] fix: update invitation link translation to English --- src/lang/en-US.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lang/en-US.json b/src/lang/en-US.json index 186f6b0229..cfc361e148 100644 --- a/src/lang/en-US.json +++ b/src/lang/en-US.json @@ -235,7 +235,7 @@ "label.websites": "Websites", "label.window": "Window", "label.yesterday": "Yesterday", - "label.invitation-link": "邀请链接", + "label.invitation-link": "Invitation link", "message.action-confirmation": "Type {confirmation} in the box below to confirm.", "message.active-users": "{x} current {x, plural, one {visitor} other {visitors}}", "message.collected-data": "Collected data",