Skip to content

Commit 8061aee

Browse files
migrate utils.ts to firebase 9
1 parent 7954d83 commit 8061aee

File tree

7 files changed

+685
-39
lines changed

7 files changed

+685
-39
lines changed

.prettierrc.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
module.exports = {
22
jsxSingleQuote: true,
3-
semi: false,
43
singleQuote: true,
4+
trailingComma: 'es2017',
5+
semi: false,
56
}

package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,5 +82,8 @@
8282
"ignoreUnread": true,
8383
"is": 100,
8484
"showRelativePath": true
85+
},
86+
"dependencies": {
87+
"firebase": "^9.6.7"
8588
}
8689
}

src/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1+
// React
12
export * from './types'
23
export * from './useFirebaseUser'
34
export * from './useMessages'
45
export * from './useRoom'
56
export * from './useRooms'
67
export * from './useUsers'
78
export * from './utils'
9+
10+
// Nodejs

src/types.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import { ImageURISource } from 'react-native'
2-
31
/** Interface that represents the chat config. Can be used for setting custom names
42
* for rooms and users collections. Call `setConfig` before doing anything else if
53
* you want to change the default collection names. When using custom names don't forget
@@ -96,7 +94,7 @@ export interface PreviewDataImage {
9694
export interface Room {
9795
createdAt?: number
9896
id: string
99-
imageUrl?: ImageURISource['uri']
97+
imageUrl?: string
10098
lastMessages?: MessageType.Any[]
10199
metadata?: Record<string, any>
102100
name?: string
@@ -109,7 +107,7 @@ export interface User {
109107
createdAt?: number
110108
firstName?: string
111109
id: string
112-
imageUrl?: ImageURISource['uri']
110+
imageUrl?: string
113111
lastName?: string
114112
lastSeen?: number
115113
metadata?: Record<string, any>

src/utils.ts

Lines changed: 49 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,19 @@
1-
import { FirebaseAuthTypes } from '@react-native-firebase/auth'
2-
import firestore, {
3-
FirebaseFirestoreTypes,
4-
} from '@react-native-firebase/firestore'
5-
6-
import { FirebaseChatCoreConfig, Room, User } from './types'
1+
import auth, { UserProfile } from 'firebase/auth';
2+
import {
3+
collection,
4+
deleteDoc,
5+
doc,
6+
DocumentData,
7+
DocumentSnapshot,
8+
Firestore,
9+
getDoc,
10+
QueryDocumentSnapshot,
11+
QuerySnapshot,
12+
serverTimestamp,
13+
setDoc,
14+
} from 'firebase/firestore/lite';
15+
16+
import { FirebaseChatCoreConfig, Room, User } from './types';
717

818
export let ROOMS_COLLECTION_NAME = 'rooms'
919
export let USERS_COLLECTION_NAME = 'users'
@@ -16,40 +26,43 @@ export const setConfig = (config: FirebaseChatCoreConfig) => {
1626
}
1727

1828
/** Creates {@link User} in Firebase to store name and avatar used on rooms list */
19-
export const createUserInFirestore = async (user: User) => {
20-
await firestore().collection(USERS_COLLECTION_NAME).doc(user.id).set({
21-
createdAt: firestore.FieldValue.serverTimestamp(),
29+
export const createUserInFirestore = async (user: User, db: Firestore) => {
30+
const _collection = collection(db, USERS_COLLECTION_NAME)
31+
const _doc = doc(_collection, user.id);
32+
await setDoc(_doc, {
33+
createdAt: serverTimestamp(),
2234
firstName: user.firstName,
2335
imageUrl: user.imageUrl,
2436
lastName: user.lastName,
2537
lastSeen: user.lastSeen,
2638
metadata: user.metadata,
2739
role: user.role,
28-
updatedAt: firestore.FieldValue.serverTimestamp(),
29-
})
40+
updatedAt: serverTimestamp(),
41+
});
3042
}
3143

3244
/** Removes {@link User} from `users` collection in Firebase */
33-
export const deleteUserFromFirestore = async (userId: string) => {
34-
await firestore().collection(USERS_COLLECTION_NAME).doc(userId).delete()
45+
export const deleteUserFromFirestore = async (userId: string, db: Firestore) => {
46+
const _collection = collection(db, USERS_COLLECTION_NAME)
47+
const _doc = doc(_collection, userId)
48+
await deleteDoc(_doc);
3549
}
3650

3751
/** Fetches user from Firebase and returns a promise */
38-
export const fetchUser = async (userId: string, role?: User['role']) => {
39-
const doc = await firestore()
40-
.collection(USERS_COLLECTION_NAME)
41-
.doc(userId)
42-
.get()
52+
export const fetchUser = async (userId: string, db: Firestore, role?: User['role']) => {
53+
const _collection = collection(db, USERS_COLLECTION_NAME)
54+
const _doc = doc(_collection, userId);
55+
const __doc = await getDoc(_doc);
4356

44-
const data = doc.data()!
57+
const data = __doc.data()!
4558

4659
const user: User = {
4760
// Ignore types here, not provided by the Firebase library
4861
// type-coverage:ignore-next-line
4962
createdAt: data.createdAt?.toMillis() ?? undefined,
5063
// type-coverage:ignore-next-line
5164
firstName: data.firstName ?? undefined,
52-
id: doc.id,
65+
id: __doc.id,
5366
// type-coverage:ignore-next-line
5467
imageUrl: data.imageUrl ?? undefined,
5568
// type-coverage:ignore-next-line
@@ -71,33 +84,37 @@ export const fetchUser = async (userId: string, role?: User['role']) => {
7184
export const processRoomsQuery = async ({
7285
firebaseUser,
7386
query,
87+
db
7488
}: {
75-
firebaseUser: FirebaseAuthTypes.User
76-
query: FirebaseFirestoreTypes.QuerySnapshot
89+
firebaseUser: UserProfile,
90+
query: QuerySnapshot
91+
db: Firestore
7792
}) => {
78-
const promises = query.docs.map(async (doc) =>
79-
processRoomDocument({ doc, firebaseUser })
93+
const promises = query.docs.map(async (_doc) =>
94+
processRoomDocument({ _doc, firebaseUser, db })
8095
)
8196

8297
return await Promise.all(promises)
8398
}
8499

85100
/** Returns a {@link Room} created from Firebase document */
86101
export const processRoomDocument = async ({
87-
doc,
102+
_doc,
88103
firebaseUser,
104+
db
89105
}: {
90-
doc:
91-
| FirebaseFirestoreTypes.DocumentSnapshot<FirebaseFirestoreTypes.DocumentData>
92-
| FirebaseFirestoreTypes.QueryDocumentSnapshot<FirebaseFirestoreTypes.DocumentData>
93-
firebaseUser: FirebaseAuthTypes.User
106+
_doc:
107+
| DocumentSnapshot<DocumentData>
108+
| QueryDocumentSnapshot<DocumentData>,
109+
firebaseUser: UserProfile,
110+
db: Firestore
94111
}) => {
95-
const data = doc.data()!
112+
const data = _doc.data()!
96113

97114
// Ignore types here, not provided by the Firebase library
98115
// type-coverage:ignore-next-line
99116
const createdAt = data.createdAt?.toMillis() ?? undefined
100-
const id = doc.id
117+
const id = _doc.id
101118
// type-coverage:ignore-next-line
102119
const updatedAt = data.updatedAt?.toMillis() ?? undefined
103120

@@ -117,7 +134,7 @@ export const processRoomDocument = async ({
117134
(data.userRoles as Record<string, User['role']>) ?? undefined
118135

119136
const users = await Promise.all(
120-
userIds.map((userId) => fetchUser(userId, userRoles?.[userId]))
137+
userIds.map((userId) => fetchUser(userId, db, userRoles?.[userId]))
121138
)
122139

123140
if (type === 'direct') {

tsconfig.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"compilerOptions": {
33
"declaration": true,
44
"esModuleInterop": true,
5-
"jsx": "react-native",
5+
"jsx": "react",
66
"lib": ["ESNext"],
77
"module": "CommonJS",
88
"noEmitOnError": true,

0 commit comments

Comments
 (0)