changes-users-context.tsx 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import {
  2. createContext,
  3. FC,
  4. useContext,
  5. useEffect,
  6. useMemo,
  7. useState,
  8. } from 'react'
  9. import { getJSON } from '@/infrastructure/fetch-json'
  10. import { useProjectContext } from '@/shared/context/project-context'
  11. import { UserId } from '../../../../../types/user'
  12. import { useEditorContext } from '@/shared/context/editor-context'
  13. export type ChangesUser = {
  14. id: UserId
  15. email: string
  16. first_name?: string
  17. last_name?: string
  18. }
  19. export type ChangesUsers = Map<UserId, ChangesUser>
  20. export const ChangesUsersContext = createContext<ChangesUsers | undefined>(
  21. undefined
  22. )
  23. export const ChangesUsersProvider: FC = ({ children }) => {
  24. const { _id: projectId, members, owner } = useProjectContext()
  25. const { isRestrictedTokenMember } = useEditorContext()
  26. const [changesUsers, setChangesUsers] = useState<ChangesUsers>()
  27. useEffect(() => {
  28. if (isRestrictedTokenMember) {
  29. return
  30. }
  31. getJSON<ChangesUser[]>(`/project/${projectId}/changes/users`).then(data =>
  32. setChangesUsers(new Map(data.map(item => [item.id, item])))
  33. )
  34. }, [projectId, isRestrictedTokenMember])
  35. // add the project owner and members to the changes users data
  36. const value = useMemo(() => {
  37. const value: ChangesUsers = new Map(changesUsers)
  38. value.set(owner._id, { ...owner, id: owner._id })
  39. for (const member of members) {
  40. value.set(member._id, { ...member, id: member._id })
  41. }
  42. return value
  43. }, [members, owner, changesUsers])
  44. return (
  45. <ChangesUsersContext.Provider value={value}>
  46. {children}
  47. </ChangesUsersContext.Provider>
  48. )
  49. }
  50. export const useChangesUsersContext = () => {
  51. return useContext(ChangesUsersContext)
  52. }