Skip to content

Commit b9a1f2b

Browse files
committed
make user non-optional in GuildMember type
upstreaming: discordjs/discord-api-types#998
1 parent f84d352 commit b9a1f2b

File tree

6 files changed

+29
-30
lines changed

6 files changed

+29
-30
lines changed

src/components/User.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { useState } from 'react'
22
import { getAvatar, getDisplayName } from '../util'
3-
import { APIGuildMember } from 'discord-api-types/v10'
3+
import type { GuildMember } from '../hooks/useGuildMembers'
44

55
interface DiscordAvatarProps {
6-
member: APIGuildMember | undefined
6+
member: GuildMember | undefined
77
size?: number
88
toolTipLeft?: boolean
99
}

src/components/task/ManageTask.tsx

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@ import Select from 'react-select'
33
import { selectStyles } from '../../styles/select-styles.ts'
44
import { db } from '../../services/firebase.ts'
55
import { arrayUnion, collection, doc, updateDoc } from 'firebase/firestore'
6-
import { APIGuildMember } from 'discord-api-types/v10'
76
import { ChoiceButtons } from '../ChoiceButtons.tsx'
87
import { Task, priorities, taskStatuses, deadlines, Deadline, Project, TaskStatus, Priority } from '../../types.ts'
98
import TaskDetails from './TaskDetails'
109
import calculateDeadline from '../../scripts/CalculateDeadline.ts'
1110
import Swal from 'sweetalert2'
1211
import withReactContent from 'sweetalert2-react-content'
1312
import { getAuth } from 'firebase/auth'
13+
import type { GuildMember } from '../../hooks/useGuildMembers.ts'
1414

1515
const firebaseAuth = getAuth()
1616

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

