Skip to content

Commit

Permalink
make user non-optional in GuildMember type
Browse files Browse the repository at this point in the history
  • Loading branch information
advaith1 committed Jun 4, 2024
1 parent f84d352 commit b9a1f2b
Show file tree
Hide file tree
Showing 6 changed files with 29 additions and 30 deletions.
4 changes: 2 additions & 2 deletions src/components/User.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { useState } from 'react'
import { getAvatar, getDisplayName } from '../util'
import { APIGuildMember } from 'discord-api-types/v10'
import type { GuildMember } from '../hooks/useGuildMembers'

interface DiscordAvatarProps {
member: APIGuildMember | undefined
member: GuildMember | undefined
size?: number
toolTipLeft?: boolean
}
Expand Down
14 changes: 6 additions & 8 deletions src/components/task/ManageTask.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@ import Select from 'react-select'
import { selectStyles } from '../../styles/select-styles.ts'
import { db } from '../../services/firebase.ts'
import { arrayUnion, collection, doc, updateDoc } from 'firebase/firestore'
import { APIGuildMember } from 'discord-api-types/v10'
import { ChoiceButtons } from '../ChoiceButtons.tsx'
import { Task, priorities, taskStatuses, deadlines, Deadline, Project, TaskStatus, Priority } from '../../types.ts'
import TaskDetails from './TaskDetails'
import calculateDeadline from '../../scripts/CalculateDeadline.ts'
import Swal from 'sweetalert2'
import withReactContent from 'sweetalert2-react-content'
import { getAuth } from 'firebase/auth'
import type { GuildMember } from '../../hooks/useGuildMembers.ts'

const firebaseAuth = getAuth()

