Skip to content

Commit 73a7316

Browse files
committed
fix(tasks): keep list of subscribers persistent when removing
1 parent a2a2ab1 commit 73a7316

File tree

2 files changed

+36
-24
lines changed

2 files changed

+36
-24
lines changed

packages/sanity/src/tasks/src/tasks/components/activity/TasksSubscribers.tsx

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
import {
22
AvatarStack,
3-
Box,
43
// eslint-disable-next-line no-restricted-imports
54
Button as UIButton,
65
Flex,
7-
Text,
86
} from '@sanity/ui'
97
import {AnimatePresence, motion} from 'framer-motion'
108
import {useCallback, useMemo} from 'react'
@@ -109,11 +107,7 @@ export function TasksSubscriberAvatars(props: TasksSubscriberAvatarsProps) {
109107
</AvatarStack>
110108
</AnimatePresence>
111109
) : (
112-
<Box paddingX={2} paddingY={1}>
113-
<Text size={1} muted>
114-
0
115-
</Text>
116-
</Box>
110+
<TasksUserAvatar size={0} />
117111
)}
118112
</UIButton>
119113
}

packages/sanity/src/tasks/src/tasks/components/activity/TasksSubscribersMenu.tsx

Lines changed: 35 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,17 @@ import {
1111
Text,
1212
TextInput,
1313
} from '@sanity/ui'
14-
import {type ChangeEvent, type KeyboardEvent, useCallback, useMemo, useRef, useState} from 'react'
14+
import {
15+
type ChangeEvent,
16+
type KeyboardEvent,
17+
type MouseEvent,
18+
useCallback,
19+
useMemo,
20+
useRef,
21+
useState,
22+
} from 'react'
1523
import {LoadingBlock, type UserWithPermission, useTranslation} from 'sanity'
16-
import styled from 'styled-components'
24+
import {styled} from 'styled-components'
1725

1826
import {MenuButton} from '../../../../../ui-components'
1927
import {tasksLocaleNamespace} from '../../../../i18n'
@@ -31,6 +39,14 @@ function MentionUserMenuItem(props: {
3139
const {user, onSelect, selected} = props
3240
const handleSelect = useCallback(() => onSelect(user.id), [user, onSelect])
3341

42+
const handleCheckboxClick = useCallback(
43+
(e: MouseEvent<HTMLDivElement>) => {
44+
e.stopPropagation()
45+
handleSelect()
46+
},
47+
[handleSelect],
48+
)
49+
3450
return (
3551
<MenuItem onClick={handleSelect} padding={1}>
3652
<Flex align="center" gap={3}>
@@ -41,17 +57,7 @@ function MentionUserMenuItem(props: {
4157
</Text>
4258
</Flex>
4359
<Box paddingX={2}>
44-
<Checkbox
45-
onClick={(e) => {
46-
e.stopPropagation()
47-
handleSelect()
48-
}}
49-
onChange={(e) => {
50-
e.stopPropagation()
51-
handleSelect()
52-
}}
53-
checked={selected}
54-
/>
60+
<Checkbox onClick={handleCheckboxClick} checked={selected} />
5561
</Box>
5662
</Flex>
5763
</MenuItem>
@@ -81,6 +87,9 @@ function TasksSubscribers({onSelect, value = []}: {onSelect: SelectItemHandler;
8187
const [searchTerm, setSearchTerm] = useState<string>('')
8288
const {mentionOptions} = useMentionUser()
8389
const inputRef = useRef<HTMLInputElement | null>(null)
90+
// This list will keep a local state of users who are initially subscribed and later added or removed.
91+
// To always render them at the top
92+
const [subscribersList, setSubscribersList] = useState(value)
8493

8594
const handleSearchChange = useCallback((event: ChangeEvent<HTMLInputElement>) => {
8695
setSearchTerm(event.currentTarget.value)
@@ -89,22 +98,31 @@ function TasksSubscribers({onSelect, value = []}: {onSelect: SelectItemHandler;
8998
const filteredOptions = useFilteredOptions({options: mentionOptions.data || [], searchTerm})
9099

91100
const selectedUsers = useMemo(
92-
() => filteredOptions.filter((user) => value.includes(user.id)),
93-
[filteredOptions, value],
101+
() => filteredOptions.filter((user) => subscribersList.includes(user.id)),
102+
[filteredOptions, subscribersList],
94103
)
95104

105+
const handleSelect = useCallback(
106+
(id: string) => {
107+
if (!subscribersList.includes(id)) {
108+
setSubscribersList([...subscribersList, id])
109+
}
110+
onSelect(id)
111+
},
112+
[subscribersList, onSelect],
113+
)
96114
const renderItem = useCallback(
97115
(user: UserWithPermission) => {
98116
return (
99117
<MentionUserMenuItem
100118
user={user}
101-
onSelect={onSelect}
119+
onSelect={handleSelect}
102120
key={user.id}
103121
selected={value.includes(user.id)}
104122
/>
105123
)
106124
},
107-
[onSelect, value],
125+
[handleSelect, value],
108126
)
109127
const handleKeyDown = useCallback((event: KeyboardEvent<HTMLElement>) => {
110128
// If target is input don't do anything

0 commit comments

Comments
 (0)