2121
interface Props {
2222
project: Project
23-
members: APIGuildMember[]
23+
members: GuildMember[]
2424
currTask: Task | null // if null, create a new task
2525
token: string
2626
}
@@ -128,13 +128,11 @@ export function ManageTask({ project, members, currTask, token }: Props) {
128128
<Select
129129
isMulti={true}
130130
name="assignees"
131-
options={members.map((m: APIGuildMember) => ({
132-
value: m.user!.id,
133-
label: m.user!.username
131+
options={members.map(m => ({
132+
value: m.user.id,
133+
label: m.user.username
134134
}))}
135-
value={members
136-
.filter((m: APIGuildMember) => formData.assignees.includes(m.user!.id))
137-
.map(m => ({ value: m.user!.id, label: m.user!.username }))}
135+
value={members.filter(m => formData.assignees.includes(m.user.id)).map(m => ({ value: m.user.id, label: m.user.username }))}
138136
placeholder="Select assignees..."
139137
onChange={selected =>
140138
handleInputChange(

src/components/task/TaskDetails.tsx

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,25 @@
11
import { Task, Project, getStatus, getPriority } from '../../types'
22
import { DeleteTask } from './DeleteTask'
3-
import { APIGuildMember } from 'discord-api-types/v10'
3+
import type { GuildMember } from '../../hooks/useGuildMembers'
44
import { DiscordAvatar } from '../User'
55
import '../../styles/TaskModal.css'
6-
6+
import { ManageTask } from './ManageTask'
77
import Swal from 'sweetalert2'
88
import withReactContent from 'sweetalert2-react-content'
9-
import { ManageTask } from './ManageTask'
109

1110
const swal = withReactContent(Swal)
1211

1312
interface Props {
1413
project: Project
1514
task: Task
16-
members: APIGuildMember[]
15+
members: GuildMember[]
1716
token: string
1817
}
1918

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

23-
const getMember = (id: string) => members.find(m => m.user?.id === id)
22+
const getMember = (id: string) => members.find(m => m.user.id === id)
2423

2524
const reopen = () =>
2625
swal.fire({

src/hooks/useGuildMembers.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@ import { createContext, useContext } from 'react'
22
import { FetchStatus } from '../types'
33
import { APIGuildMember } from 'discord-api-types/v10'
44

5+
export type GuildMember = APIGuildMember & Required<Pick<APIGuildMember, 'user'>>
6+
57
interface GuildMembersData {
68
status: FetchStatus
7-
members: APIGuildMember[]
8-
getMember: (id: string) => APIGuildMember | undefined
9-
getRoleMembers: (roleId: string) => APIGuildMember[]
9+
members: GuildMember[]
10+
getMember: (id: string) => GuildMember | undefined
11+
getRoleMembers: (roleId: string) => GuildMember[]
1012
}
1113

1214
export const GuildMembersContext = createContext<GuildMembersData>(null!)

src/providers/guildMembers.tsx

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,18 @@
11
import { useEffect, useRef, useState } from 'react'
2-
import { APIGuildMember } from 'discord-api-types/v10'
32
import { FetchStatus } from '../types.ts'
4-
import { GuildMembersContext } from '../hooks/useGuildMembers.ts'
3+
import { GuildMember, GuildMembersContext } from '../hooks/useGuildMembers.ts'
54
import { useAuth } from '../hooks/useAuth.ts'
65

76
export function GuildMembersProvider({ children }: { children: React.ReactNode }) {
8-
const [members, setMembers] = useState<APIGuildMember[]>([])
7+
const [members, setMembers] = useState<GuildMember[]>([])
98
const [status, setStatus] = useState(FetchStatus.Loading)
109
const settingUp = useRef(false)
1110
const auth = useAuth()
1211

1312
useEffect(() => {
1413
function setup() {
1514
fetch('/api/members', { headers: { Authorization: auth.serverToken } })
16-
.then(response => response.json() as Promise<APIGuildMember[] | { error: string }>)
15+
.then(response => response.json() as Promise<GuildMember[] | { error: string }>)
1716
.then(data => {
1817
if (Array.isArray(data)) {
1918
setMembers(data)
@@ -34,7 +33,7 @@ export function GuildMembersProvider({ children }: { children: React.ReactNode }
3433
}
3534
}, [auth.serverToken])
3635

37-
const getMember = (id: string) => members.find(m => m.user?.id === id)
36+
const getMember = (id: string) => members.find(m => m.user.id === id)
3837

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

src/util.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,21 @@
1-
import { APIGuildMember, CDNRoutes, DefaultUserAvatarAssets, ImageFormat, RouteBases } from 'discord-api-types/v10'
1+
import { CDNRoutes, DefaultUserAvatarAssets, ImageFormat, RouteBases } from 'discord-api-types/v10'
22
import { discordSdk } from './services/discord'
3+
import type { GuildMember } from './hooks/useGuildMembers'
34

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

78
let str = RouteBases.cdn
89
if (member.avatar) {
9-
str += CDNRoutes.guildMemberAvatar(discordSdk.guildId!, member.user!.id, member.avatar, getFormat(member.avatar))
10-
} else if (member.user?.avatar) {
10+
str += CDNRoutes.guildMemberAvatar(discordSdk.guildId!, member.user.id, member.avatar, getFormat(member.avatar))
11+
} else if (member.user.avatar) {
1112
str += CDNRoutes.userAvatar(member.user.id, member.user.avatar, getFormat(member.user.avatar))
1213
} else {
13-
str += CDNRoutes.defaultUserAvatar(((BigInt(member.user!.id) >> 22n) % 6n) as unknown as DefaultUserAvatarAssets)
14+
str += CDNRoutes.defaultUserAvatar(((BigInt(member.user.id) >> 22n) % 6n) as unknown as DefaultUserAvatarAssets)
1415
}
1516
return str + '?size=' + size
1617
}
1718

18-
export const getDisplayName = (member: APIGuildMember) => {
19-
return member.nick ?? member.user!.global_name ?? member.user!.username
19+
export const getDisplayName = (member: GuildMember) => {
20+
return member.nick ?? member.user.global_name ?? member.user.username
2021
}

0 commit comments

Comments
 (0)