3b3717d307
* Folds=>groups * Show groups on user profile * Allow group creation from /create * Refactoring to groups * Convert folds to groups * Add new add to group notification * Fix user profile tab bug * Add groups nav and tab for my groups * Remove bad profile pages * remove comments * Add group list dropdown to sidebar * remove unused * group cards ui * Messages=>Comments, v2, groupDetails * Discussion time * Cleaning up some code * Remove follow count * Fix pool scoring for cpmm * Fix imports * Simplify rules, add GroupUser collection * Fix group cards * Refactor * Refactor * Small fixes * Remove string * Add api error detail handling * Clear name field * Componentize * Spacing * Undo userpage memo * Member groups are already in my tab * Remove active contracts reference for now * Remove unused * Refactoring * Allow adding old questions to a group * Rename * Wording * Throw standard v2 APIError * Hide input for non-members, add about under title * Multiple names to & # more * Move comments firestore rules to appropriate subpaths * Group membership, pool=>volume * Cleanup, useEvent * Raise state to parent * Eliminate unused * Cleaning up * Clean code * Revert tags input deletion * Cleaning code * Stylling * Limit members to display * Array cleanup * Add categories back in * Private=>closed * Unused vars
85 lines
2.1 KiB
TypeScript
85 lines
2.1 KiB
TypeScript
import {
|
|
collection,
|
|
deleteDoc,
|
|
doc,
|
|
query,
|
|
updateDoc,
|
|
where,
|
|
} from 'firebase/firestore'
|
|
import { sortBy } from 'lodash'
|
|
import { Group } from 'common/group'
|
|
import { getContractFromId } from './contracts'
|
|
import { db } from './init'
|
|
import { getValue, getValues, listenForValue, listenForValues } from './utils'
|
|
import { filterDefined } from 'common/util/array'
|
|
|
|
const groupCollection = collection(db, 'groups')
|
|
|
|
export function groupPath(
|
|
groupSlug: string,
|
|
subpath?: 'edit' | 'questions' | 'details' | 'discussion'
|
|
) {
|
|
return `/group/${groupSlug}${subpath ? `/${subpath}` : ''}`
|
|
}
|
|
|
|
export function updateGroup(group: Group, updates: Partial<Group>) {
|
|
return updateDoc(doc(groupCollection, group.id), updates)
|
|
}
|
|
|
|
export function deleteGroup(group: Group) {
|
|
return deleteDoc(doc(groupCollection, group.id))
|
|
}
|
|
|
|
export async function listAllGroups() {
|
|
return getValues<Group>(groupCollection)
|
|
}
|
|
|
|
export function listenForGroups(setGroups: (groups: Group[]) => void) {
|
|
return listenForValues(groupCollection, setGroups)
|
|
}
|
|
|
|
export function getGroup(groupId: string) {
|
|
return getValue<Group>(doc(groupCollection, groupId))
|
|
}
|
|
|
|
export async function getGroupBySlug(slug: string) {
|
|
const q = query(groupCollection, where('slug', '==', slug))
|
|
const groups = await getValues<Group>(q)
|
|
|
|
return groups.length === 0 ? null : groups[0]
|
|
}
|
|
|
|
export async function getGroupContracts(group: Group) {
|
|
const { contractIds } = group
|
|
|
|
const contracts =
|
|
filterDefined(
|
|
await Promise.all(
|
|
contractIds.map(async (contractId) => {
|
|
return await getContractFromId(contractId)
|
|
})
|
|
)
|
|
) ?? []
|
|
|
|
return [...contracts]
|
|
}
|
|
|
|
export function listenForGroup(
|
|
groupId: string,
|
|
setGroup: (group: Group | null) => void
|
|
) {
|
|
return listenForValue(doc(groupCollection, groupId), setGroup)
|
|
}
|
|
|
|
export function listenForMemberGroups(
|
|
userId: string,
|
|
setGroups: (groups: Group[]) => void
|
|
) {
|
|
const q = query(groupCollection, where('memberIds', 'array-contains', userId))
|
|
|
|
return listenForValues<Group>(q, (groups) => {
|
|
const sorted = sortBy(groups, [(group) => -group.mostRecentActivityTime])
|
|
setGroups(sorted)
|
|
})
|
|
}
|