sanity-plugin-utils 1.0.2 → 1.0.3

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/lib/index.d.ts CHANGED
@@ -72,7 +72,7 @@ export declare function useProjectUsers({
72
72
  apiVersion,
73
73
  }: HookConfig): UserExtended[]
74
74
 
75
- declare type UserExtended = {
75
+ export declare type UserExtended = {
76
76
  createdAt: string
77
77
  displayName: string
78
78
  email: string
@@ -96,7 +96,6 @@ declare type UserSelectMenuProps = {
96
96
  onAdd: any
97
97
  onRemove: any
98
98
  onClear: any
99
- open: boolean
100
99
  style?: React_2.CSSProperties
101
100
  }
102
101
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/hooks/useListeningQuery.tsx","../src/hooks/useProjectUsers.tsx","../src/components/Feedback.tsx","../src/components/Table.tsx","../src/components/UserSelectMenu/index.tsx"],"sourcesContent":["import {useEffect, useState, useRef} from 'react'\nimport {catchError, distinctUntilChanged} from 'rxjs/operators'\nimport isEqual from 'react-fast-compare'\nimport {useDocumentStore} from 'sanity'\nimport {Subscription} from 'rxjs'\n\ntype Params = Record<string, string | number | boolean | string[]>\n\ninterface ListenQueryOptions {\n tag?: string\n apiVersion?: string\n}\n\ntype Value = any\n\ninterface Config<V> {\n params: Params\n options?: ListenQueryOptions\n initialValue?: null | V\n}\n\ninterface Return<V> {\n loading: boolean\n error: boolean\n data: null | V\n initialValue?: Value\n}\n\nconst DEFAULT_PARAMS = {}\nconst DEFAULT_OPTIONS = {apiVersion: `v2022-05-09`}\nconst DEFAULT_INITIAL_VALUE = null\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(false)\n const [data, setData] = useState(initialValue)\n const subscription = useRef<null | Subscription>(null)\n const documentStore = useDocumentStore()\n\n useEffect(() => {\n if (query) {\n subscription.current = documentStore\n .listenQuery(query, params, options)\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: Value) => (isEqual(current, documents) ? current : documents))\n setLoading(false)\n setError(false)\n })\n }\n\n return () => subscription?.current?.unsubscribe()\n }, [query, params, options, documentStore])\n\n return {data, loading, error}\n}\n","import {useState, useEffect} from 'react'\nimport {useClient, useWorkspace} from 'sanity'\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 sanityUserId: string\n updatedAt: string\n}\n\ntype UserRole = {\n name: string\n title: string\n}\n\ntype UserResponse = {\n isRobot: boolean\n projectUserId: string\n roles: UserRole[]\n}\n\ntype HookConfig = {\n apiVersion?: string\n}\n\n// Custom hook to fetch user details\n// Built-in hook doesn't fetch all user details\nexport function useProjectUsers({apiVersion}: HookConfig): UserExtended[] {\n const {currentUser} = useWorkspace()\n const client = useClient({apiVersion: apiVersion ?? '2023-01-01'})\n const [users, setUsers] = useState([])\n\n useEffect(() => {\n const {projectId} = client.config()\n\n async function getUser(id: string) {\n const userDetails = await client.request({\n url: `/projects/${projectId}/users/${id}`,\n })\n\n return userDetails\n }\n\n async function getUsersWithRoles() {\n const userRoles = await client\n .request({\n url: `/projects/${projectId}/acl`,\n })\n .then(async (res) =>\n Promise.all(\n res.map(async (user: UserResponse) => ({\n isCurrentUser: user.projectUserId === currentUser?.id,\n ...(await getUser(user.projectUserId)),\n }))\n )\n )\n .catch((err) => err)\n\n setUsers(userRoles)\n }\n\n if (!users.length) {\n getUsersWithRoles()\n }\n }, [client, currentUser?.id, users.length])\n\n return users\n}\n","import React from 'react'\nimport {Box, Card, CardTone, Flex, Stack, Text} from '@sanity/ui'\n\ntype FeedbackChildren = {\n children?: React.ReactNode\n title?: never\n description?: never\n}\n\ntype FeedbackTextProps = {\n title?: string\n description?: React.ReactNode\n children?: never\n}\n\ntype FeedbackProps = (FeedbackChildren | FeedbackTextProps) & {\n tone?: CardTone\n icon?: React.ReactNode\n}\n\nconst DEFAULT_PROPS: FeedbackProps = {\n tone: 'primary',\n}\n\nexport function Feedback(props: FeedbackProps) {\n const {title, description, icon, tone, children} = {...DEFAULT_PROPS, ...props}\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 space={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 React, {PropsWithChildren} from 'react'\nimport styled, {css} from 'styled-components'\nimport {Card, CardProps} from '@sanity/ui'\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 () =>\n css`\n display: table;\n width: 100%;\n\n &:not([hidden]) {\n display: table;\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 () =>\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 () =>\n css`\n display: table-cell;\n\n &:not([hidden]) {\n display: table-cell;\n }\n `\n)\n\ntype TableCellProps = PropsWithChildren<CardProps>\n\nexport function Cell(props: TableCellProps) {\n const {children, ...rest} = props\n\n return <StyledCell {...rest}>{children}</StyledCell>\n}\n","import React, {useRef} from 'react'\nimport {Box, Text, Menu, MenuItem, TextInput, Flex, Badge} from '@sanity/ui'\nimport {AddCircleIcon, RemoveCircleIcon, RestoreIcon} from '@sanity/icons'\nimport {UserAvatar} from 'sanity'\n\nimport {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 UserSelectMenuProps = {\n value: string[]\n userList: UserExtended[]\n onAdd: any\n onRemove: any\n onClear: any\n open: boolean\n style?: React.CSSProperties\n}\n\nexport function UserSelectMenu(props: UserSelectMenuProps) {\n const {value = [], userList = [], onAdd, onRemove, onClear, style = {}} = props\n const [searchString, setSearchString] = React.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>()\n // useEffect(() => {\n // if (open && input?.current) {\n // input.current.focus()\n // }\n // }, [open])\n\n const handleSearchChange = (event: React.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=\"Unassign myself\"\n />\n ) : (\n <MenuItem\n tone=\"positive\"\n onClick={handleAssignMyself}\n icon={AddCircleIcon}\n text=\"Assign myself\"\n />\n )}\n\n <MenuItem\n tone=\"critical\"\n disabled={value.length === 0}\n onClick={handleClearAssigneesClick}\n icon={RestoreIcon}\n text=\"Clear assignees\"\n />\n\n <Box padding={1}>\n <TextInput\n // @ts-ignore TODO: Satisfy ref\n ref={input}\n onChange={handleSearchChange}\n placeholder=\"Search members\"\n value={searchString}\n />\n </Box>\n\n {searchString && searchResults?.length === 0 && <MenuItem disabled text=\"No matches\" />}\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\" mode=\"outline\">\n Me\n </Badge>\n )}\n </Flex>\n </MenuItem>\n ))}\n </Menu>\n )\n}\n"],"names":["DEFAULT_PARAMS","DEFAULT_OPTIONS","apiVersion","DEFAULT_INITIAL_VALUE","useListeningQuery","query","params","options","initialValue","loading","setLoading","useState","error","setError","data","setData","subscription","useRef","documentStore","useDocumentStore","useEffect","current","listenQuery","pipe","distinctUntilChanged","isEqual","catchError","err","console","subscribe","documents","_a","unsubscribe","useProjectUsers","currentUser","useWorkspace","client","useClient","users","setUsers","projectId","config","getUser","id","userDetails","request","url","getUsersWithRoles","userRoles","then","res","Promise","all","map","user","isCurrentUser","projectUserId","catch","length","DEFAULT_PROPS","tone","Feedback","props","title","description","icon","children","jsx","Card","padding","radius","border","jsxs","Flex","Box","flex","Stack","space","Text","weight","size","TableWrapper","as","StyledTable","styled","css","Table","rest","RowWrapper","StyledRow","Row","CellWrapper","StyledCell","Cell","searchUsers","searchString","filter","displayName","toLowerCase","startsWith","givenName","middleName","familyName","UserSelectMenu","value","userList","onAdd","onRemove","onClear","style","setSearchString","React","searchResults","me","find","u","meAssigned","includes","input","handleSearchChange","event","target","handleSelect","isChecked","handleAssignMyself","handleUnassignMyself","handleClearAssigneesClick","Menu","MenuItem","disabled","onClick","RemoveCircleIcon","text","AddCircleIcon","RestoreIcon","TextInput","ref","onChange","placeholder","pressed","indexOf","align","UserAvatar","paddingX","Badge","fontSize","mode"],"mappings":"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"}
1
+ {"version":3,"file":"index.esm.js","sources":["../src/hooks/useListeningQuery.tsx","../src/hooks/useProjectUsers.tsx","../src/components/Feedback.tsx","../src/components/Table.tsx","../src/components/UserSelectMenu/index.tsx"],"sourcesContent":["import {useEffect, useState, useRef} from 'react'\nimport {catchError, distinctUntilChanged} from 'rxjs/operators'\nimport isEqual from 'react-fast-compare'\nimport {useDocumentStore} from 'sanity'\nimport {Subscription} from 'rxjs'\n\ntype Params = Record<string, string | number | boolean | string[]>\n\ninterface ListenQueryOptions {\n tag?: string\n apiVersion?: string\n}\n\ntype Value = any\n\ninterface Config<V> {\n params: Params\n options?: ListenQueryOptions\n initialValue?: null | V\n}\n\ninterface Return<V> {\n loading: boolean\n error: boolean\n data: null | V\n initialValue?: Value\n}\n\nconst DEFAULT_PARAMS = {}\nconst DEFAULT_OPTIONS = {apiVersion: `v2022-05-09`}\nconst DEFAULT_INITIAL_VALUE = null\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(false)\n const [data, setData] = useState(initialValue)\n const subscription = useRef<null | Subscription>(null)\n const documentStore = useDocumentStore()\n\n useEffect(() => {\n if (query) {\n subscription.current = documentStore\n .listenQuery(query, params, options)\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: Value) => (isEqual(current, documents) ? current : documents))\n setLoading(false)\n setError(false)\n })\n }\n\n return () => subscription?.current?.unsubscribe()\n }, [query, params, options, documentStore])\n\n return {data, loading, error}\n}\n","import {useState, useEffect} from 'react'\nimport {useClient, useWorkspace} from 'sanity'\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 sanityUserId: string\n updatedAt: string\n}\n\ntype UserRole = {\n name: string\n title: string\n}\n\ntype UserResponse = {\n isRobot: boolean\n projectUserId: string\n roles: UserRole[]\n}\n\ntype HookConfig = {\n apiVersion?: string\n}\n\n// Custom hook to fetch user details\n// Built-in hook doesn't fetch all user details\nexport function useProjectUsers({apiVersion}: HookConfig): UserExtended[] {\n const {currentUser} = useWorkspace()\n const client = useClient({apiVersion: apiVersion ?? '2023-01-01'})\n const [users, setUsers] = useState([])\n\n useEffect(() => {\n const {projectId} = client.config()\n\n async function getUser(id: string) {\n const userDetails = await client.request({\n url: `/projects/${projectId}/users/${id}`,\n })\n\n return userDetails\n }\n\n async function getUsersWithRoles() {\n const userRoles = await client\n .request({\n url: `/projects/${projectId}/acl`,\n })\n .then(async (res) =>\n Promise.all(\n res.map(async (user: UserResponse) => ({\n isCurrentUser: user.projectUserId === currentUser?.id,\n ...(await getUser(user.projectUserId)),\n }))\n )\n )\n .catch((err) => err)\n\n setUsers(userRoles)\n }\n\n if (!users.length) {\n getUsersWithRoles()\n }\n }, [client, currentUser?.id, users.length])\n\n return users\n}\n","import React from 'react'\nimport {Box, Card, CardTone, Flex, Stack, Text} from '@sanity/ui'\n\ntype FeedbackChildren = {\n children?: React.ReactNode\n title?: never\n description?: never\n}\n\ntype FeedbackTextProps = {\n title?: string\n description?: React.ReactNode\n children?: never\n}\n\ntype FeedbackProps = (FeedbackChildren | FeedbackTextProps) & {\n tone?: CardTone\n icon?: React.ReactNode\n}\n\nconst DEFAULT_PROPS: FeedbackProps = {\n tone: 'primary',\n}\n\nexport function Feedback(props: FeedbackProps) {\n const {title, description, icon, tone, children} = {...DEFAULT_PROPS, ...props}\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 space={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 React, {PropsWithChildren} from 'react'\nimport styled, {css} from 'styled-components'\nimport {Card, CardProps} from '@sanity/ui'\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 () =>\n css`\n display: table;\n width: 100%;\n\n &:not([hidden]) {\n display: table;\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 () =>\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 () =>\n css`\n display: table-cell;\n\n &:not([hidden]) {\n display: table-cell;\n }\n `\n)\n\ntype TableCellProps = PropsWithChildren<CardProps>\n\nexport function Cell(props: TableCellProps) {\n const {children, ...rest} = props\n\n return <StyledCell {...rest}>{children}</StyledCell>\n}\n","import React, {useRef} from 'react'\nimport {Box, Text, Menu, MenuItem, TextInput, Flex, Badge} from '@sanity/ui'\nimport {AddCircleIcon, RemoveCircleIcon, RestoreIcon} from '@sanity/icons'\nimport {UserAvatar} from 'sanity'\n\nimport {UserExtended} from '../../hooks/useProjectUsers'\n\nfunction searchUsers(\n users: UserExtended[],\n searchString: string\n): 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 UserSelectMenuProps = {\n value: string[]\n userList: UserExtended[]\n onAdd: any\n onRemove: any\n onClear: any\n style?: React.CSSProperties\n}\n\nexport function UserSelectMenu(props: UserSelectMenuProps) {\n const {\n value = [],\n userList = [],\n onAdd,\n onRemove,\n onClear,\n style = {},\n } = props\n const [searchString, setSearchString] = React.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>()\n // useEffect(() => {\n // if (open && input?.current) {\n // input.current.focus()\n // }\n // }, [open])\n\n const handleSearchChange = (event: React.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=\"Unassign myself\"\n />\n ) : (\n <MenuItem\n tone=\"positive\"\n onClick={handleAssignMyself}\n icon={AddCircleIcon}\n text=\"Assign myself\"\n />\n )}\n\n <MenuItem\n tone=\"critical\"\n disabled={value.length === 0}\n onClick={handleClearAssigneesClick}\n icon={RestoreIcon}\n text=\"Clear assignees\"\n />\n\n <Box padding={1}>\n <TextInput\n // @ts-ignore TODO: Satisfy ref\n ref={input}\n onChange={handleSearchChange}\n placeholder=\"Search members\"\n value={searchString}\n />\n </Box>\n\n {searchString && searchResults?.length === 0 && (\n <MenuItem disabled text=\"No matches\" />\n )}\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\" mode=\"outline\">\n Me\n </Badge>\n )}\n </Flex>\n </MenuItem>\n ))}\n </Menu>\n )\n}\n"],"names":["DEFAULT_PARAMS","DEFAULT_OPTIONS","apiVersion","DEFAULT_INITIAL_VALUE","useListeningQuery","query","params","options","initialValue","loading","setLoading","useState","error","setError","data","setData","subscription","useRef","documentStore","useDocumentStore","useEffect","current","listenQuery","pipe","distinctUntilChanged","isEqual","catchError","err","console","subscribe","documents","_a","unsubscribe","useProjectUsers","currentUser","useWorkspace","client","useClient","users","setUsers","projectId","config","getUser","id","userDetails","request","url","getUsersWithRoles","userRoles","then","res","Promise","all","map","user","isCurrentUser","projectUserId","catch","length","DEFAULT_PROPS","tone","Feedback","props","title","description","icon","children","jsx","Card","padding","radius","border","jsxs","Flex","Box","flex","Stack","space","Text","weight","size","TableWrapper","as","StyledTable","styled","css","Table","rest","RowWrapper","StyledRow","Row","CellWrapper","StyledCell","Cell","searchUsers","searchString","filter","displayName","toLowerCase","startsWith","givenName","middleName","familyName","UserSelectMenu","value","userList","onAdd","onRemove","onClear","style","setSearchString","React","searchResults","me","find","u","meAssigned","includes","input","handleSearchChange","event","target","handleSelect","isChecked","handleAssignMyself","handleUnassignMyself","handleClearAssigneesClick","Menu","MenuItem","disabled","onClick","RemoveCircleIcon","text","AddCircleIcon","RestoreIcon","TextInput","ref","onChange","placeholder","pressed","indexOf","align","UserAvatar","paddingX","Badge","fontSize","mode"],"mappings":"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"}
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/hooks/useListeningQuery.tsx","../src/hooks/useProjectUsers.tsx","../src/components/Feedback.tsx","../src/components/Table.tsx","../src/components/UserSelectMenu/index.tsx"],"sourcesContent":["import {useEffect, useState, useRef} from 'react'\nimport {catchError, distinctUntilChanged} from 'rxjs/operators'\nimport isEqual from 'react-fast-compare'\nimport {useDocumentStore} from 'sanity'\nimport {Subscription} from 'rxjs'\n\ntype Params = Record<string, string | number | boolean | string[]>\n\ninterface ListenQueryOptions {\n tag?: string\n apiVersion?: string\n}\n\ntype Value = any\n\ninterface Config<V> {\n params: Params\n options?: ListenQueryOptions\n initialValue?: null | V\n}\n\ninterface Return<V> {\n loading: boolean\n error: boolean\n data: null | V\n initialValue?: Value\n}\n\nconst DEFAULT_PARAMS = {}\nconst DEFAULT_OPTIONS = {apiVersion: `v2022-05-09`}\nconst DEFAULT_INITIAL_VALUE = null\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(false)\n const [data, setData] = useState(initialValue)\n const subscription = useRef<null | Subscription>(null)\n const documentStore = useDocumentStore()\n\n useEffect(() => {\n if (query) {\n subscription.current = documentStore\n .listenQuery(query, params, options)\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: Value) => (isEqual(current, documents) ? current : documents))\n setLoading(false)\n setError(false)\n })\n }\n\n return () => subscription?.current?.unsubscribe()\n }, [query, params, options, documentStore])\n\n return {data, loading, error}\n}\n","import {useState, useEffect} from 'react'\nimport {useClient, useWorkspace} from 'sanity'\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 sanityUserId: string\n updatedAt: string\n}\n\ntype UserRole = {\n name: string\n title: string\n}\n\ntype UserResponse = {\n isRobot: boolean\n projectUserId: string\n roles: UserRole[]\n}\n\ntype HookConfig = {\n apiVersion?: string\n}\n\n// Custom hook to fetch user details\n// Built-in hook doesn't fetch all user details\nexport function useProjectUsers({apiVersion}: HookConfig): UserExtended[] {\n const {currentUser} = useWorkspace()\n const client = useClient({apiVersion: apiVersion ?? '2023-01-01'})\n const [users, setUsers] = useState([])\n\n useEffect(() => {\n const {projectId} = client.config()\n\n async function getUser(id: string) {\n const userDetails = await client.request({\n url: `/projects/${projectId}/users/${id}`,\n })\n\n return userDetails\n }\n\n async function getUsersWithRoles() {\n const userRoles = await client\n .request({\n url: `/projects/${projectId}/acl`,\n })\n .then(async (res) =>\n Promise.all(\n res.map(async (user: UserResponse) => ({\n isCurrentUser: user.projectUserId === currentUser?.id,\n ...(await getUser(user.projectUserId)),\n }))\n )\n )\n .catch((err) => err)\n\n setUsers(userRoles)\n }\n\n if (!users.length) {\n getUsersWithRoles()\n }\n }, [client, currentUser?.id, users.length])\n\n return users\n}\n","import React from 'react'\nimport {Box, Card, CardTone, Flex, Stack, Text} from '@sanity/ui'\n\ntype FeedbackChildren = {\n children?: React.ReactNode\n title?: never\n description?: never\n}\n\ntype FeedbackTextProps = {\n title?: string\n description?: React.ReactNode\n children?: never\n}\n\ntype FeedbackProps = (FeedbackChildren | FeedbackTextProps) & {\n tone?: CardTone\n icon?: React.ReactNode\n}\n\nconst DEFAULT_PROPS: FeedbackProps = {\n tone: 'primary',\n}\n\nexport function Feedback(props: FeedbackProps) {\n const {title, description, icon, tone, children} = {...DEFAULT_PROPS, ...props}\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 space={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 React, {PropsWithChildren} from 'react'\nimport styled, {css} from 'styled-components'\nimport {Card, CardProps} from '@sanity/ui'\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 () =>\n css`\n display: table;\n width: 100%;\n\n &:not([hidden]) {\n display: table;\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 () =>\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 () =>\n css`\n display: table-cell;\n\n &:not([hidden]) {\n display: table-cell;\n }\n `\n)\n\ntype TableCellProps = PropsWithChildren<CardProps>\n\nexport function Cell(props: TableCellProps) {\n const {children, ...rest} = props\n\n return <StyledCell {...rest}>{children}</StyledCell>\n}\n","import React, {useRef} from 'react'\nimport {Box, Text, Menu, MenuItem, TextInput, Flex, Badge} from '@sanity/ui'\nimport {AddCircleIcon, RemoveCircleIcon, RestoreIcon} from '@sanity/icons'\nimport {UserAvatar} from 'sanity'\n\nimport {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 UserSelectMenuProps = {\n value: string[]\n userList: UserExtended[]\n onAdd: any\n onRemove: any\n onClear: any\n open: boolean\n style?: React.CSSProperties\n}\n\nexport function UserSelectMenu(props: UserSelectMenuProps) {\n const {value = [], userList = [], onAdd, onRemove, onClear, style = {}} = props\n const [searchString, setSearchString] = React.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>()\n // useEffect(() => {\n // if (open && input?.current) {\n // input.current.focus()\n // }\n // }, [open])\n\n const handleSearchChange = (event: React.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=\"Unassign myself\"\n />\n ) : (\n <MenuItem\n tone=\"positive\"\n onClick={handleAssignMyself}\n icon={AddCircleIcon}\n text=\"Assign myself\"\n />\n )}\n\n <MenuItem\n tone=\"critical\"\n disabled={value.length === 0}\n onClick={handleClearAssigneesClick}\n icon={RestoreIcon}\n text=\"Clear assignees\"\n />\n\n <Box padding={1}>\n <TextInput\n // @ts-ignore TODO: Satisfy ref\n ref={input}\n onChange={handleSearchChange}\n placeholder=\"Search members\"\n value={searchString}\n />\n </Box>\n\n {searchString && searchResults?.length === 0 && <MenuItem disabled text=\"No matches\" />}\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\" mode=\"outline\">\n Me\n </Badge>\n )}\n </Flex>\n </MenuItem>\n ))}\n </Menu>\n )\n}\n"],"names":["DEFAULT_PARAMS","DEFAULT_OPTIONS","apiVersion","DEFAULT_INITIAL_VALUE","useListeningQuery","query","params","options","initialValue","loading","setLoading","useState","error","setError","data","setData","subscription","useRef","documentStore","useDocumentStore","useEffect","current","listenQuery","pipe","distinctUntilChanged","isEqual","catchError","err","console","subscribe","documents","_a","unsubscribe","useProjectUsers","currentUser","useWorkspace","client","useClient","users","setUsers","projectId","config","getUser","id","userDetails","request","url","getUsersWithRoles","userRoles","then","res","Promise","all","map","user","isCurrentUser","projectUserId","catch","length","DEFAULT_PROPS","tone","Feedback","props","title","description","icon","children","jsx","Card","padding","radius","border","jsxs","Flex","Box","flex","Stack","space","Text","weight","size","TableWrapper","as","StyledTable","styled","css","Table","rest","RowWrapper","StyledRow","Row","CellWrapper","StyledCell","Cell","searchUsers","searchString","filter","displayName","toLowerCase","startsWith","givenName","middleName","familyName","UserSelectMenu","value","userList","onAdd","onRemove","onClear","style","setSearchString","React","searchResults","me","find","u","meAssigned","includes","input","handleSearchChange","event","target","handleSelect","isChecked","handleAssignMyself","handleUnassignMyself","handleClearAssigneesClick","Menu","MenuItem","disabled","onClick","RemoveCircleIcon","text","AddCircleIcon","RestoreIcon","TextInput","ref","onChange","placeholder","pressed","indexOf","align","UserAvatar","paddingX","Badge","fontSize","mode"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/hooks/useListeningQuery.tsx","../src/hooks/useProjectUsers.tsx","../src/components/Feedback.tsx","../src/components/Table.tsx","../src/components/UserSelectMenu/index.tsx"],"sourcesContent":["import {useEffect, useState, useRef} from 'react'\nimport {catchError, distinctUntilChanged} from 'rxjs/operators'\nimport isEqual from 'react-fast-compare'\nimport {useDocumentStore} from 'sanity'\nimport {Subscription} from 'rxjs'\n\ntype Params = Record<string, string | number | boolean | string[]>\n\ninterface ListenQueryOptions {\n tag?: string\n apiVersion?: string\n}\n\ntype Value = any\n\ninterface Config<V> {\n params: Params\n options?: ListenQueryOptions\n initialValue?: null | V\n}\n\ninterface Return<V> {\n loading: boolean\n error: boolean\n data: null | V\n initialValue?: Value\n}\n\nconst DEFAULT_PARAMS = {}\nconst DEFAULT_OPTIONS = {apiVersion: `v2022-05-09`}\nconst DEFAULT_INITIAL_VALUE = null\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(false)\n const [data, setData] = useState(initialValue)\n const subscription = useRef<null | Subscription>(null)\n const documentStore = useDocumentStore()\n\n useEffect(() => {\n if (query) {\n subscription.current = documentStore\n .listenQuery(query, params, options)\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: Value) => (isEqual(current, documents) ? current : documents))\n setLoading(false)\n setError(false)\n })\n }\n\n return () => subscription?.current?.unsubscribe()\n }, [query, params, options, documentStore])\n\n return {data, loading, error}\n}\n","import {useState, useEffect} from 'react'\nimport {useClient, useWorkspace} from 'sanity'\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 sanityUserId: string\n updatedAt: string\n}\n\ntype UserRole = {\n name: string\n title: string\n}\n\ntype UserResponse = {\n isRobot: boolean\n projectUserId: string\n roles: UserRole[]\n}\n\ntype HookConfig = {\n apiVersion?: string\n}\n\n// Custom hook to fetch user details\n// Built-in hook doesn't fetch all user details\nexport function useProjectUsers({apiVersion}: HookConfig): UserExtended[] {\n const {currentUser} = useWorkspace()\n const client = useClient({apiVersion: apiVersion ?? '2023-01-01'})\n const [users, setUsers] = useState([])\n\n useEffect(() => {\n const {projectId} = client.config()\n\n async function getUser(id: string) {\n const userDetails = await client.request({\n url: `/projects/${projectId}/users/${id}`,\n })\n\n return userDetails\n }\n\n async function getUsersWithRoles() {\n const userRoles = await client\n .request({\n url: `/projects/${projectId}/acl`,\n })\n .then(async (res) =>\n Promise.all(\n res.map(async (user: UserResponse) => ({\n isCurrentUser: user.projectUserId === currentUser?.id,\n ...(await getUser(user.projectUserId)),\n }))\n )\n )\n .catch((err) => err)\n\n setUsers(userRoles)\n }\n\n if (!users.length) {\n getUsersWithRoles()\n }\n }, [client, currentUser?.id, users.length])\n\n return users\n}\n","import React from 'react'\nimport {Box, Card, CardTone, Flex, Stack, Text} from '@sanity/ui'\n\ntype FeedbackChildren = {\n children?: React.ReactNode\n title?: never\n description?: never\n}\n\ntype FeedbackTextProps = {\n title?: string\n description?: React.ReactNode\n children?: never\n}\n\ntype FeedbackProps = (FeedbackChildren | FeedbackTextProps) & {\n tone?: CardTone\n icon?: React.ReactNode\n}\n\nconst DEFAULT_PROPS: FeedbackProps = {\n tone: 'primary',\n}\n\nexport function Feedback(props: FeedbackProps) {\n const {title, description, icon, tone, children} = {...DEFAULT_PROPS, ...props}\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 space={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 React, {PropsWithChildren} from 'react'\nimport styled, {css} from 'styled-components'\nimport {Card, CardProps} from '@sanity/ui'\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 () =>\n css`\n display: table;\n width: 100%;\n\n &:not([hidden]) {\n display: table;\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 () =>\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 () =>\n css`\n display: table-cell;\n\n &:not([hidden]) {\n display: table-cell;\n }\n `\n)\n\ntype TableCellProps = PropsWithChildren<CardProps>\n\nexport function Cell(props: TableCellProps) {\n const {children, ...rest} = props\n\n return <StyledCell {...rest}>{children}</StyledCell>\n}\n","import React, {useRef} from 'react'\nimport {Box, Text, Menu, MenuItem, TextInput, Flex, Badge} from '@sanity/ui'\nimport {AddCircleIcon, RemoveCircleIcon, RestoreIcon} from '@sanity/icons'\nimport {UserAvatar} from 'sanity'\n\nimport {UserExtended} from '../../hooks/useProjectUsers'\n\nfunction searchUsers(\n users: UserExtended[],\n searchString: string\n): 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 UserSelectMenuProps = {\n value: string[]\n userList: UserExtended[]\n onAdd: any\n onRemove: any\n onClear: any\n style?: React.CSSProperties\n}\n\nexport function UserSelectMenu(props: UserSelectMenuProps) {\n const {\n value = [],\n userList = [],\n onAdd,\n onRemove,\n onClear,\n style = {},\n } = props\n const [searchString, setSearchString] = React.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>()\n // useEffect(() => {\n // if (open && input?.current) {\n // input.current.focus()\n // }\n // }, [open])\n\n const handleSearchChange = (event: React.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=\"Unassign myself\"\n />\n ) : (\n <MenuItem\n tone=\"positive\"\n onClick={handleAssignMyself}\n icon={AddCircleIcon}\n text=\"Assign myself\"\n />\n )}\n\n <MenuItem\n tone=\"critical\"\n disabled={value.length === 0}\n onClick={handleClearAssigneesClick}\n icon={RestoreIcon}\n text=\"Clear assignees\"\n />\n\n <Box padding={1}>\n <TextInput\n // @ts-ignore TODO: Satisfy ref\n ref={input}\n onChange={handleSearchChange}\n placeholder=\"Search members\"\n value={searchString}\n />\n </Box>\n\n {searchString && searchResults?.length === 0 && (\n <MenuItem disabled text=\"No matches\" />\n )}\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\" mode=\"outline\">\n Me\n </Badge>\n )}\n </Flex>\n </MenuItem>\n ))}\n </Menu>\n )\n}\n"],"names":["DEFAULT_PARAMS","DEFAULT_OPTIONS","apiVersion","DEFAULT_INITIAL_VALUE","useListeningQuery","query","params","options","initialValue","loading","setLoading","useState","error","setError","data","setData","subscription","useRef","documentStore","useDocumentStore","useEffect","current","listenQuery","pipe","distinctUntilChanged","isEqual","catchError","err","console","subscribe","documents","_a","unsubscribe","useProjectUsers","currentUser","useWorkspace","client","useClient","users","setUsers","projectId","config","getUser","id","userDetails","request","url","getUsersWithRoles","userRoles","then","res","Promise","all","map","user","isCurrentUser","projectUserId","catch","length","DEFAULT_PROPS","tone","Feedback","props","title","description","icon","children","jsx","Card","padding","radius","border","jsxs","Flex","Box","flex","Stack","space","Text","weight","size","TableWrapper","as","StyledTable","styled","css","Table","rest","RowWrapper","StyledRow","Row","CellWrapper","StyledCell","Cell","searchUsers","searchString","filter","displayName","toLowerCase","startsWith","givenName","middleName","familyName","UserSelectMenu","value","userList","onAdd","onRemove","onClear","style","setSearchString","React","searchResults","me","find","u","meAssigned","includes","input","handleSearchChange","event","target","handleSelect","isChecked","handleAssignMyself","handleUnassignMyself","handleClearAssigneesClick","Menu","MenuItem","disabled","onClick","RemoveCircleIcon","text","AddCircleIcon","RestoreIcon","TextInput","ref","onChange","placeholder","pressed","indexOf","align","UserAvatar","paddingX","Badge","fontSize","mode"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AA4BA,MAAMA,iBAAiB,CAAA,CAAC;AACxB,MAAMC,eAAA,GAAkB;EAACC,UAAA;AAAyB,CAAA;AAClD,MAAMC,qBAAwB,GAAA,IAAA;AAEvB,SAASC,kBACdC,KACA,QAKW;EAAA,IALX;IACEC,MAAS,GAAAN,cAAA;IACTO,OAAU,GAAAN,eAAA;IACVO,YAAe,GAAAL;EACjB,CACW;EACX,MAAM,CAACM,OAAA,EAASC,UAAU,CAAA,GAAIC,eAAS,IAAI,CAAA;EAC3C,MAAM,CAACC,KAAA,EAAOC,QAAQ,CAAA,GAAIF,eAAS,KAAK,CAAA;EACxC,MAAM,CAACG,IAAA,EAAMC,OAAO,CAAA,GAAIJ,eAASH,YAAY,CAAA;EACvC,MAAAQ,YAAA,GAAeC,aAA4B,IAAI,CAAA;EACrD,MAAMC,gBAAgBC,MAAAA,CAAAA,gBAAiB,EAAA;EAEvCC,KAAAA,CAAAA,SAAA,CAAU,MAAM;IACd,IAAIf,KAAO,EAAA;MACTW,YAAA,CAAaK,UAAUH,aACpB,CAAAI,WAAA,CAAYjB,KAAO,EAAAC,MAAA,EAAQC,OAAO,CAClC,CAAAgB,IAAA,CACCC,SAAAA,CAAAA,qBAAqBC,gBAAAA,CAAAA,OAAO,CAAA,EAC5BC,SAAA,CAAAA,UAAA,CAAYC,GAAQ,IAAA;QAClBC,OAAA,CAAQhB,MAAMe,GAAG,CAAA;QACjBd,QAAA,CAASc,GAAG,CAAA;QACZjB,UAAA,CAAW,KAAK,CAAA;QAChBK,OAAA,CAAQ,IAAI,CAAA;QAEL,OAAAY,GAAA;MAAA,CACR,CAAA,CACH,CACCE,SAAU,CAACC,SAAc,IAAA;QACxBf,OAAA,CAASM,OAAoB,IAAAI,wBAAA,CAAQJ,SAASS,SAAS,CAAA,GAAIT,UAAUS,SAAU,CAAA;QAC/EpB,UAAA,CAAW,KAAK,CAAA;QAChBG,QAAA,CAAS,KAAK,CAAA;MAAA,CACf,CAAA;IACL;IAEA,OAAO,MAAG;MApEd,IAAAkB,EAAA;MAoEiB,OAAA,CAAAA,EAAA,GAAAf,YAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAAA,YAAA,CAAcK,YAAd,IAAuB,GAAA,KAAA,CAAA,GAAAU,EAAA,CAAAC,WAAA,EAAA;IAAA,CAAA;KACnC,CAAC3B,KAAA,EAAOC,MAAQ,EAAAC,OAAA,EAASW,aAAa,CAAC,CAAA;EAEnC,OAAA;IAACJ,IAAM;IAAAL,OAAA;IAASG;GAAK;AAC9B;ACpCgB,SAAAqB,eAAA,QAA0D;EAAA,IAA1C;IAAC/B;GAAyC;EAClE,MAAA;IAACgC;GAAW,GAAIC,MAAAA,CAAAA,YAAa,EAAA;EACnC,MAAMC,SAASC,MAAU,CAAAA,SAAA,CAAA;IAACnC,UAAY,EAAAA,UAAA,IAAA,IAAA,GAAAA,UAAA,GAAc;GAAa,CAAA;EACjE,MAAM,CAACoC,KAAO,EAAAC,QAAQ,CAAI,GAAA5B,KAAA,CAAAA,QAAA,CAAS,EAAE,CAAA;EAErCS,KAAAA,CAAAA,SAAA,CAAU,MAAM;IACd,MAAM;MAACoB;IAAA,CAAa,GAAAJ,MAAA,CAAOK,MAAO,EAAA;IAElC,eAAeC,QAAQC,EAAY,EAAA;MAC3B,MAAAC,WAAA,GAAc,MAAMR,MAAA,CAAOS,OAAQ,CAAA;QACvCC,GAAA,sBAAkBN,SAAmB,oBAAAG,EAAA;MAAA,CACtC,CAAA;MAEM,OAAAC,WAAA;IACT;IAEA,eAAeG,iBAAoB,GAAA;MAC3B,MAAAC,SAAA,GAAY,MAAMZ,MAAA,CACrBS,OAAQ,CAAA;QACPC,yBAAkBN,SAAA;MACnB,CAAA,CACA,CAAAS,IAAA,CAAK,MAAOC,OACXC,OAAQ,CAAAC,GAAA,CACNF,GAAA,CAAIG,GAAI,CAAA,MAAOC,IAAwB,KAAA;QACrCC,aAAA,EAAeD,IAAK,CAAAE,aAAA,MAAkBtB,WAAa,IAAA,IAAA,GAAA,KAAA,CAAA,GAAAA,WAAA,CAAAS,EAAA,CAAA;QACnD,IAAI,MAAMD,OAAQ,CAAAY,IAAA,CAAKE,aAAa,CAAA;MAAA,CACpC,CAAA,CAAA,CACJ,CAED,CAAAC,KAAA,CAAO9B,GAAA,IAAQA,GAAG,CAAA;MAErBY,QAAA,CAASS,SAAS,CAAA;IACpB;IAEI,IAAA,CAACV,MAAMoB,MAAQ,EAAA;MACCX,iBAAA,EAAA;IACpB;KACC,CAACX,MAAA,EAAQF,2CAAaS,EAAI,EAAAL,KAAA,CAAMoB,MAAM,CAAC,CAAA;EAEnC,OAAApB,KAAA;AACT;ACxDA,MAAMqB,aAA+B,GAAA;EACnCC,IAAM,EAAA;AACR,CAAA;AAEO,SAASC,SAASC,KAAsB,EAAA;EACvC,MAAA;IAACC,KAAO;IAAAC,WAAA;IAAaC,IAAM;IAAAL,IAAA;IAAMM;EAAQ,CAAA,GAAI;IAAC,GAAGP,aAAe;IAAA,GAAGG;GAAK;EAG5E,OAAAK,eAAAA,UAAAA,CAAAA,GAAA,CAACC,EAAAA,CAAAA,IAAK,EAAA;IAAAR,IAAA;IAAYS,OAAS,EAAA,CAAA;IAAGC,QAAQ,CAAG;IAAAC,MAAA,EAAM,IAC7C;IAAAL,QAAA,EAAA,eAAAM,UAAA,CAAAA,IAAA,CAACC,EACE,CAAAA,IAAA,EAAA;MAAAP,QAAA,EAAA,CAAAD,IAAA,oBAAwB,IAAA,EACxBC,QAAA,GACCA,WAECC,eAAAA,UAAAA,CAAAA,GAAA,CAAAO,EAAA,CAAAA,GAAA,EAAA;QAAIC,MAAM,CACT;QAAAT,QAAA,EAAA,eAAAM,UAAA,CAAAA,IAAA,CAACI,EAAM,CAAAA,KAAA,EAAA;UAAAC,KAAA,EAAO,CACX;UAAAX,QAAA,EAAA,CAAAH,KAAA,GAASI,eAAAA,UAAAA,CAAAA,GAAA,CAAAW,EAAAA,CAAAA,IAAA,EAAA;YAAKC,MAAO,EAAA,UAAA;YAAYb;UAAM,CAAA,CAAU,GAAA,IAAA,EACjDF,cAAeG,eAAAA,UAAAA,CAAAA,GAAA,CAAAW,EAAAA,CAAAA,IAAA,EAAA;YAAKE,IAAM,EAAA,CAAA;YAAId;UAAY,CAAA,CAAU,GAAA,IAAA;QAAA,CACvD;MACF,CAAA,CAAA;IAEJ,CAAA;EACF,CAAA,CAAA;AAEJ;ACpCA,MAAMe,YAAe,GAAA,YAA2B;EAAA,IAA1BnB,KAAmB,uEAAA,EAAO;EAC9C,OAAQK,eAAAA,UAAAA,CAAAA,GAAA,CAAAC,EAAAA,CAAAA,IAAA,EAAA;IAAKc,EAAG,EAAA,OAAA;IAAS,GAAGpB;EAAO,CAAA,CAAA;AACrC,CAAA;AAEA,MAAMqB,WAAA,GAAcC,wBAAOH,YAAY,CAAA,CACrC,MACEI,UAAA,mLAAA,CAQJ;AAIO,SAASC,MAAMxB,KAAmB,EAAA;EACvC,MAAM;IAACI,QAAA;IAAU,GAAGqB;EAAA,CAAQ,GAAAzB,KAAA;EAE5B,OAAQK,eAAAA,UAAAA,CAAAA,GAAA,CAAAgB,WAAA,EAAA;IAAa,GAAGI,IAAA;IAAOrB;EAAS,CAAA,CAAA;AAC1C;AAGA,MAAMsB,UAAa,GAAA,YAA2B;EAAA,IAA1B1B,KAAmB,uEAAA,EAAO;EAC5C,OAAQK,eAAAA,UAAAA,CAAAA,GAAA,CAAAC,EAAAA,CAAAA,IAAA,EAAA;IAAKc,EAAG,EAAA,IAAA;IAAM,GAAGpB;EAAO,CAAA,CAAA;AAClC,CAAA;AAEA,MAAM2B,SAAA,GAAYL,wBAAOI,UAAU,CAAA,CACjC,MACEH,UAAA,yKAAA,CAOJ;AAIO,SAASK,IAAI5B,KAAsB,EAAA;EACxC,MAAM;IAACI,QAAA;IAAU,GAAGqB;EAAA,CAAQ,GAAAzB,KAAA;EAE5B,OAAQK,eAAAA,UAAAA,CAAAA,GAAA,CAAAsB,SAAA,EAAA;IAAW,GAAGF,IAAA;IAAOrB;EAAS,CAAA,CAAA;AACxC;AAGA,MAAMyB,WAAc,GAAA,YAAgB;EAAA,IAAf7B,KAAQ,uEAAA,EAAO;EAClC,OAAQK,eAAAA,UAAAA,CAAAA,GAAA,CAAAC,EAAAA,CAAAA,IAAA,EAAA;IAAKc,EAAG,EAAA,IAAA;IAAM,GAAGpB;EAAO,CAAA,CAAA;AAClC,CAAA;AAEA,MAAM8B,UAAA,GAAaR,wBAAOO,WAAW,CAAA,CACnC,MACEN,UAAA,2KAAA,CAOJ;AAIO,SAASQ,KAAK/B,KAAuB,EAAA;EAC1C,MAAM;IAACI,QAAA;IAAU,GAAGqB;EAAA,CAAQ,GAAAzB,KAAA;EAE5B,OAAQK,eAAAA,UAAAA,CAAAA,GAAA,CAAAyB,UAAA,EAAA;IAAY,GAAGL,IAAA;IAAOrB;EAAS,CAAA,CAAA;AACzC;ACvEA,SAAS4B,WAAA,CACPxD,OACAyD,YACgB,EAAA;EACT,OAAAzD,KAAA,CAAM0D,MAAO,CAAC1C,IAAS,IAAA;IAC5B,MAAM2C,WAAe,GAAA,CAAA3C,IAAA,CAAK2C,WAAe,IAAA,EAAA,EAAIC,WAAY,EAAA;IACrD,IAAAD,WAAA,CAAYE,WAAWJ,YAAY,CAAA,EAAU,OAAA,IAAA;IACjD,MAAMK,SAAa,GAAA,CAAA9C,IAAA,CAAK8C,SAAa,IAAA,EAAA,EAAIF,WAAY,EAAA;IACjD,IAAAE,SAAA,CAAUD,WAAWJ,YAAY,CAAA,EAAU,OAAA,IAAA;IAC/C,MAAMM,UAAc,GAAA,CAAA/C,IAAA,CAAK+C,UAAc,IAAA,EAAA,EAAIH,WAAY,EAAA;IACnD,IAAAG,UAAA,CAAWF,WAAWJ,YAAY,CAAA,EAAU,OAAA,IAAA;IAChD,MAAMO,UAAc,GAAA,CAAAhD,IAAA,CAAKgD,UAAc,IAAA,EAAA,EAAIJ,WAAY,EAAA;IACnD,IAAAI,UAAA,CAAWH,WAAWJ,YAAY,CAAA,EAAU,OAAA,IAAA;IAEzC,OAAA,KAAA;EAAA,CACR,CAAA;AACH;AAWO,SAASQ,eAAezC,KAA4B,EAAA;EACnD,MAAA;IACJ0C,QAAQ,EAAC;IACTC,WAAW,EAAC;IACZC,KAAA;IACAC,QAAA;IACAC,OAAA;IACAC,QAAQ,CAAC;EACP,CAAA,GAAA/C,KAAA;EACJ,MAAM,CAACiC,YAAc,EAAAe,eAAe,CAAI,GAAAC,cAAAA,CAAAA,OAAA,CAAMpG,SAAS,EAAE,CAAA;EACzD,MAAMqG,aAAgB,GAAAlB,WAAA,CAAYW,QAAY,IAAA,IAAIV,YAAY,CAAA;EAE9D,MAAMkB,KAAKR,QAAS,CAAAS,IAAA,CAAMC,CAAA,IAAMA,EAAE5D,aAAa,CAAA;EAC/C,MAAM6D,UAAa,GAAAH,EAAA,IAAMT,KAAM,CAAAa,QAAA,CAASJ,GAAGtE,EAAE,CAAA;EAI7C,MAAM2E,QAAQrG,KAAAA,CAAAA,MAAyB,EAAA;EAOjC,MAAAsG,kBAAA,GAAsBC,KAA+C,IAAA;IACzDV,eAAA,CAAAU,KAAA,CAAMC,OAAOjB,KAAK,CAAA;EAAA,CACpC;EAEM,MAAAkB,YAAA,GAAe,CAACC,SAAA,EAAoBrE,IAAuB,KAAA;IAC/D,IAAI,CAACqE,SAAW,EAAA;MACV,IAAAjB,KAAA,EAAOA,KAAA,CAAMpD,KAAKX,EAAE,CAAA;IACf,CAAA,MAAA,IAAAgE,QAAA,EAAUA,QAAA,CAASrD,KAAKX,EAAE,CAAA;EAAA,CACvC;EAEA,MAAMiF,qBAAqB,MAAM;IAC/B,IAAIX,EAAM,IAAAP,KAAA,EAAOA,KAAA,CAAMO,GAAGtE,EAAE,CAAA;EAAA,CAC9B;EAEA,MAAMkF,uBAAuB,MAAM;IACjC,IAAIZ,EAAM,IAAAN,QAAA,EAAUA,QAAA,CAASM,GAAGtE,EAAE,CAAA;EAAA,CACpC;EAEA,MAAMmF,4BAA4B,MAAM;IAClC,IAAAlB,OAAA,EAAiBA,OAAA,EAAA;EAAA,CACvB;EAGE,OAAA,eAAApC,eAAA,CAACuD,EAAAA,CAAAA;IAAKlB,KACH;IAAA3C,QAAA,EAAA,CACCkD,UAAA,kBAAAjD,UAAA,CAAAA,GAAA,CAAC6D,EAAA,CAAAA,QAAA,EAAA;MACCpE,IAAK,EAAA,SAAA;MACLqE,UAAU,CAAChB,EAAA;MACXiB,OAAS,EAAAL,oBAAA;MACT5D,IAAM,EAAAkE,KAAA,CAAAA,gBAAA;MACNC,IAAK,EAAA;IAAA,CAAA,CAGP,kBAAAjE,UAAA,CAAAA,GAAA,CAAC6D,EAAA,CAAAA,QAAA,EAAA;MACCpE,IAAK,EAAA,UAAA;MACLsE,OAAS,EAAAN,kBAAA;MACT3D,IAAM,EAAAoE,KAAA,CAAAA,aAAA;MACND,IAAK,EAAA;IAAA,CAAA,CACP,EAAA,eAGFjE,UAAA,CAAAA,GAAA,CAAC6D,EAAA,CAAAA,QAAA,EAAA;MACCpE,IAAK,EAAA,UAAA;MACLqE,QAAA,EAAUzB,MAAM9C,MAAW,KAAA,CAAA;MAC3BwE,OAAS,EAAAJ,yBAAA;MACT7D,IAAM,EAAAqE,KAAA,CAAAA,WAAA;MACNF,IAAK,EAAA;IAAA,CAAA,CACP,EAEAjE,eAAAA,UAAAA,CAAAA,GAAA,CAACO,EAAAA,CAAAA,GAAI,EAAA;MAAAL,OAAA,EAAS,CACZ;MAAAH,QAAA,EAAA,eAAAC,UAAA,CAAAA,GAAA,CAACoE,EAAA,CAAAA,SAAA,EAAA;QAECC,GAAK,EAAAlB,KAAA;QACLmB,QAAU,EAAAlB,kBAAA;QACVmB,WAAY,EAAA,gBAAA;QACZlC,KAAO,EAAAT;MAAA,CAAA;KAEX,CAAA,EAECA,YAAA,IAAA,CAAgBiB,+CAAetD,MAAW,MAAA,CAAA,IAAA,8BACxCsE,EAAS,CAAAA,QAAA,EAAA;MAAAC,QAAA,EAAQ,IAAC;MAAAG,IAAA,EAAK;KAAa,CAAA,EAGtCpB,aACC,IAAAA,aAAA,CAAc3D,GAAI,CAACC,IACjB,IAAA,eAAAa,UAAA,CAAAA,GAAA,CAAC6D,EAAA,CAAAA,QAAA,EAAA;MAECW,OAAS,EAAAnC,KAAA,CAAMa,QAAS,CAAA/D,IAAA,CAAKX,EAAE,CAAA;MAC/BuF,OAAA,EAAS,MAAMR,YAAa,CAAAlB,KAAA,CAAMoC,QAAQtF,IAAK,CAAAX,EAAE,CAAI,GAAA,CAAA,CAAA,EAAIW,IAAI,CAAA;MAE7DY,QAAA,EAAA,eAAAM,UAAA,CAAAA,IAAA,CAACC,EAAK,CAAAA,IAAA,EAAA;QAAAoE,KAAA,EAAM,QACV;QAAA3E,QAAA,EAAA,CAACC,eAAAA,UAAAA,CAAAA,GAAA,CAAA2E,MAAAA,CAAAA,UAAA,EAAA;UAAWxF,IAAY;UAAA0B,IAAA,EAAM;QAAG,CAAA,CAAA,EAAA,eACjCb,UAAA,CAAAA,GAAA,CAACO,EAAI,CAAAA,GAAA,EAAA;UAAAqE,QAAA,EAAU,CAAG;UAAApE,IAAA,EAAM;UACtBT,QAAC,EAAAC,eAAAA,UAAAA,CAAAA,GAAA,CAAAW,EAAAA,CAAAA,IAAA,EAAA;YAAMZ,QAAK,EAAAZ,IAAA,CAAA2C;UAAA,CAAY;QAC1B,CAAA,CAAA,EACC3C,IAAA,CAAKC,aACJ,IAAAY,eAAAA,UAAAA,CAAAA,GAAA,CAAC6E,EAAM,CAAAA,KAAA,EAAA;UAAAC,QAAA,EAAU;UAAGrF,IAAK,EAAA,UAAA;UAAWsF,IAAK,EAAA,SAAA;UAAUhF,QAEnD,EAAA;QAAA,CAAA,CAAA;OAEJ;IAAA,CAAA,EAdKZ,IAAK,CAAAX,EAAA,CAgBb,CAAA;EACL,CAAA,CAAA;AAEJ;;;;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sanity-plugin-utils",
3
- "version": "1.0.2",
3
+ "version": "1.0.3",
4
4
  "description": "A collection of useful Hooks and Components when creating Plugins",