Expand All @@ -20,7 +20,7 @@ type FormData = Omit<Task, 'id' | 'deadline'> & {

interface Props {
project: Project
members: APIGuildMember[]
members: GuildMember[]
currTask: Task | null // if null, create a new task
token: string
}
Expand Down Expand Up @@ -128,13 +128,11 @@ export function ManageTask({ project, members, currTask, token }: Props) {
<Select
isMulti={true}
name="assignees"
options={members.map((m: APIGuildMember) => ({
value: m.user!.id,
label: m.user!.username
options={members.map(m => ({
value: m.user.id,
label: m.user.username
}))}
value={members
.filter((m: APIGuildMember) => formData.assignees.includes(m.user!.id))
.map(m => ({ value: m.user!.id, label: m.user!.username }))}
value={members.filter(m => formData.assignees.includes(m.user.id)).map(m => ({ value: m.user.id, label: m.user.username }))}
placeholder="Select assignees..."
onChange={selected =>
handleInputChange(
Expand Down
9 changes: 4 additions & 5 deletions src/components/task/TaskDetails.tsx
Original file line number Diff line number Diff line change
@@ -1,26 +1,25 @@
import { Task, Project, getStatus, getPriority } from '../../types'
import { DeleteTask } from './DeleteTask'
import { APIGuildMember } from 'discord-api-types/v10'
import type { GuildMember } from '../../hooks/useGuildMembers'
import { DiscordAvatar } from '../User'
import '../../styles/TaskModal.css'

import { ManageTask } from './ManageTask'
import Swal from 'sweetalert2'
import withReactContent from 'sweetalert2-react-content'
import { ManageTask } from './ManageTask'

const swal = withReactContent(Swal)

interface Props {
project: Project
task: Task
members: APIGuildMember[]
members: GuildMember[]
token: string
}

export default function TaskDetails(props: Props) {
const { project, task, members, token } = props

const getMember = (id: string) => members.find(m => m.user?.id === id)
const getMember = (id: string) => members.find(m => m.user.id === id)

const reopen = () =>
swal.fire({
Expand Down
8 changes: 5 additions & 3 deletions src/hooks/useGuildMembers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,13 @@ import { createContext, useContext } from 'react'
import { FetchStatus } from '../types'
import { APIGuildMember } from 'discord-api-types/v10'

export type GuildMember = APIGuildMember & Required<Pick<APIGuildMember, 'user'>>

interface GuildMembersData {
status: FetchStatus
members: APIGuildMember[]
getMember: (id: string) => APIGuildMember | undefined
getRoleMembers: (roleId: string) => APIGuildMember[]
members: GuildMember[]
getMember: (id: string) => GuildMember | undefined
getRoleMembers: (roleId: string) => GuildMember[]
}

export const GuildMembersContext = createContext<GuildMembersData>(null!)
Expand Down
9 changes: 4 additions & 5 deletions src/providers/guildMembers.tsx
Original file line number Diff line number Diff line change
@@ -1,19 +1,18 @@
import { useEffect, useRef, useState } from 'react'
import { APIGuildMember } from 'discord-api-types/v10'
import { FetchStatus } from '../types.ts'
import { GuildMembersContext } from '../hooks/useGuildMembers.ts'
import { GuildMember, GuildMembersContext } from '../hooks/useGuildMembers.ts'
import { useAuth } from '../hooks/useAuth.ts'

export function GuildMembersProvider({ children }: { children: React.ReactNode }) {
const [members, setMembers] = useState<APIGuildMember[]>([])
const [members, setMembers] = useState<GuildMember[]>([])
const [status, setStatus] = useState(FetchStatus.Loading)
const settingUp = useRef(false)
const auth = useAuth()

useEffect(() => {
function setup() {
fetch('/api/members', { headers: { Authorization: auth.serverToken } })
.then(response => response.json() as Promise<APIGuildMember[] | { error: string }>)
.then(response => response.json() as Promise<GuildMember[] | { error: string }>)
.then(data => {
if (Array.isArray(data)) {
setMembers(data)
Expand All @@ -34,7 +33,7 @@ export function GuildMembersProvider({ children }: { children: React.ReactNode }
}
}, [auth.serverToken])

const getMember = (id: string) => members.find(m => m.user?.id === id)
const getMember = (id: string) => members.find(m => m.user.id === id)

const getRoleMembers = (roleId: string) => members.filter(m => m.roles.includes(roleId))

Expand Down
15 changes: 8 additions & 7 deletions src/util.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,21 @@
import { APIGuildMember, CDNRoutes, DefaultUserAvatarAssets, ImageFormat, RouteBases } from 'discord-api-types/v10'
import { CDNRoutes, DefaultUserAvatarAssets, ImageFormat, RouteBases } from 'discord-api-types/v10'
import { discordSdk } from './services/discord'
import type { GuildMember } from './hooks/useGuildMembers'

export const getAvatar = (member: APIGuildMember, size: number, animate?: boolean) => {
export const getAvatar = (member: GuildMember, size: number, animate?: boolean) => {
const getFormat = (hash: string) => (animate && hash.startsWith('a_') ? ImageFormat.GIF : ImageFormat.PNG)

let str = RouteBases.cdn
if (member.avatar) {
str += CDNRoutes.guildMemberAvatar(discordSdk.guildId!, member.user!.id, member.avatar, getFormat(member.avatar))
} else if (member.user?.avatar) {
str += CDNRoutes.guildMemberAvatar(discordSdk.guildId!, member.user.id, member.avatar, getFormat(member.avatar))
} else if (member.user.avatar) {
str += CDNRoutes.userAvatar(member.user.id, member.user.avatar, getFormat(member.user.avatar))
} else {
str += CDNRoutes.defaultUserAvatar(((BigInt(member.user!.id) >> 22n) % 6n) as unknown as DefaultUserAvatarAssets)
str += CDNRoutes.defaultUserAvatar(((BigInt(member.user.id) >> 22n) % 6n) as unknown as DefaultUserAvatarAssets)
}
return str + '?size=' + size
}

export const getDisplayName = (member: APIGuildMember) => {
return member.nick ?? member.user!.global_name ?? member.user!.username
export const getDisplayName = (member: GuildMember) => {
return member.nick ?? member.user.global_name ?? member.user.username
}

0 comments on commit b9a1f2b

Please sign in to comment.