diff --git a/samples/todo/components/ManageMembers.tsx b/samples/todo/components/ManageMembers.tsx index ec380ddb5..44916e102 100644 --- a/samples/todo/components/ManageMembers.tsx +++ b/samples/todo/components/ManageMembers.tsx @@ -1,4 +1,5 @@ import { PlusIcon, TrashIcon } from '@heroicons/react/24/outline'; +import { useCurrentUser } from '@lib/context'; import { ServerErrorCode } from '@zenstackhq/internal'; import { HooksError, useSpaceUser } from '@zenstackhq/runtime/hooks'; import { Space, SpaceUserRole } from '@zenstackhq/runtime/types'; @@ -13,8 +14,9 @@ type Props = { export default function ManageMembers({ space }: Props) { const [email, setEmail] = useState(''); const [role, setRole] = useState(SpaceUserRole.USER); + const user = useCurrentUser(); - const { find, create: addMember } = useSpaceUser(); + const { find, create: addMember, del: delMember } = useSpaceUser(); const { data: members } = find({ where: { spaceId: space.id, @@ -59,6 +61,12 @@ export default function ManageMembers({ space }: Props) { } }; + const removeMember = async (id: string) => { + if (confirm(`Are you sure to remove this member from space?`)) { + await delMember(id); + } + }; + return (
@@ -84,8 +92,8 @@ export default function ManageMembers({ space }: Props) { setRole(e.currentTarget.value as SpaceUserRole); }} > - - + +
- + )}
))} diff --git a/samples/todo/components/Todo.tsx b/samples/todo/components/Todo.tsx index c349a57b4..f38f66bef 100644 --- a/samples/todo/components/Todo.tsx +++ b/samples/todo/components/Todo.tsx @@ -1,3 +1,4 @@ +import { TrashIcon } from '@heroicons/react/24/outline'; import { useTodo } from '@zenstackhq/runtime/hooks'; import { Todo, User } from '@zenstackhq/runtime/types'; import moment from 'moment'; @@ -7,11 +8,12 @@ import Avatar from './Avatar'; type Props = { value: Todo & { owner: User }; updated?: (value: Todo) => any; + deleted?: (value: Todo) => any; }; -export default function Component({ value, updated }: Props) { +export default function Component({ value, updated, deleted }: Props) { const [completed, setCompleted] = useState(!!value.completedAt); - const { update } = useTodo(); + const { update, del } = useTodo(); useEffect(() => { if (!!value.completedAt !== completed) { @@ -25,6 +27,13 @@ export default function Component({ value, updated }: Props) { } }); + const deleteTodo = async () => { + await del(value.id); + if (deleted) { + deleted(value); + } + }; + return (
@@ -37,14 +46,22 @@ export default function Component({ value, updated }: Props) { > {value.title} - ) => - setCompleted(e.currentTarget.checked) - } - /> +
+ ) => + setCompleted(e.currentTarget.checked) + } + /> + { + deleteTodo(); + }} + /> +

diff --git a/samples/todo/pages/space/[slug]/[listId]/index.tsx b/samples/todo/pages/space/[slug]/[listId]/index.tsx index e63aacf69..948660073 100644 --- a/samples/todo/pages/space/[slug]/[listId]/index.tsx +++ b/samples/todo/pages/space/[slug]/[listId]/index.tsx @@ -76,6 +76,9 @@ export default function TodoList() { updated={() => { invalidateTodos(); }} + deleted={() => { + invalidateTodos(); + }} /> ))}