5
5
  "keywords": [
6
6
  "sanity",
@@ -60,7 +60,7 @@
60
60
  "@commitlint/config-conventional": "^17.4.2",
61
61
  "@sanity/pkg-utils": "^2.2.4",
62
62
  "@sanity/plugin-kit": "^3.1.4",
63
- "@sanity/semantic-release-preset": "^2.0.2",
63
+ "@sanity/semantic-release-preset": "^4.0.0",
64
64
  "@sanity/ui": "^1.2.2",
65
65
  "@types/react": "^18.0.27",
66
66
  "@types/styled-components": "^5.1.26",
@@ -82,6 +82,7 @@
82
82
  "react-is": "^18.2.0",
83
83
  "rimraf": "^4.1.2",
84
84
  "sanity": "^3.3.1",
85
+ "semantic-release": "^20.1.0",
85
86
  "styled-components": "^5.3.6",
86
87
  "typescript": "^4.9.5"
87
88
  },
@@ -5,7 +5,10 @@ import {UserAvatar} from 'sanity'
5
5
 
6
6
  import {UserExtended} from '../../hooks/useProjectUsers'
7
7
 
8
- function searchUsers(users: UserExtended[], searchString: string): UserExtended[] {
8
+ function searchUsers(
9
+ users: UserExtended[],
10
+ searchString: string
11
+ ): UserExtended[] {
9
12
  return users.filter((user) => {
10
13
  const displayName = (user.displayName || '').toLowerCase()
11
14
  if (displayName.startsWith(searchString)) return true
@@ -26,12 +29,18 @@ type UserSelectMenuProps = {
26
29
  onAdd: any
27
30
  onRemove: any
28
31
  onClear: any
29
- open: boolean
30
32
  style?: React.CSSProperties
31
33
  }
32
34
 
33
35
  export function UserSelectMenu(props: UserSelectMenuProps) {
34
- const {value = [], userList = [], onAdd, onRemove, onClear, style = {}} = props
36
+ const {
37
+ value = [],
38
+ userList = [],
39
+ onAdd,
40
+ onRemove,
41
+ onClear,
42
+ style = {},
43
+ } = props
35
44
  const [searchString, setSearchString] = React.useState('')
36
45
  const searchResults = searchUsers(userList || [], searchString)
37
46
 
@@ -106,7 +115,9 @@ export function UserSelectMenu(props: UserSelectMenuProps) {
106
115
  />
107
116
  </Box>
108
117
 
109
- {searchString && searchResults?.length === 0 && <MenuItem disabled text="No matches" />}
118
+ {searchString && searchResults?.length === 0 && (
119
+ <MenuItem disabled text="No matches" />
120
+ )}
110
121
 
111
122
  {searchResults &&
112
123
  searchResults.map((user) => (
package/src/index.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  export {useListeningQuery} from './hooks/useListeningQuery'
2
2
  export {useProjectUsers} from './hooks/useProjectUsers'
3
+ export type {UserExtended} from './hooks/useProjectUsers'
3
4
 
4
5
  export {Feedback} from './components/Feedback'
5
6
  export {Table, Row, Cell} from './components/Table'