sanity-plugin-utils 2.0.17 → 2.0.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/package.json +6 -6
package/dist/index.js
CHANGED
|
@@ -10,7 +10,7 @@ import { Menu, MenuItem } from "@sanity/ui/menu";
|
|
|
10
10
|
import { useContext, useEffect, useRef, useState } from "react";
|
|
11
11
|
import { UserAvatar, useClient, useDocumentStore, useWorkspace } from "sanity";
|
|
12
12
|
import { createImageUrlBuilder } from "@sanity/image-url";
|
|
13
|
-
import
|
|
13
|
+
import { dequal } from "dequal/lite";
|
|
14
14
|
import { catchError, distinctUntilChanged } from "rxjs/operators";
|
|
15
15
|
import { RouterContext } from "sanity/router";
|
|
16
16
|
import { usePaneRouter } from "sanity/structure";
|
|
@@ -241,8 +241,8 @@ function useListeningQuery(query, t0) {
|
|
|
241
241
|
let $ = c(11), { params: t1, options: t2, initialValue: t3 } = t0, params = t1 === void 0 ? DEFAULT_PARAMS : t1, options = t2 === void 0 ? DEFAULT_OPTIONS : t2, initialValue = t3 === void 0 ? null : t3, [loading, setLoading] = useState(!0), [error, setError] = useState(null), [data, setData] = useState(initialValue), memoParams = useParams(params), memoOptions = useParams(options), subscription = useRef(null), documentStore = useDocumentStore(), t4, t5;
|
|
242
242
|
$[0] !== documentStore || $[1] !== error || $[2] !== memoOptions || $[3] !== memoParams || $[4] !== query ? (t4 = () => {
|
|
243
243
|
if (query && !error && !subscription.current) try {
|
|
244
|
-
subscription.current = documentStore.listenQuery(query, memoParams, memoOptions).pipe(distinctUntilChanged(
|
|
245
|
-
setData((current) =>
|
|
244
|
+
subscription.current = documentStore.listenQuery(query, memoParams, memoOptions).pipe(distinctUntilChanged(dequal), catchError((err_0) => (console.error(err_0), setError(err_0), setLoading(!1), setData(null), err_0))).subscribe((documents) => {
|
|
245
|
+
setData((current) => dequal(current, documents) ? current : documents), setLoading(!1), setError(null);
|
|
246
246
|
});
|
|
247
247
|
} catch (t6) {
|
|
248
248
|
let err = t6;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["{\n ...DEFAULT_PROPS,\n ...props,\n }","children ? (\n children\n ) : (\n <Box flex={1}>\n <Stack gap={4}>\n {title ? <Text weight=\"semibold\">{title}</Text> : null}\n {description ? <Text size={2}>{description}</Text> : null}\n </Stack>\n </Box>\n )","<Flex>\n {icon ? `display icon` : null}\n {children ? (\n children\n ) : (\n <Box flex={1}>\n <Stack gap={4}>\n {title ? <Text weight=\"semibold\">{title}</Text> : null}\n {description ? <Text size={2}>{description}</Text> : null}\n </Stack>\n </Box>\n )}\n </Flex>","icon ? `display icon` : null","<Card tone={tone} padding={4} radius={3} border>\n <Flex>\n {icon ? `display icon` : null}\n {children ? (\n children\n ) : (\n <Box flex={1}>\n <Stack gap={4}>\n {title ? <Text weight=\"semibold\">{title}</Text> : null}\n {description ? <Text size={2}>{description}</Text> : null}\n </Stack>\n </Box>\n )}\n </Flex>\n </Card>","props: CardProps = {}","<Card as=\"table\" {...props} />","<StyledTable {...rest}>{children}</StyledTable>","<Card as=\"tr\" {...props} />","<StyledRow {...rest}>{children}</StyledRow>","props = {}","<Card as=\"td\" {...props} />","<StyledCell {...rest}>{children}</StyledCell>","style = {}","props?.labels ? {...LABELS, ...props.labels} : LABELS","labels","userList || []","me && value.includes(me.id)","(u) => u.isCurrentUser","(event: ChangeEvent<HTMLInputElement>) => {\n setSearchString(event.target.value)\n }","(isChecked: boolean, user: UserExtended) => {\n if (!isChecked) {\n if (onAdd) onAdd(user.id)\n } else if (onRemove) onRemove(user.id)\n }","() => {\n if (me && onAdd) onAdd(me.id)\n }","() => {\n if (me && onRemove) onRemove(me.id)\n }","() => {\n if (onClear) onClear()\n }","meAssigned ? (\n <MenuItem\n tone=\"caution\"\n disabled={!me}\n onClick={handleUnassignMyself}\n icon={RemoveCircleIcon}\n text={labels.removeMe}\n />\n ) : (\n <MenuItem\n tone=\"positive\"\n onClick={handleAssignMyself}\n icon={AddCircleIcon}\n text={labels.addMe}\n />\n )","addMe","removeMe","<MenuItem\n tone=\"critical\"\n disabled={value.length === 0}\n onClick={handleClearAssigneesClick}\n icon={RestoreIcon}\n text={labels.clear}\n />","clear","value.length === 0","<Box padding={1}>\n <TextInput\n ref={input}\n onChange={handleSearchChange}\n placeholder={labels.searchPlaceholder}\n value={searchString}\n />\n </Box>","searchPlaceholder","user","<Menu style={style}>\n {meAssigned ? (\n <MenuItem\n tone=\"caution\"\n disabled={!me}\n onClick={handleUnassignMyself}\n icon={RemoveCircleIcon}\n text={labels.removeMe}\n />\n ) : (\n <MenuItem\n tone=\"positive\"\n onClick={handleAssignMyself}\n icon={AddCircleIcon}\n text={labels.addMe}\n />\n )}\n\n <MenuItem\n tone=\"critical\"\n disabled={value.length === 0}\n onClick={handleClearAssigneesClick}\n icon={RestoreIcon}\n text={labels.clear}\n />\n\n <Box padding={1}>\n <TextInput\n ref={input}\n onChange={handleSearchChange}\n placeholder={labels.searchPlaceholder}\n value={searchString}\n />\n </Box>\n\n {searchString && searchResults?.length === 0 && <MenuItem disabled text={labels.notFound} />}\n\n {searchResults &&\n searchResults.map((user) => (\n <MenuItem\n key={user.id}\n pressed={value.includes(user.id)}\n onClick={() => handleSelect(value.indexOf(user.id) > -1, user)}\n >\n <Flex align=\"center\">\n <UserAvatar user={user} size={1} />\n <Box paddingX={2} flex={1}>\n <Text>{user.displayName}</Text>\n </Box>\n {user.isCurrentUser && (\n <Badge fontSize={1} tone=\"positive\">\n Me\n </Badge>\n )}\n </Flex>\n </MenuItem>\n ))}\n </Menu>","Menu","searchString && searchResults?.length === 0 && <MenuItem disabled text={labels.notFound} />","searchResults &&\n searchResults.map((user) => (\n <MenuItem\n key={user.id}\n pressed={value.includes(user.id)}\n onClick={() => handleSelect(value.indexOf(user.id) > -1, user)}\n >\n <Flex align=\"center\">\n <UserAvatar user={user} size={1} />\n <Box paddingX={2} flex={1}>\n <Text>{user.displayName}</Text>\n </Box>\n {user.isCurrentUser && (\n <Badge fontSize={1} tone=\"positive\">\n Me\n </Badge>\n )}\n </Flex>\n </MenuItem>\n ))","createImageUrlBuilder(client)","useMemo(() => createImageUrlBuilder(client), [client])","source && builder ? builder.image(source) : null","useMemo(() => (source && builder ? builder.image(source) : null), [builder, source])","JSON.stringify(params || {})","useMemo(() => JSON.stringify(params || {}), [params])","JSON.parse(stringifiedParams)","useMemo(() => JSON.parse(stringifiedParams), [stringifiedParams])","{\n params = DEFAULT_PARAMS,\n options = DEFAULT_OPTIONS,\n initialValue = DEFAULT_INITIAL_VALUE,\n }: Config<V>","params = DEFAULT_PARAMS","options = DEFAULT_OPTIONS","initialValue = DEFAULT_INITIAL_VALUE","() => {\n if (query && !error && !subscription.current) {\n try {\n subscription.current = documentStore\n .listenQuery(query, memoParams, memoOptions)\n .pipe(\n distinctUntilChanged(isEqual),\n catchError((err) => {\n console.error(err)\n setError(err)\n setLoading(false)\n setData(null)\n\n return err\n }),\n )\n .subscribe((documents) => {\n setData((current) => {\n if (isEqual(current, documents)) {\n return current\n }\n\n // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion -- listenQuery result is typed by caller\n return documents as V\n })\n setLoading(false)\n setError(null)\n })\n } catch (err) {\n console.error(err)\n // oxlint-disable-next-line react/set-state-in-effect\n setLoading(false)\n setError(err)\n }\n }\n\n // Unsubscribe when an error occurs\n if (error && subscription.current) {\n subscription.current.unsubscribe()\n }\n\n return () => {\n if (subscription.current) {\n subscription?.current?.unsubscribe()\n subscription.current = null\n }\n }\n }","[query, error, memoParams, memoOptions, documentStore]","err","{data, loading, error}","() => {\n if (!routerContext || !id || !type) {\n return\n }\n\n const panes = [...routerPanesState]\n panes.splice(groupIndex + 1, 0, [\n {\n id: id,\n params: {type},\n },\n ])\n\n const href = routerContext.resolvePathFromState({panes})\n routerContext.navigateUrl({path: href})\n }","useCallback(() => {\n if (!routerContext || !id || !type) {\n return\n }\n\n const panes = [...routerPanesState]\n panes.splice(groupIndex + 1, 0, [\n {\n id: id,\n params: {type},\n },\n ])\n\n const href = routerContext.resolvePathFromState({panes})\n routerContext.navigateUrl({path: href})\n }, [id, type, routerContext, routerPanesState, groupIndex])","{apiVersion}: HookConfig","{apiVersion: apiVersion ?? '2023-01-01'}","apiVersion ?? '2023-01-01'","[]","() => {\n const {projectId} = client.config()\n\n async function getUsersWithRoles() {\n try {\n const aclData = await client.request({\n url: `/projects/${projectId}/acl`,\n })\n\n const userIds = aclData.map((user: UserResponse) => user.projectUserId)\n\n const userIdChunks = chunkArray(userIds, 200)\n\n const userResponses = await Promise.all(\n userIdChunks.map((chunk) =>\n client.request({\n url: `/projects/${projectId}/users/${chunk.join(',')}`,\n }),\n ),\n )\n\n const usersData: UserExtended[] = userResponses.flat()\n\n // Combine user details with roles\n const usersWithRoles = usersData.map((user) => {\n const userRoles =\n aclData.find((aclUser: UserResponse) => aclUser.projectUserId === user.id)?.roles || []\n\n return Object.assign(user, {\n isCurrentUser: user.id === currentUser?.id,\n roles: userRoles,\n })\n })\n\n setUsers(usersWithRoles)\n } catch (err) {\n console.error('Failed to fetch users:', err)\n }\n }\n\n if (!users.length) {\n void getUsersWithRoles()\n }\n }","id","length","(user: UserResponse) => user.projectUserId","user","err","[client, currentUser?.id, users.length]","currentUser?.id"],"sources":["../src/components/Feedback.tsx","../src/components/Table.tsx","../src/components/UserSelectMenu/index.tsx","../src/hooks/useImageUrlBuilder.tsx","../src/hooks/useImageUrlBuilderImage.tsx","../src/hooks/useListeningQuery.tsx","../src/hooks/useOpenInNewPane.tsx","../src/hooks/useProjectUsers.tsx"],"sourcesContent":["import {Box, Card, Flex, Stack, Text, type CardTone} from '@sanity/ui'\nimport type {ReactNode} from 'react'\n\ntype FeedbackChildren = {\n children?: ReactNode\n title?: never\n description?: never\n}\n\ntype FeedbackTextProps = {\n title?: string\n description?: ReactNode\n children?: never\n}\n\ntype FeedbackProps = (FeedbackChildren | FeedbackTextProps) & {\n tone?: CardTone\n icon?: ReactNode\n}\n\nconst DEFAULT_PROPS: FeedbackProps = {\n tone: 'primary',\n}\n\nexport function Feedback(props: FeedbackProps) {\n const {title, description, icon, tone, children} = {\n ...DEFAULT_PROPS,\n ...props,\n }\n\n return (\n <Card tone={tone} padding={4} radius={3} border>\n <Flex>\n {icon ? `display icon` : null}\n {children ? (\n children\n ) : (\n <Box flex={1}>\n <Stack gap={4}>\n {title ? <Text weight=\"semibold\">{title}</Text> : null}\n {description ? <Text size={2}>{description}</Text> : null}\n </Stack>\n </Box>\n )}\n </Flex>\n </Card>\n )\n}\n","import {Card, type CardProps} from '@sanity/ui'\nimport type {PropsWithChildren} from 'react'\nimport {css, styled} from 'styled-components'\n\n// Wrappers required because of bug with passing down \"as\" prop\n// https://github.com/styled-components/styled-components/issues/2449\n\n// Table\nconst TableWrapper = (props: CardProps = {}) => {\n return <Card as=\"table\" {...props} />\n}\n\nconst StyledTable = styled(TableWrapper)(\n () => css`\n display: table;\n width: 100%;\n border-collapse: collapse;\n\n &:not([hidden]) {\n display: table;\n border-collapse: collapse;\n }\n `,\n)\n\ntype TableProps = PropsWithChildren<CardProps>\n\nexport function Table(props: TableProps) {\n const {children, ...rest} = props\n\n return <StyledTable {...rest}>{children}</StyledTable>\n}\n\n// Row\nconst RowWrapper = (props: CardProps = {}) => {\n return <Card as=\"tr\" {...props} />\n}\n\nconst StyledRow = styled(RowWrapper)(\n () => css`\n display: table-row;\n\n &:not([hidden]) {\n display: table-row;\n }\n `,\n)\n\ntype TableRowProps = PropsWithChildren<CardProps>\n\nexport function Row(props: TableRowProps) {\n const {children, ...rest} = props\n\n return <StyledRow {...rest}>{children}</StyledRow>\n}\n\n// Cell\nconst CellWrapper = (props = {}) => {\n return <Card as=\"td\" {...props} />\n}\n\nconst StyledCell = styled(CellWrapper)(\n () => css`\n display: table-cell;\n\n &:not([hidden]) {\n display: table-cell;\n }\n `,\n)\n\ntype TableCellProps = PropsWithChildren<\n CardProps & {\n colSpan?: number\n rowSpan?: number\n }\n>\n\nexport function Cell(props: TableCellProps) {\n const {children, ...rest} = props\n\n return <StyledCell {...rest}>{children}</StyledCell>\n}\n","import {AddCircleIcon} from '@sanity/icons/AddCircle'\nimport {RemoveCircleIcon} from '@sanity/icons/RemoveCircle'\nimport {RestoreIcon} from '@sanity/icons/Restore'\nimport {Badge, Box, Flex, Text, TextInput} from '@sanity/ui'\nimport {Menu, MenuItem} from '@sanity/ui/menu'\nimport {type ChangeEvent, useRef, useState} from 'react'\nimport {UserAvatar} from 'sanity'\n\nimport {type UserExtended} from '../../hooks/useProjectUsers'\n\nfunction searchUsers(users: UserExtended[], searchString: string): UserExtended[] {\n return users.filter((user) => {\n const displayName = (user.displayName || '').toLowerCase()\n if (displayName.startsWith(searchString)) return true\n const givenName = (user.givenName || '').toLowerCase()\n if (givenName.startsWith(searchString)) return true\n const middleName = (user.middleName || '').toLowerCase()\n if (middleName.startsWith(searchString)) return true\n const familyName = (user.familyName || '').toLowerCase()\n if (familyName.startsWith(searchString)) return true\n\n return false\n })\n}\n\ntype Labels = {\n addMe?: string\n removeMe?: string\n clear?: string\n searchPlaceholder?: string\n notFound?: string\n}\n\ntype UserSelectMenuProps = {\n value: string[]\n userList: UserExtended[]\n onAdd: (userId: string) => void\n onRemove: (userId: string) => void\n onClear: () => void\n labels?: Labels\n style?: React.CSSProperties\n}\n\nconst LABELS: Labels = {\n addMe: 'Assign myself',\n removeMe: 'Unassign myself',\n clear: 'Clear assignees',\n searchPlaceholder: 'Search users',\n notFound: 'No users found',\n}\n\nexport function UserSelectMenu(props: UserSelectMenuProps) {\n const {value, userList, onAdd, onRemove, onClear, style = {}} = props\n const labels = props?.labels ? {...LABELS, ...props.labels} : LABELS\n\n const [searchString, setSearchString] = useState('')\n const searchResults = searchUsers(userList || [], searchString)\n\n const me = userList.find((u) => u.isCurrentUser)\n const meAssigned = me && value.includes(me.id)\n\n // Focus input on open\n // TODO: Fix focus, it gets immediately taken away\n const input = useRef<HTMLInputElement>(null)\n // useEffect(() => {\n // if (open && input?.current) {\n // input.current.focus()\n // }\n // }, [open])\n\n const handleSearchChange = (event: ChangeEvent<HTMLInputElement>) => {\n setSearchString(event.target.value)\n }\n\n const handleSelect = (isChecked: boolean, user: UserExtended) => {\n if (!isChecked) {\n if (onAdd) onAdd(user.id)\n } else if (onRemove) onRemove(user.id)\n }\n\n const handleAssignMyself = () => {\n if (me && onAdd) onAdd(me.id)\n }\n\n const handleUnassignMyself = () => {\n if (me && onRemove) onRemove(me.id)\n }\n\n const handleClearAssigneesClick = () => {\n if (onClear) onClear()\n }\n\n return (\n <Menu style={style}>\n {meAssigned ? (\n <MenuItem\n tone=\"caution\"\n disabled={!me}\n onClick={handleUnassignMyself}\n icon={RemoveCircleIcon}\n text={labels.removeMe}\n />\n ) : (\n <MenuItem\n tone=\"positive\"\n onClick={handleAssignMyself}\n icon={AddCircleIcon}\n text={labels.addMe}\n />\n )}\n\n <MenuItem\n tone=\"critical\"\n disabled={value.length === 0}\n onClick={handleClearAssigneesClick}\n icon={RestoreIcon}\n text={labels.clear}\n />\n\n <Box padding={1}>\n <TextInput\n ref={input}\n onChange={handleSearchChange}\n placeholder={labels.searchPlaceholder}\n value={searchString}\n />\n </Box>\n\n {searchString && searchResults?.length === 0 && <MenuItem disabled text={labels.notFound} />}\n\n {searchResults &&\n searchResults.map((user) => (\n <MenuItem\n key={user.id}\n pressed={value.includes(user.id)}\n onClick={() => handleSelect(value.indexOf(user.id) > -1, user)}\n >\n <Flex align=\"center\">\n <UserAvatar user={user} size={1} />\n <Box paddingX={2} flex={1}>\n <Text>{user.displayName}</Text>\n </Box>\n {user.isCurrentUser && (\n <Badge fontSize={1} tone=\"positive\">\n Me\n </Badge>\n )}\n </Flex>\n </MenuItem>\n ))}\n </Menu>\n )\n}\n","import {createImageUrlBuilder} from '@sanity/image-url'\nimport {useMemo} from 'react'\nimport type {ImageUrlBuilder, SourceClientOptions} from 'sanity'\nimport {useClient} from 'sanity'\n\nexport function useImageUrlBuilder(clientOptions: SourceClientOptions): ImageUrlBuilder | null {\n const client = useClient(clientOptions)\n const builder = useMemo(() => createImageUrlBuilder(client), [client])\n\n return builder\n}\n","import type {SanityImageSource} from '@sanity/asset-utils'\nimport {useMemo} from 'react'\nimport type {ImageUrlBuilder, SourceClientOptions} from 'sanity'\n\nimport {useImageUrlBuilder} from './useImageUrlBuilder'\n\nexport function useImageUrlBuilderImage(\n source: SanityImageSource,\n clientOptions: SourceClientOptions,\n): ImageUrlBuilder | null {\n const builder = useImageUrlBuilder(clientOptions)\n const image = useMemo(() => (source && builder ? builder.image(source) : null), [builder, source])\n\n return image\n}\n","import {useEffect, useMemo, useRef, useState} from 'react'\nimport isEqual from 'react-fast-compare'\nimport type {Subscription} from 'rxjs'\nimport {catchError, distinctUntilChanged} from 'rxjs/operators'\nimport {type ListenQueryOptions, type ListenQueryParams, useDocumentStore} from 'sanity'\n\ninterface Config<V> {\n params?: ListenQueryParams\n options?: ListenQueryOptions\n initialValue?: null | V\n}\n\ninterface Return<V> {\n loading: boolean\n error: unknown\n data: V | null\n}\n\nconst DEFAULT_PARAMS = {}\nconst DEFAULT_OPTIONS = {apiVersion: `v2023-05-01`}\nconst DEFAULT_INITIAL_VALUE = null\n\nfunction useParams(params?: null | ListenQueryParams | ListenQueryOptions): ListenQueryParams {\n const stringifiedParams = useMemo(() => JSON.stringify(params || {}), [params])\n return useMemo(() => JSON.parse(stringifiedParams), [stringifiedParams])\n}\n\nexport function useListeningQuery<V>(\n query: string | {fetch: string; listen: string},\n {\n params = DEFAULT_PARAMS,\n options = DEFAULT_OPTIONS,\n initialValue = DEFAULT_INITIAL_VALUE,\n }: Config<V>,\n): Return<V> {\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<unknown>(null)\n const [data, setData] = useState<Return<V>['data']>(initialValue)\n const memoParams = useParams(params)\n const memoOptions = useParams(options)\n\n const subscription = useRef<null | Subscription>(null)\n const documentStore = useDocumentStore()\n\n useEffect(() => {\n if (query && !error && !subscription.current) {\n try {\n subscription.current = documentStore\n .listenQuery(query, memoParams, memoOptions)\n .pipe(\n distinctUntilChanged(isEqual),\n catchError((err) => {\n console.error(err)\n setError(err)\n setLoading(false)\n setData(null)\n\n return err\n }),\n )\n .subscribe((documents) => {\n setData((current) => {\n if (isEqual(current, documents)) {\n return current\n }\n\n // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion -- listenQuery result is typed by caller\n return documents as V\n })\n setLoading(false)\n setError(null)\n })\n } catch (err) {\n console.error(err)\n // oxlint-disable-next-line react/set-state-in-effect\n setLoading(false)\n setError(err)\n }\n }\n\n // Unsubscribe when an error occurs\n if (error && subscription.current) {\n subscription.current.unsubscribe()\n }\n\n return () => {\n if (subscription.current) {\n subscription?.current?.unsubscribe()\n subscription.current = null\n }\n }\n }, [query, error, memoParams, memoOptions, documentStore])\n\n return {data, loading, error}\n}\n","import {useCallback, useContext} from 'react'\nimport {RouterContext} from 'sanity/router'\nimport {usePaneRouter} from 'sanity/structure'\n\nexport function useOpenInNewPane(id?: string, type?: string) {\n const routerContext = useContext(RouterContext)\n const {routerPanesState, groupIndex} = usePaneRouter()\n\n const openInNewPane = useCallback(() => {\n if (!routerContext || !id || !type) {\n return\n }\n\n const panes = [...routerPanesState]\n panes.splice(groupIndex + 1, 0, [\n {\n id: id,\n params: {type},\n },\n ])\n\n const href = routerContext.resolvePathFromState({panes})\n routerContext.navigateUrl({path: href})\n }, [id, type, routerContext, routerPanesState, groupIndex])\n\n return openInNewPane\n}\n","import {useEffect, useState} from 'react'\nimport {useClient, useWorkspace} from 'sanity'\n\ntype UserRole = {\n name: string\n title: string\n}\n\nexport type UserExtended = {\n createdAt: string\n displayName: string\n email: string\n familyName: string\n givenName: string\n id: string\n imageUrl: string\n isCurrentUser: boolean\n middleName: string\n projectId: string\n provider: string\n roles?: UserRole[]\n sanityUserId: string\n updatedAt: string\n}\n\ntype UserResponse = {\n isRobot: boolean\n projectUserId: string\n roles: UserRole[]\n}\n\ntype HookConfig = {\n apiVersion?: string\n}\n\nfunction chunkArray<T>(array: T[], size: number): T[][] {\n const chunks: T[][] = []\n for (let i = 0; i < array.length; i += size) {\n chunks.push(array.slice(i, i + size))\n }\n return chunks\n}\n\n// Custom hook to fetch user details and roles in batches\nexport function useProjectUsers({apiVersion}: HookConfig): UserExtended[] {\n const {currentUser} = useWorkspace()\n const client = useClient({apiVersion: apiVersion ?? '2023-01-01'})\n const [users, setUsers] = useState<UserExtended[]>([])\n\n useEffect(() => {\n const {projectId} = client.config()\n\n async function getUsersWithRoles() {\n try {\n const aclData = await client.request({\n url: `/projects/${projectId}/acl`,\n })\n\n const userIds = aclData.map((user: UserResponse) => user.projectUserId)\n\n const userIdChunks = chunkArray(userIds, 200)\n\n const userResponses = await Promise.all(\n userIdChunks.map((chunk) =>\n client.request({\n url: `/projects/${projectId}/users/${chunk.join(',')}`,\n }),\n ),\n )\n\n const usersData: UserExtended[] = userResponses.flat()\n\n // Combine user details with roles\n const usersWithRoles = usersData.map((user) => {\n const userRoles =\n aclData.find((aclUser: UserResponse) => aclUser.projectUserId === user.id)?.roles || []\n\n return Object.assign(user, {\n isCurrentUser: user.id === currentUser?.id,\n roles: userRoles,\n })\n })\n\n setUsers(usersWithRoles)\n } catch (err) {\n console.error('Failed to fetch users:', err)\n }\n }\n\n if (!users.length) {\n void getUsersWithRoles()\n }\n }, [client, currentUser?.id, users.length])\n\n return users\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["{\n ...DEFAULT_PROPS,\n ...props,\n }","children ? (\n children\n ) : (\n <Box flex={1}>\n <Stack gap={4}>\n {title ? <Text weight=\"semibold\">{title}</Text> : null}\n {description ? <Text size={2}>{description}</Text> : null}\n </Stack>\n </Box>\n )","<Flex>\n {icon ? `display icon` : null}\n {children ? (\n children\n ) : (\n <Box flex={1}>\n <Stack gap={4}>\n {title ? <Text weight=\"semibold\">{title}</Text> : null}\n {description ? <Text size={2}>{description}</Text> : null}\n </Stack>\n </Box>\n )}\n </Flex>","icon ? `display icon` : null","<Card tone={tone} padding={4} radius={3} border>\n <Flex>\n {icon ? `display icon` : null}\n {children ? (\n children\n ) : (\n <Box flex={1}>\n <Stack gap={4}>\n {title ? <Text weight=\"semibold\">{title}</Text> : null}\n {description ? <Text size={2}>{description}</Text> : null}\n </Stack>\n </Box>\n )}\n </Flex>\n </Card>","props: CardProps = {}","<Card as=\"table\" {...props} />","<StyledTable {...rest}>{children}</StyledTable>","<Card as=\"tr\" {...props} />","<StyledRow {...rest}>{children}</StyledRow>","props = {}","<Card as=\"td\" {...props} />","<StyledCell {...rest}>{children}</StyledCell>","style = {}","props?.labels ? {...LABELS, ...props.labels} : LABELS","labels","userList || []","me && value.includes(me.id)","(u) => u.isCurrentUser","(event: ChangeEvent<HTMLInputElement>) => {\n setSearchString(event.target.value)\n }","(isChecked: boolean, user: UserExtended) => {\n if (!isChecked) {\n if (onAdd) onAdd(user.id)\n } else if (onRemove) onRemove(user.id)\n }","() => {\n if (me && onAdd) onAdd(me.id)\n }","() => {\n if (me && onRemove) onRemove(me.id)\n }","() => {\n if (onClear) onClear()\n }","meAssigned ? (\n <MenuItem\n tone=\"caution\"\n disabled={!me}\n onClick={handleUnassignMyself}\n icon={RemoveCircleIcon}\n text={labels.removeMe}\n />\n ) : (\n <MenuItem\n tone=\"positive\"\n onClick={handleAssignMyself}\n icon={AddCircleIcon}\n text={labels.addMe}\n />\n )","addMe","removeMe","<MenuItem\n tone=\"critical\"\n disabled={value.length === 0}\n onClick={handleClearAssigneesClick}\n icon={RestoreIcon}\n text={labels.clear}\n />","clear","value.length === 0","<Box padding={1}>\n <TextInput\n ref={input}\n onChange={handleSearchChange}\n placeholder={labels.searchPlaceholder}\n value={searchString}\n />\n </Box>","searchPlaceholder","user","<Menu style={style}>\n {meAssigned ? (\n <MenuItem\n tone=\"caution\"\n disabled={!me}\n onClick={handleUnassignMyself}\n icon={RemoveCircleIcon}\n text={labels.removeMe}\n />\n ) : (\n <MenuItem\n tone=\"positive\"\n onClick={handleAssignMyself}\n icon={AddCircleIcon}\n text={labels.addMe}\n />\n )}\n\n <MenuItem\n tone=\"critical\"\n disabled={value.length === 0}\n onClick={handleClearAssigneesClick}\n icon={RestoreIcon}\n text={labels.clear}\n />\n\n <Box padding={1}>\n <TextInput\n ref={input}\n onChange={handleSearchChange}\n placeholder={labels.searchPlaceholder}\n value={searchString}\n />\n </Box>\n\n {searchString && searchResults?.length === 0 && <MenuItem disabled text={labels.notFound} />}\n\n {searchResults &&\n searchResults.map((user) => (\n <MenuItem\n key={user.id}\n pressed={value.includes(user.id)}\n onClick={() => handleSelect(value.indexOf(user.id) > -1, user)}\n >\n <Flex align=\"center\">\n <UserAvatar user={user} size={1} />\n <Box paddingX={2} flex={1}>\n <Text>{user.displayName}</Text>\n </Box>\n {user.isCurrentUser && (\n <Badge fontSize={1} tone=\"positive\">\n Me\n </Badge>\n )}\n </Flex>\n </MenuItem>\n ))}\n </Menu>","Menu","searchString && searchResults?.length === 0 && <MenuItem disabled text={labels.notFound} />","searchResults &&\n searchResults.map((user) => (\n <MenuItem\n key={user.id}\n pressed={value.includes(user.id)}\n onClick={() => handleSelect(value.indexOf(user.id) > -1, user)}\n >\n <Flex align=\"center\">\n <UserAvatar user={user} size={1} />\n <Box paddingX={2} flex={1}>\n <Text>{user.displayName}</Text>\n </Box>\n {user.isCurrentUser && (\n <Badge fontSize={1} tone=\"positive\">\n Me\n </Badge>\n )}\n </Flex>\n </MenuItem>\n ))","createImageUrlBuilder(client)","useMemo(() => createImageUrlBuilder(client), [client])","source && builder ? builder.image(source) : null","useMemo(() => (source && builder ? builder.image(source) : null), [builder, source])","JSON.stringify(params || {})","useMemo(() => JSON.stringify(params || {}), [params])","JSON.parse(stringifiedParams)","useMemo(() => JSON.parse(stringifiedParams), [stringifiedParams])","{\n params = DEFAULT_PARAMS,\n options = DEFAULT_OPTIONS,\n initialValue = DEFAULT_INITIAL_VALUE,\n }: Config<V>","params = DEFAULT_PARAMS","options = DEFAULT_OPTIONS","initialValue = DEFAULT_INITIAL_VALUE","() => {\n if (query && !error && !subscription.current) {\n try {\n subscription.current = documentStore\n .listenQuery(query, memoParams, memoOptions)\n .pipe(\n distinctUntilChanged(isEqual),\n catchError((err) => {\n console.error(err)\n setError(err)\n setLoading(false)\n setData(null)\n\n return err\n }),\n )\n .subscribe((documents) => {\n setData((current) => {\n if (isEqual(current, documents)) {\n return current\n }\n\n // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion -- listenQuery result is typed by caller\n return documents as V\n })\n setLoading(false)\n setError(null)\n })\n } catch (err) {\n console.error(err)\n // oxlint-disable-next-line react/set-state-in-effect\n setLoading(false)\n setError(err)\n }\n }\n\n // Unsubscribe when an error occurs\n if (error && subscription.current) {\n subscription.current.unsubscribe()\n }\n\n return () => {\n if (subscription.current) {\n subscription?.current?.unsubscribe()\n subscription.current = null\n }\n }\n }","[query, error, memoParams, memoOptions, documentStore]","err","{data, loading, error}","() => {\n if (!routerContext || !id || !type) {\n return\n }\n\n const panes = [...routerPanesState]\n panes.splice(groupIndex + 1, 0, [\n {\n id: id,\n params: {type},\n },\n ])\n\n const href = routerContext.resolvePathFromState({panes})\n routerContext.navigateUrl({path: href})\n }","useCallback(() => {\n if (!routerContext || !id || !type) {\n return\n }\n\n const panes = [...routerPanesState]\n panes.splice(groupIndex + 1, 0, [\n {\n id: id,\n params: {type},\n },\n ])\n\n const href = routerContext.resolvePathFromState({panes})\n routerContext.navigateUrl({path: href})\n }, [id, type, routerContext, routerPanesState, groupIndex])","{apiVersion}: HookConfig","{apiVersion: apiVersion ?? '2023-01-01'}","apiVersion ?? '2023-01-01'","[]","() => {\n const {projectId} = client.config()\n\n async function getUsersWithRoles() {\n try {\n const aclData = await client.request({\n url: `/projects/${projectId}/acl`,\n })\n\n const userIds = aclData.map((user: UserResponse) => user.projectUserId)\n\n const userIdChunks = chunkArray(userIds, 200)\n\n const userResponses = await Promise.all(\n userIdChunks.map((chunk) =>\n client.request({\n url: `/projects/${projectId}/users/${chunk.join(',')}`,\n }),\n ),\n )\n\n const usersData: UserExtended[] = userResponses.flat()\n\n // Combine user details with roles\n const usersWithRoles = usersData.map((user) => {\n const userRoles =\n aclData.find((aclUser: UserResponse) => aclUser.projectUserId === user.id)?.roles || []\n\n return Object.assign(user, {\n isCurrentUser: user.id === currentUser?.id,\n roles: userRoles,\n })\n })\n\n setUsers(usersWithRoles)\n } catch (err) {\n console.error('Failed to fetch users:', err)\n }\n }\n\n if (!users.length) {\n void getUsersWithRoles()\n }\n }","id","length","(user: UserResponse) => user.projectUserId","user","err","[client, currentUser?.id, users.length]","currentUser?.id"],"sources":["../src/components/Feedback.tsx","../src/components/Table.tsx","../src/components/UserSelectMenu/index.tsx","../src/hooks/useImageUrlBuilder.tsx","../src/hooks/useImageUrlBuilderImage.tsx","../src/hooks/useListeningQuery.tsx","../src/hooks/useOpenInNewPane.tsx","../src/hooks/useProjectUsers.tsx"],"sourcesContent":["import {Box, Card, Flex, Stack, Text, type CardTone} from '@sanity/ui'\nimport type {ReactNode} from 'react'\n\ntype FeedbackChildren = {\n children?: ReactNode\n title?: never\n description?: never\n}\n\ntype FeedbackTextProps = {\n title?: string\n description?: ReactNode\n children?: never\n}\n\ntype FeedbackProps = (FeedbackChildren | FeedbackTextProps) & {\n tone?: CardTone\n icon?: ReactNode\n}\n\nconst DEFAULT_PROPS: FeedbackProps = {\n tone: 'primary',\n}\n\nexport function Feedback(props: FeedbackProps) {\n const {title, description, icon, tone, children} = {\n ...DEFAULT_PROPS,\n ...props,\n }\n\n return (\n <Card tone={tone} padding={4} radius={3} border>\n <Flex>\n {icon ? `display icon` : null}\n {children ? (\n children\n ) : (\n <Box flex={1}>\n <Stack gap={4}>\n {title ? <Text weight=\"semibold\">{title}</Text> : null}\n {description ? <Text size={2}>{description}</Text> : null}\n </Stack>\n </Box>\n )}\n </Flex>\n </Card>\n )\n}\n","import {Card, type CardProps} from '@sanity/ui'\nimport type {PropsWithChildren} from 'react'\nimport {css, styled} from 'styled-components'\n\n// Wrappers required because of bug with passing down \"as\" prop\n// https://github.com/styled-components/styled-components/issues/2449\n\n// Table\nconst TableWrapper = (props: CardProps = {}) => {\n return <Card as=\"table\" {...props} />\n}\n\nconst StyledTable = styled(TableWrapper)(\n () => css`\n display: table;\n width: 100%;\n border-collapse: collapse;\n\n &:not([hidden]) {\n display: table;\n border-collapse: collapse;\n }\n `,\n)\n\ntype TableProps = PropsWithChildren<CardProps>\n\nexport function Table(props: TableProps) {\n const {children, ...rest} = props\n\n return <StyledTable {...rest}>{children}</StyledTable>\n}\n\n// Row\nconst RowWrapper = (props: CardProps = {}) => {\n return <Card as=\"tr\" {...props} />\n}\n\nconst StyledRow = styled(RowWrapper)(\n () => css`\n display: table-row;\n\n &:not([hidden]) {\n display: table-row;\n }\n `,\n)\n\ntype TableRowProps = PropsWithChildren<CardProps>\n\nexport function Row(props: TableRowProps) {\n const {children, ...rest} = props\n\n return <StyledRow {...rest}>{children}</StyledRow>\n}\n\n// Cell\nconst CellWrapper = (props = {}) => {\n return <Card as=\"td\" {...props} />\n}\n\nconst StyledCell = styled(CellWrapper)(\n () => css`\n display: table-cell;\n\n &:not([hidden]) {\n display: table-cell;\n }\n `,\n)\n\ntype TableCellProps = PropsWithChildren<\n CardProps & {\n colSpan?: number\n rowSpan?: number\n }\n>\n\nexport function Cell(props: TableCellProps) {\n const {children, ...rest} = props\n\n return <StyledCell {...rest}>{children}</StyledCell>\n}\n","import {AddCircleIcon} from '@sanity/icons/AddCircle'\nimport {RemoveCircleIcon} from '@sanity/icons/RemoveCircle'\nimport {RestoreIcon} from '@sanity/icons/Restore'\nimport {Badge, Box, Flex, Text, TextInput} from '@sanity/ui'\nimport {Menu, MenuItem} from '@sanity/ui/menu'\nimport {type ChangeEvent, useRef, useState} from 'react'\nimport {UserAvatar} from 'sanity'\n\nimport {type UserExtended} from '../../hooks/useProjectUsers'\n\nfunction searchUsers(users: UserExtended[], searchString: string): UserExtended[] {\n return users.filter((user) => {\n const displayName = (user.displayName || '').toLowerCase()\n if (displayName.startsWith(searchString)) return true\n const givenName = (user.givenName || '').toLowerCase()\n if (givenName.startsWith(searchString)) return true\n const middleName = (user.middleName || '').toLowerCase()\n if (middleName.startsWith(searchString)) return true\n const familyName = (user.familyName || '').toLowerCase()\n if (familyName.startsWith(searchString)) return true\n\n return false\n })\n}\n\ntype Labels = {\n addMe?: string\n removeMe?: string\n clear?: string\n searchPlaceholder?: string\n notFound?: string\n}\n\ntype UserSelectMenuProps = {\n value: string[]\n userList: UserExtended[]\n onAdd: (userId: string) => void\n onRemove: (userId: string) => void\n onClear: () => void\n labels?: Labels\n style?: React.CSSProperties\n}\n\nconst LABELS: Labels = {\n addMe: 'Assign myself',\n removeMe: 'Unassign myself',\n clear: 'Clear assignees',\n searchPlaceholder: 'Search users',\n notFound: 'No users found',\n}\n\nexport function UserSelectMenu(props: UserSelectMenuProps) {\n const {value, userList, onAdd, onRemove, onClear, style = {}} = props\n const labels = props?.labels ? {...LABELS, ...props.labels} : LABELS\n\n const [searchString, setSearchString] = useState('')\n const searchResults = searchUsers(userList || [], searchString)\n\n const me = userList.find((u) => u.isCurrentUser)\n const meAssigned = me && value.includes(me.id)\n\n // Focus input on open\n // TODO: Fix focus, it gets immediately taken away\n const input = useRef<HTMLInputElement>(null)\n // useEffect(() => {\n // if (open && input?.current) {\n // input.current.focus()\n // }\n // }, [open])\n\n const handleSearchChange = (event: ChangeEvent<HTMLInputElement>) => {\n setSearchString(event.target.value)\n }\n\n const handleSelect = (isChecked: boolean, user: UserExtended) => {\n if (!isChecked) {\n if (onAdd) onAdd(user.id)\n } else if (onRemove) onRemove(user.id)\n }\n\n const handleAssignMyself = () => {\n if (me && onAdd) onAdd(me.id)\n }\n\n const handleUnassignMyself = () => {\n if (me && onRemove) onRemove(me.id)\n }\n\n const handleClearAssigneesClick = () => {\n if (onClear) onClear()\n }\n\n return (\n <Menu style={style}>\n {meAssigned ? (\n <MenuItem\n tone=\"caution\"\n disabled={!me}\n onClick={handleUnassignMyself}\n icon={RemoveCircleIcon}\n text={labels.removeMe}\n />\n ) : (\n <MenuItem\n tone=\"positive\"\n onClick={handleAssignMyself}\n icon={AddCircleIcon}\n text={labels.addMe}\n />\n )}\n\n <MenuItem\n tone=\"critical\"\n disabled={value.length === 0}\n onClick={handleClearAssigneesClick}\n icon={RestoreIcon}\n text={labels.clear}\n />\n\n <Box padding={1}>\n <TextInput\n ref={input}\n onChange={handleSearchChange}\n placeholder={labels.searchPlaceholder}\n value={searchString}\n />\n </Box>\n\n {searchString && searchResults?.length === 0 && <MenuItem disabled text={labels.notFound} />}\n\n {searchResults &&\n searchResults.map((user) => (\n <MenuItem\n key={user.id}\n pressed={value.includes(user.id)}\n onClick={() => handleSelect(value.indexOf(user.id) > -1, user)}\n >\n <Flex align=\"center\">\n <UserAvatar user={user} size={1} />\n <Box paddingX={2} flex={1}>\n <Text>{user.displayName}</Text>\n </Box>\n {user.isCurrentUser && (\n <Badge fontSize={1} tone=\"positive\">\n Me\n </Badge>\n )}\n </Flex>\n </MenuItem>\n ))}\n </Menu>\n )\n}\n","import {createImageUrlBuilder} from '@sanity/image-url'\nimport {useMemo} from 'react'\nimport type {ImageUrlBuilder, SourceClientOptions} from 'sanity'\nimport {useClient} from 'sanity'\n\nexport function useImageUrlBuilder(clientOptions: SourceClientOptions): ImageUrlBuilder | null {\n const client = useClient(clientOptions)\n const builder = useMemo(() => createImageUrlBuilder(client), [client])\n\n return builder\n}\n","import type {SanityImageSource} from '@sanity/asset-utils'\nimport {useMemo} from 'react'\nimport type {ImageUrlBuilder, SourceClientOptions} from 'sanity'\n\nimport {useImageUrlBuilder} from './useImageUrlBuilder'\n\nexport function useImageUrlBuilderImage(\n source: SanityImageSource,\n clientOptions: SourceClientOptions,\n): ImageUrlBuilder | null {\n const builder = useImageUrlBuilder(clientOptions)\n const image = useMemo(() => (source && builder ? builder.image(source) : null), [builder, source])\n\n return image\n}\n","import {dequal as isEqual} from 'dequal/lite'\nimport {useEffect, useMemo, useRef, useState} from 'react'\nimport type {Subscription} from 'rxjs'\nimport {catchError, distinctUntilChanged} from 'rxjs/operators'\nimport {type ListenQueryOptions, type ListenQueryParams, useDocumentStore} from 'sanity'\n\ninterface Config<V> {\n params?: ListenQueryParams\n options?: ListenQueryOptions\n initialValue?: null | V\n}\n\ninterface Return<V> {\n loading: boolean\n error: unknown\n data: V | null\n}\n\nconst DEFAULT_PARAMS = {}\nconst DEFAULT_OPTIONS = {apiVersion: `v2023-05-01`}\nconst DEFAULT_INITIAL_VALUE = null\n\nfunction useParams(params?: null | ListenQueryParams | ListenQueryOptions): ListenQueryParams {\n const stringifiedParams = useMemo(() => JSON.stringify(params || {}), [params])\n return useMemo(() => JSON.parse(stringifiedParams), [stringifiedParams])\n}\n\nexport function useListeningQuery<V>(\n query: string | {fetch: string; listen: string},\n {\n params = DEFAULT_PARAMS,\n options = DEFAULT_OPTIONS,\n initialValue = DEFAULT_INITIAL_VALUE,\n }: Config<V>,\n): Return<V> {\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<unknown>(null)\n const [data, setData] = useState<Return<V>['data']>(initialValue)\n const memoParams = useParams(params)\n const memoOptions = useParams(options)\n\n const subscription = useRef<null | Subscription>(null)\n const documentStore = useDocumentStore()\n\n useEffect(() => {\n if (query && !error && !subscription.current) {\n try {\n subscription.current = documentStore\n .listenQuery(query, memoParams, memoOptions)\n .pipe(\n distinctUntilChanged(isEqual),\n catchError((err) => {\n console.error(err)\n setError(err)\n setLoading(false)\n setData(null)\n\n return err\n }),\n )\n .subscribe((documents) => {\n setData((current) => {\n if (isEqual(current, documents)) {\n return current\n }\n\n // oxlint-disable-next-line typescript-eslint/no-unsafe-type-assertion -- listenQuery result is typed by caller\n return documents as V\n })\n setLoading(false)\n setError(null)\n })\n } catch (err) {\n console.error(err)\n // oxlint-disable-next-line react/set-state-in-effect\n setLoading(false)\n setError(err)\n }\n }\n\n // Unsubscribe when an error occurs\n if (error && subscription.current) {\n subscription.current.unsubscribe()\n }\n\n return () => {\n if (subscription.current) {\n subscription?.current?.unsubscribe()\n subscription.current = null\n }\n }\n }, [query, error, memoParams, memoOptions, documentStore])\n\n return {data, loading, error}\n}\n","import {useCallback, useContext} from 'react'\nimport {RouterContext} from 'sanity/router'\nimport {usePaneRouter} from 'sanity/structure'\n\nexport function useOpenInNewPane(id?: string, type?: string) {\n const routerContext = useContext(RouterContext)\n const {routerPanesState, groupIndex} = usePaneRouter()\n\n const openInNewPane = useCallback(() => {\n if (!routerContext || !id || !type) {\n return\n }\n\n const panes = [...routerPanesState]\n panes.splice(groupIndex + 1, 0, [\n {\n id: id,\n params: {type},\n },\n ])\n\n const href = routerContext.resolvePathFromState({panes})\n routerContext.navigateUrl({path: href})\n }, [id, type, routerContext, routerPanesState, groupIndex])\n\n return openInNewPane\n}\n","import {useEffect, useState} from 'react'\nimport {useClient, useWorkspace} from 'sanity'\n\ntype UserRole = {\n name: string\n title: string\n}\n\nexport type UserExtended = {\n createdAt: string\n displayName: string\n email: string\n familyName: string\n givenName: string\n id: string\n imageUrl: string\n isCurrentUser: boolean\n middleName: string\n projectId: string\n provider: string\n roles?: UserRole[]\n sanityUserId: string\n updatedAt: string\n}\n\ntype UserResponse = {\n isRobot: boolean\n projectUserId: string\n roles: UserRole[]\n}\n\ntype HookConfig = {\n apiVersion?: string\n}\n\nfunction chunkArray<T>(array: T[], size: number): T[][] {\n const chunks: T[][] = []\n for (let i = 0; i < array.length; i += size) {\n chunks.push(array.slice(i, i + size))\n }\n return chunks\n}\n\n// Custom hook to fetch user details and roles in batches\nexport function useProjectUsers({apiVersion}: HookConfig): UserExtended[] {\n const {currentUser} = useWorkspace()\n const client = useClient({apiVersion: apiVersion ?? '2023-01-01'})\n const [users, setUsers] = useState<UserExtended[]>([])\n\n useEffect(() => {\n const {projectId} = client.config()\n\n async function getUsersWithRoles() {\n try {\n const aclData = await client.request({\n url: `/projects/${projectId}/acl`,\n })\n\n const userIds = aclData.map((user: UserResponse) => user.projectUserId)\n\n const userIdChunks = chunkArray(userIds, 200)\n\n const userResponses = await Promise.all(\n userIdChunks.map((chunk) =>\n client.request({\n url: `/projects/${projectId}/users/${chunk.join(',')}`,\n }),\n ),\n )\n\n const usersData: UserExtended[] = userResponses.flat()\n\n // Combine user details with roles\n const usersWithRoles = usersData.map((user) => {\n const userRoles =\n aclData.find((aclUser: UserResponse) => aclUser.projectUserId === user.id)?.roles || []\n\n return Object.assign(user, {\n isCurrentUser: user.id === currentUser?.id,\n roles: userRoles,\n })\n })\n\n setUsers(usersWithRoles)\n } catch (err) {\n console.error('Failed to fetch users:', err)\n }\n }\n\n if (!users.length) {\n void getUsersWithRoles()\n }\n }, [client, currentUser?.id, users.length])\n\n return users\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sanity-plugin-utils",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.18",
|
|
4
4
|
"description": "Handy hooks and clever components for Sanity Studio v3",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"sanity",
|
|
@@ -30,19 +30,19 @@
|
|
|
30
30
|
"@sanity/asset-utils": "^2.3.0",
|
|
31
31
|
"@sanity/icons": "^5.2.1",
|
|
32
32
|
"@sanity/image-url": "^2.1.1",
|
|
33
|
-
"@sanity/ui": "^4.0.
|
|
34
|
-
"
|
|
33
|
+
"@sanity/ui": "^4.0.7",
|
|
34
|
+
"dequal": "^2.0.3",
|
|
35
35
|
"rxjs": "^7.8.2"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
38
|
"@sanity/tsconfig": "^2.2.1",
|
|
39
|
-
"@sanity/tsdown-config": "^0.
|
|
39
|
+
"@sanity/tsdown-config": "^0.27.1",
|
|
40
40
|
"@types/react": "^19.2.18",
|
|
41
41
|
"@types/react-dom": "^19.2.4",
|
|
42
|
-
"oxc-transform-react": "^0.
|
|
42
|
+
"oxc-transform-react": "^0.147.0",
|
|
43
43
|
"react": "^19.2.8",
|
|
44
44
|
"react-dom": "^19.2.8",
|
|
45
|
-
"sanity": "^6.
|
|
45
|
+
"sanity": "^6.11.0",
|
|
46
46
|
"styled-components": "^6.5.3",
|
|
47
47
|
"tsdown": "^0.22.14"
|
|
48
48
|
},
|