2022-06-22 16:35:50 +00:00
|
|
|
import { useEffect, useState } from 'react'
|
|
|
|
import { Group } from 'common/group'
|
|
|
|
import { User } from 'common/user'
|
|
|
|
import {
|
2022-09-03 00:06:48 +00:00
|
|
|
GroupMemberDoc,
|
|
|
|
groupMembers,
|
2022-06-22 16:35:50 +00:00
|
|
|
listenForGroup,
|
2022-09-03 00:06:48 +00:00
|
|
|
listenForGroupContractDocs,
|
2022-06-22 16:35:50 +00:00
|
|
|
listenForGroups,
|
2022-09-03 00:06:48 +00:00
|
|
|
listenForMemberGroupIds,
|
2022-06-22 16:35:50 +00:00
|
|
|
listenForMemberGroups,
|
2022-08-02 03:15:09 +00:00
|
|
|
listenForOpenGroups,
|
2022-07-22 17:34:10 +00:00
|
|
|
listGroups,
|
2022-06-22 16:35:50 +00:00
|
|
|
} from 'web/lib/firebase/groups'
|
2022-09-03 00:06:48 +00:00
|
|
|
import { getUser } from 'web/lib/firebase/users'
|
2022-07-13 21:11:22 +00:00
|
|
|
import { filterDefined } from 'common/util/array'
|
2022-07-22 17:34:10 +00:00
|
|
|
import { Contract } from 'common/contract'
|
|
|
|
import { uniq } from 'lodash'
|
2022-09-03 00:06:48 +00:00
|
|
|
import { listenForValues } from 'web/lib/firebase/utils'
|
2022-06-22 16:35:50 +00:00
|
|
|
|
|
|
|
export const useGroup = (groupId: string | undefined) => {
|
|
|
|
const [group, setGroup] = useState<Group | null | undefined>()
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
if (groupId) return listenForGroup(groupId, setGroup)
|
|
|
|
}, [groupId])
|
|
|
|
|
|
|
|
return group
|
|
|
|
}
|
|
|
|
|
|
|
|
export const useGroups = () => {
|
|
|
|
const [groups, setGroups] = useState<Group[] | undefined>()
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
return listenForGroups(setGroups)
|
|
|
|
}, [])
|
|
|
|
|
|
|
|
return groups
|
|
|
|
}
|
|
|
|
|
2022-08-02 03:15:09 +00:00
|
|
|
export const useOpenGroups = () => {
|
|
|
|
const [groups, setGroups] = useState<Group[]>([])
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
return listenForOpenGroups(setGroups)
|
|
|
|
}, [])
|
|
|
|
|
|
|
|
return groups
|
|
|
|
}
|
|
|
|
|
2022-09-03 00:06:48 +00:00
|
|
|
export const useMemberGroups = (userId: string | null | undefined) => {
|
2022-06-22 16:35:50 +00:00
|
|
|
const [memberGroups, setMemberGroups] = useState<Group[] | undefined>()
|
|
|
|
useEffect(() => {
|
2022-07-13 21:11:22 +00:00
|
|
|
if (userId)
|
2022-09-03 00:06:48 +00:00
|
|
|
return listenForMemberGroups(userId, (groups) => setMemberGroups(groups))
|
|
|
|
}, [userId])
|
2022-06-22 16:35:50 +00:00
|
|
|
return memberGroups
|
|
|
|
}
|
|
|
|
|
|
|
|
// Note: We cache member group ids in localstorage to speed up the initial load
|
|
|
|
export const useMemberGroupIds = (user: User | null | undefined) => {
|
|
|
|
const [memberGroupIds, setMemberGroupIds] = useState<string[] | undefined>(
|
|
|
|
undefined
|
|
|
|
)
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
if (user) {
|
2022-09-03 00:06:48 +00:00
|
|
|
return listenForMemberGroupIds(user.id, (groupIds) => {
|
2022-06-22 16:35:50 +00:00
|
|
|
setMemberGroupIds(groupIds)
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}, [user])
|
|
|
|
|
|
|
|
return memberGroupIds
|
|
|
|
}
|
|
|
|
|
2022-09-03 00:06:48 +00:00
|
|
|
export function useMembers(groupId: string | undefined) {
|
2022-06-22 16:35:50 +00:00
|
|
|
const [members, setMembers] = useState<User[]>([])
|
|
|
|
useEffect(() => {
|
2022-09-03 00:06:48 +00:00
|
|
|
if (groupId)
|
|
|
|
listenForValues<GroupMemberDoc>(groupMembers(groupId), (memDocs) => {
|
|
|
|
const memberIds = memDocs.map((memDoc) => memDoc.userId)
|
|
|
|
Promise.all(memberIds.map((id) => getUser(id))).then((users) => {
|
|
|
|
setMembers(users)
|
|
|
|
})
|
|
|
|
})
|
|
|
|
}, [groupId])
|
2022-06-22 16:35:50 +00:00
|
|
|
return members
|
|
|
|
}
|
2022-06-22 22:19:17 +00:00
|
|
|
|
2022-09-03 00:06:48 +00:00
|
|
|
export function useMemberIds(groupId: string | null) {
|
|
|
|
const [memberIds, setMemberIds] = useState<string[]>([])
|
|
|
|
useEffect(() => {
|
|
|
|
if (groupId)
|
|
|
|
return listenForValues<GroupMemberDoc>(groupMembers(groupId), (docs) => {
|
|
|
|
setMemberIds(docs.map((doc) => doc.userId))
|
|
|
|
})
|
|
|
|
}, [groupId])
|
|
|
|
return memberIds
|
2022-06-24 23:38:39 +00:00
|
|
|
}
|
|
|
|
|
2022-07-22 17:34:10 +00:00
|
|
|
export const useGroupsWithContract = (contract: Contract) => {
|
|
|
|
const [groups, setGroups] = useState<Group[]>([])
|
2022-06-22 22:19:17 +00:00
|
|
|
|
|
|
|
useEffect(() => {
|
2022-07-22 17:34:10 +00:00
|
|
|
if (contract.groupSlugs)
|
|
|
|
listGroups(uniq(contract.groupSlugs)).then((groups) =>
|
|
|
|
setGroups(filterDefined(groups))
|
|
|
|
)
|
|
|
|
}, [contract.groupSlugs])
|
2022-06-22 22:19:17 +00:00
|
|
|
|
|
|
|
return groups
|
|
|
|
}
|
2022-09-03 00:06:48 +00:00
|
|
|
|
|
|
|
export function useGroupContractIds(groupId: string) {
|
|
|
|
const [contractIds, setContractIds] = useState<string[]>([])
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
if (groupId)
|
|
|
|
return listenForGroupContractDocs(groupId, (docs) =>
|
|
|
|
setContractIds(docs.map((doc) => doc.contractId))
|
|
|
|
)
|
|
|
|
}, [groupId])
|
|
|
|
|
|
|
|
return contractIds
|
|
|
|
}
|