From 9fa21f751b951996a3a9ac853d78e4804e663f43 Mon Sep 17 00:00:00 2001 From: Nqnt41 Date: Tue, 29 Oct 2024 17:24:35 -0400 Subject: [PATCH 1/3] Render current-user profile picture/display name in chat screen (290) Updated SettingsStore.ts to store/provide update functions for user display name, profile picture index, and profile hex color. Changed SettingsScreen.tsx to allow dynamic updates to each value. In ChatMessage.tsx, allowed rendering of the stored display name, profile picture, profile color. Moved icon paths from SettingsScreen.tsx to new icons.ts file. --- client/app/components/chat/ChatMessage.tsx | 20 ++-- .../app/screens/settings/SettingsScreen.tsx | 48 ++++----- client/app/services/SettingsStore.ts | 26 ++++- client/app/styles/icons.ts | 11 ++ client/package-lock.json | 101 ++++++++++-------- 5 files changed, 128 insertions(+), 78 deletions(-) create mode 100644 client/app/styles/icons.ts diff --git a/client/app/components/chat/ChatMessage.tsx b/client/app/components/chat/ChatMessage.tsx index cc40df996..268d9613b 100644 --- a/client/app/components/chat/ChatMessage.tsx +++ b/client/app/components/chat/ChatMessage.tsx @@ -3,9 +3,15 @@ import { View, StyleSheet, Text, Image, Dimensions } from "react-native"; import { useSettings } from "../../contexts/SettingsContext"; import { MessageProps } from "../../types/Props"; +import { SettingStore } from "../../services/SettingsStore" +import { icons } from "../../styles/icons" const Message: React.FC = ({ messageContent, time, author }) => { - const settings = useSettings(); + // Import textSettings from useSettings + const textSettings = useSettings(); + // Import current settings from SettingStore container + const profileSettings = SettingStore.useState(); + const timestamp = new Date(time).toLocaleTimeString([], { hour: "2-digit", minute: "2-digit", @@ -13,22 +19,22 @@ const Message: React.FC = ({ messageContent, time, author }) => { // Text should have a different color to contrast with the background color const authorStyleProps = { ...styles.authorStyle, - color: settings && settings.theme !== "light" ? "white" : "black", + color: textSettings && textSettings.theme !== "light" ? "white" : "black", }; return ( - {author} + {profileSettings.displayName} {timestamp} @@ -36,7 +42,7 @@ const Message: React.FC = ({ messageContent, time, author }) => { {messageContent} diff --git a/client/app/screens/settings/SettingsScreen.tsx b/client/app/screens/settings/SettingsScreen.tsx index d83dd7b22..c02247424 100644 --- a/client/app/screens/settings/SettingsScreen.tsx +++ b/client/app/screens/settings/SettingsScreen.tsx @@ -18,6 +18,8 @@ import { import { SettingsItem } from "../../components/settings/SettingsItem"; import {ColorInput, DisplayNameInput} from "@app/components/settings/TextInputs"; import { appSignOut } from "../../services/AuthStore"; +import { SettingStore, changeName, changeProfileIndex, changeProfileColor } from "../../services/SettingsStore" +import { icons } from "../../styles/icons" // List of settings items // toggle type: a switch @@ -51,12 +53,12 @@ const Sections = [ ]; const SettingsScreen: React.FC = () => { + // Import current settings from SettingStore container + const settings = SettingStore.useState(); + const [data, setData] = useState({ - displayName: "Display Name", - profilePicIndex: 0, // index for icons array - profileColor: "#1199ff", notifyNewMessage: true, - darkMode: false, + darkMode: settings.isDarkMode, language: "English", deleteMessages: false, }); @@ -67,19 +69,7 @@ const SettingsScreen: React.FC = () => { profileColor: false, }); - - const iconStyle = [styles.icon, {backgroundColor: data.profileColor}] - - const icons = [ - require("../../../assets/icons/user/face_01.png"), - require("../../../assets/icons/user/face_02.png"), - require("../../../assets/icons/user/face_03.png"), - require("../../../assets/icons/user/face_04.png"), - require("../../../assets/icons/user/face_05.png"), - require("../../../assets/icons/user/face_06.png"), - require("../../../assets/icons/user/face_07.png"), - require("../../../assets/icons/user/fake_pfp.jpg"), - ]; + const iconStyle = [styles.icon, {backgroundColor: settings.profileColor}] const [loading, setLoading] = useState(false); @@ -132,27 +122,31 @@ const SettingsScreen: React.FC = () => { - Hi {data.displayName}! + Hi {settings.displayName}! setProfileVisible(false)}> setInputVisible({...inputVisible, ["displayName"]: value})} - outputSetter={(output: string) => setData({...data, ["displayName"]: output})} + outputSetter={(output: string) => { + changeName(output); // Updates the name held in settingStore + }} /> setInputVisible({...inputVisible, ["profileColor"]: value})} - outputSetter={(output: string) => setData({...data, ["profileColor"]: output})} + outputSetter={(output: string) => { + changeProfileColor(output); + }} /> {/* User Settings */} @@ -177,8 +171,10 @@ const SettingsScreen: React.FC = () => { ( - setData({ ...data, ["profilePicIndex"]: icon.index })}> - { + changeProfileIndex(icon.index); + }}> + )}> @@ -197,7 +193,7 @@ const SettingsScreen: React.FC = () => { setProfileVisible(true)}> diff --git a/client/app/services/SettingsStore.ts b/client/app/services/SettingsStore.ts index 1724398da..97e54502f 100644 --- a/client/app/services/SettingsStore.ts +++ b/client/app/services/SettingsStore.ts @@ -2,10 +2,16 @@ import { Store } from "pullstate"; interface SettingsInterface { isDarkMode: boolean; + displayName: string, + profilePicIndex: number, + profileColor: string, } export const SettingStore = new Store({ - isDarkMode: false, + isDarkMode: false, // TODO: isDarkMode not implemented, part of different issue from other three variables + displayName: "Display Name", + profilePicIndex: 0, + profileColor: "#1199ff", }); export const toggleTheme = async () => { @@ -13,3 +19,21 @@ export const toggleTheme = async () => { store.isDarkMode = !store.isDarkMode; }); }; + +export const changeName = async (name: string) => { + SettingStore.update((store) => { + store.displayName = name; + }); +}; + +export const changeProfileIndex = async (index: number) => { + SettingStore.update((store) => { + store.profilePicIndex = index; + }); +}; + +export const changeProfileColor = async (color: string) => { + SettingStore.update((store) => { + store.profileColor = color; + }); +}; diff --git a/client/app/styles/icons.ts b/client/app/styles/icons.ts new file mode 100644 index 000000000..647d13a8c --- /dev/null +++ b/client/app/styles/icons.ts @@ -0,0 +1,11 @@ +// Container for all icons in application, externalized for easier access +export const icons = [ + require("../../assets/icons/user/face_01.png"), + require("../../assets/icons/user/face_02.png"), + require("../../assets/icons/user/face_03.png"), + require("../../assets/icons/user/face_04.png"), + require("../../assets/icons/user/face_05.png"), + require("../../assets/icons/user/face_06.png"), + require("../../assets/icons/user/face_07.png"), + require("../../assets/icons/user/fake_pfp.jpg"), +]; \ No newline at end of file diff --git a/client/package-lock.json b/client/package-lock.json index 080fb7ba6..63544e0e2 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -23,6 +23,7 @@ "expo-linking": "^6.3.1", "expo-location": "^17.0.1", "expo-router": "^3.5.23", + "expo-splash-screen": "~0.27.6", "expo-status-bar": "^1.12.1", "expo-system-ui": "^3.0.7", "pullstate": "^1.25.0", @@ -33,11 +34,13 @@ "react-native-gesture-handler": "~2.16.1", "react-native-safe-area-context": "4.10.5", "react-native-screens": "3.31.1", + "react-native-svg": "^15.7.1", "socket.io-client": "^4.7.5", "typescript": "~5.3.3" }, "devDependencies": { "@types/react": "~18.2.45", + "@types/react-native": "^0.73.0", "eslint": "^8.57.0", "eslint-config-expo": "^7.0.0", "jest": "^29.2.1", @@ -7343,6 +7346,16 @@ "csstype": "^3.0.2" } }, + "node_modules/@types/react-native": { + "version": "0.73.0", + "resolved": "https://registry.npmjs.org/@types/react-native/-/react-native-0.73.0.tgz", + "integrity": "sha512-6ZRPQrYM72qYKGWidEttRe6M5DZBEV5F+MHMHqd4TTYx0tfkcdrUFGdef6CCxY0jXU7wldvd/zA/b0A/kTeJmA==", + "deprecated": "This is a stub types definition. react-native provides its own type definitions, so you do not need this installed.", + "dev": true, + "dependencies": { + "react-native": "*" + } + }, "node_modules/@types/stack-utils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", @@ -8409,8 +8422,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/bplist-creator": { "version": "0.0.7", @@ -9214,7 +9226,6 @@ "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "license": "BSD-2-Clause", - "peer": true, "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", @@ -9231,7 +9242,6 @@ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", "license": "MIT", - "peer": true, "dependencies": { "mdn-data": "2.0.14", "source-map": "^0.6.1" @@ -9245,7 +9255,6 @@ "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "license": "BSD-2-Clause", - "peer": true, "engines": { "node": ">= 6" }, @@ -9641,7 +9650,6 @@ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "license": "MIT", - "peer": true, "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", @@ -9661,8 +9669,7 @@ "url": "https://github.com/sponsors/fb55" } ], - "license": "BSD-2-Clause", - "peer": true + "license": "BSD-2-Clause" }, "node_modules/domexception": { "version": "4.0.0", @@ -9691,7 +9698,6 @@ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "license": "BSD-2-Clause", - "peer": true, "dependencies": { "domelementtype": "^2.3.0" }, @@ -9707,7 +9713,6 @@ "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "license": "BSD-2-Clause", - "peer": true, "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", @@ -11045,6 +11050,32 @@ } } }, + "node_modules/expo-router/node_modules/@expo/prebuild-config": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-7.0.6.tgz", + "integrity": "sha512-Hts+iGBaG6OQ+N8IEMMgwQElzJeSTb7iUJ26xADEHkaexsucAK+V52dM8M4ceicvbZR9q8M+ebJEGj0MCNA3dQ==", + "dependencies": { + "@expo/config": "~9.0.0-beta.0", + "@expo/config-plugins": "~8.0.0-beta.0", + "@expo/config-types": "^51.0.0-unreleased", + "@expo/image-utils": "^0.5.0", + "@expo/json-file": "^8.3.0", + "@react-native/normalize-colors": "0.74.84", + "debug": "^4.3.1", + "fs-extra": "^9.0.0", + "resolve-from": "^5.0.0", + "semver": "^7.6.0", + "xml2js": "0.6.0" + }, + "peerDependencies": { + "expo-modules-autolinking": ">=0.8.1" + } + }, + "node_modules/expo-router/node_modules/@react-native/normalize-colors": { + "version": "0.74.84", + "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.74.84.tgz", + "integrity": "sha512-Y5W6x8cC5RuakUcTVUFNAIhUZ/tYpuqHZlRBoAuakrTwVuoNHXfQki8lj1KsYU7rW6e3VWgdEx33AfOQpdNp6A==" + }, "node_modules/expo-router/node_modules/@react-navigation/bottom-tabs": { "version": "6.5.20", "resolved": "https://registry.npmjs.org/@react-navigation/bottom-tabs/-/bottom-tabs-6.5.20.tgz", @@ -11062,7 +11093,7 @@ "react-native-screens": ">= 3.0.0" } }, - "node_modules/expo-splash-screen": { + "node_modules/expo-router/node_modules/expo-splash-screen": { "version": "0.27.5", "resolved": "https://registry.npmjs.org/expo-splash-screen/-/expo-splash-screen-0.27.5.tgz", "integrity": "sha512-9rdZuLkFCfgJBxrheUsOEOIW6Rp+9NVlpSE0hgXQwbTCLTncf00IHSE8/L2NbFyeDLNjof1yZBppaV7tXHRUzA==", @@ -11073,33 +11104,7 @@ "expo": "*" } }, - "node_modules/expo-splash-screen/node_modules/@expo/prebuild-config": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-7.0.6.tgz", - "integrity": "sha512-Hts+iGBaG6OQ+N8IEMMgwQElzJeSTb7iUJ26xADEHkaexsucAK+V52dM8M4ceicvbZR9q8M+ebJEGj0MCNA3dQ==", - "dependencies": { - "@expo/config": "~9.0.0-beta.0", - "@expo/config-plugins": "~8.0.0-beta.0", - "@expo/config-types": "^51.0.0-unreleased", - "@expo/image-utils": "^0.5.0", - "@expo/json-file": "^8.3.0", - "@react-native/normalize-colors": "0.74.84", - "debug": "^4.3.1", - "fs-extra": "^9.0.0", - "resolve-from": "^5.0.0", - "semver": "^7.6.0", - "xml2js": "0.6.0" - }, - "peerDependencies": { - "expo-modules-autolinking": ">=0.8.1" - } - }, - "node_modules/expo-splash-screen/node_modules/@react-native/normalize-colors": { - "version": "0.74.84", - "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.74.84.tgz", - "integrity": "sha512-Y5W6x8cC5RuakUcTVUFNAIhUZ/tYpuqHZlRBoAuakrTwVuoNHXfQki8lj1KsYU7rW6e3VWgdEx33AfOQpdNp6A==" - }, - "node_modules/expo-splash-screen/node_modules/fs-extra": { + "node_modules/expo-router/node_modules/fs-extra": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", @@ -11113,7 +11118,7 @@ "node": ">=10" } }, - "node_modules/expo-splash-screen/node_modules/semver": { + "node_modules/expo-router/node_modules/semver": { "version": "7.6.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", @@ -11124,7 +11129,7 @@ "node": ">=10" } }, - "node_modules/expo-splash-screen/node_modules/universalify": { + "node_modules/expo-router/node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", @@ -11132,6 +11137,17 @@ "node": ">= 10.0.0" } }, + "node_modules/expo-splash-screen": { + "version": "0.27.6", + "resolved": "https://registry.npmjs.org/expo-splash-screen/-/expo-splash-screen-0.27.6.tgz", + "integrity": "sha512-joUwZQS48k3VMnucQ0Y8Dle1t1FyIvluQA4kjuPx2x7l2dRrfctbo34ahTnC0p1o2go5oN2iEnSTOElY4wRQHw==", + "dependencies": { + "@expo/prebuild-config": "7.0.8" + }, + "peerDependencies": { + "expo": "*" + } + }, "node_modules/expo-status-bar": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/expo-status-bar/-/expo-status-bar-1.12.1.tgz", @@ -15775,8 +15791,7 @@ "version": "2.0.14", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "license": "CC0-1.0", - "peer": true + "license": "CC0-1.0" }, "node_modules/memoize-one": { "version": "5.2.1", @@ -16612,7 +16627,6 @@ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "license": "BSD-2-Clause", - "peer": true, "dependencies": { "boolbase": "^1.0.0" }, @@ -17697,7 +17711,6 @@ "resolved": "https://registry.npmjs.org/react-native-svg/-/react-native-svg-15.7.1.tgz", "integrity": "sha512-Xc11L4t6/DtmUwrQqHR7S45Qy3cIWpcfGlmEatVeZ9c1N8eAK79heJmGRgCOVrXESrrLEHfP/AYGf0BGyrvV6A==", "license": "MIT", - "peer": true, "dependencies": { "css-select": "^5.1.0", "css-tree": "^1.1.3", From 3495fbf15bd93218f24e12617935098c744d1f70 Mon Sep 17 00:00:00 2001 From: Nqnt41 Date: Thu, 14 Nov 2024 17:32:19 -0500 Subject: [PATCH 2/3] Render current-user profile picture/display name in chat screen (290) Added changes that should allow different users to render separate profile information within chat messages. --- client/app/components/chat/ChatMessage.tsx | 12 ++++++------ client/app/components/chat/MessageChannel.tsx | 2 ++ client/app/screens/chat/ChatScreen.tsx | 12 +++++++----- client/app/types/Message.ts | 2 ++ client/app/types/Props.ts | 2 ++ server/.DS_Store | Bin 0 -> 6148 bytes server/src/.DS_Store | Bin 0 -> 6148 bytes 7 files changed, 19 insertions(+), 11 deletions(-) create mode 100644 server/.DS_Store create mode 100644 server/src/.DS_Store diff --git a/client/app/components/chat/ChatMessage.tsx b/client/app/components/chat/ChatMessage.tsx index 8e208b380..c27491f7b 100644 --- a/client/app/components/chat/ChatMessage.tsx +++ b/client/app/components/chat/ChatMessage.tsx @@ -6,11 +6,11 @@ import { MessageProps } from "../../types/Props"; import { SettingStore } from "../../services/SettingsStore" import { icons } from "../../styles/icons" -const Message: React.FC = ({ messageContent, time, author }) => { +const Message: React.FC = ({ messageContent, time, author, profilePicIndex , profileColor }) => { // Import textSettings from useSettings const textSettings = useSettings(); // Import current settings from SettingStore container - const profileSettings = SettingStore.useState(); + //const profileSettings = SettingStore.useState(); const currDay = new Date(Date.now()).toLocaleDateString([], { weekday: "long", @@ -32,13 +32,13 @@ const Message: React.FC = ({ messageContent, time, author }) => { - {profileSettings.displayName} + {author} = ({ messages }) => { )} diff --git a/client/app/screens/chat/ChatScreen.tsx b/client/app/screens/chat/ChatScreen.tsx index d39d48ce2..43bb6e1b1 100644 --- a/client/app/screens/chat/ChatScreen.tsx +++ b/client/app/screens/chat/ChatScreen.tsx @@ -16,15 +16,15 @@ import { useSocket } from "../../contexts/SocketContext"; import { AuthStore } from "../../services/AuthStore"; import { Message } from "../../types/Message"; import { useState, useEffect } from "react"; -import { useUser } from "@app/contexts/UserContext"; +import { SettingStore } from "../../services/SettingsStore" const ChatScreen = () => { - const settings = useSettings(); + const settings = useSettings() + const profileSettings = SettingStore.useState(); const screenHeight = Dimensions.get("window").height; const keyboardBehavior = Platform.OS === "ios" ? "padding" : undefined; const socket = useSocket(); const location = useLocation(); - const user = useUser(); const userAuth = AuthStore.useState(); // Note: To prevent complexity, all user information is grabbed from different contexts and services. If we wanted most information inside of UserContext, we would have to import contexts within contexts and have state change as certain things mount, which could cause errors that are difficult to pinpoint. @@ -54,7 +54,9 @@ const ChatScreen = () => { const newMessage: Message = { author: { uid: String(userAuth.userAuthInfo?.uid), - displayName: String(user?.displayName), + displayName: profileSettings.displayName, + profilePicIndex: profileSettings.profilePicIndex, + profileColor: profileSettings.profileColor, }, msgId: Crypto.randomUUID(), msgContent: messageContent.trim(), @@ -76,12 +78,12 @@ const ChatScreen = () => { setMessageContent(""); } }; - return ( 3!wF{B z7OGu(1%!4bdt!TM?Hwy|Ohl%)OizhgM6`>-7&TCRV?54f!)mUl2{atzGA}3Nyd0y= z0o7CiRp4(c!0&EEU7AusEC2m9?-=WTh)EI+_+@lM4=5S@OPbTv=hU)*b3kJnp-d?U zdjd{D*TV18EiHUDodxV2FqiPoDfK;TZ-Hmqi#^1AkC=Bx_ux)3^DK-&uR(-ESr;;r z6)%7t;(EeaBIgC7V8xt)zZP?XNY86JHAR~gtRdztDMb#viXhwid9Z>uRy)Fccc?S? zcfcy8y=~^>AVM>Uu#NW=@ao8GP7^;b*^QUAyqwo+Ffa15;GM=-pY}zYjh)@pNfcj? z2eR5PD!{u3+ugIMwJM+rr~+RK@b@7`VN4uW7Uk1{O0EFF2;E|MmS2Bh%pJhQVPz3L zFk`7eOEvC_VcgBZSUScN=U-X0bTTqC;<%ZOyP+6&@i4KtlSwRUtqQ0Dz5;dIZ1MSj zvHkw~=0TcBH{T@q10TglC}J3k`2mJ5Pc2-Hlm5BXpr^25n=3878>LlIZpq6p*z$ z$1SE@u}5sK-xPhW;n)R+TKx$1}6?+H6&tCjZof*$)w zS`U{A|AZr}vC@5&a^Di}v9b2F`gxf7JX%y`T|JP&oeXK?m3qw5k+p=eIq!~+YL1dK z60LS4K9UH2y14?bfGhCJ3dl)E%gzivbp>1jS75DxoDVr&u!z_g>e0bOp8&)*i`AHy z-$RMXBNh=GL)OrOg%T|^#3x3uaF*whS43g~M4J?OnP5=M^ literal 0 HcmV?d00001 From c9ec8efbb63f64370bbfe77ff8246b4d662cabeb Mon Sep 17 00:00:00 2001 From: Nqnt41 Date: Thu, 14 Nov 2024 18:17:10 -0500 Subject: [PATCH 3/3] Fixing merge conflicts with main --- client/app/screens/chat/ChatScreen.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/client/app/screens/chat/ChatScreen.tsx b/client/app/screens/chat/ChatScreen.tsx index 43bb6e1b1..50a4904ad 100644 --- a/client/app/screens/chat/ChatScreen.tsx +++ b/client/app/screens/chat/ChatScreen.tsx @@ -17,6 +17,7 @@ import { AuthStore } from "../../services/AuthStore"; import { Message } from "../../types/Message"; import { useState, useEffect } from "react"; import { SettingStore } from "../../services/SettingsStore" +import React from "react"; const ChatScreen = () => { const settings = useSettings()