diff --git a/src/excalidraw-app/collab/Collab.tsx b/src/excalidraw-app/collab/Collab.tsx index 8e144cd2b..cb87a4bb1 100644 --- a/src/excalidraw-app/collab/Collab.tsx +++ b/src/excalidraw-app/collab/Collab.tsx @@ -47,8 +47,8 @@ import { saveToFirebase, } from "../data/firebase"; import { - importUsernameFromLocalStorage, - saveUsernameToLocalStorage, + importUsernameAndIdFromLocalStorage, + saveUsernameAndIdToLocalStorage, } from "../data/localStorage"; import Portal from "./Portal"; import RoomDialog from "./RoomDialog"; @@ -124,11 +124,14 @@ class Collab extends PureComponent { constructor(props: Props) { super(props); + + const { username, userId } = importUsernameAndIdFromLocalStorage() || {}; + this.state = { errorMessage: "", - username: importUsernameFromLocalStorage() || "", + username: username || "", + userId: userId || "", activeRoomLink: "", - userId: nanoid(), }; this.portal = new Portal(this); this.fileManager = new FileManager({ @@ -524,6 +527,11 @@ class Collab extends PureComponent { }); } + if (!this.state.userId) { + const userId = nanoid(); + this.onUserIdChange(userId); + } + if (this.portal.socket) { return null; } @@ -970,7 +978,12 @@ class Collab extends PureComponent { onUsernameChange = (username: string) => { this.setUsername(username); - saveUsernameToLocalStorage(username); + saveUsernameAndIdToLocalStorage(username, this.state.userId); + }; + + onUserIdChange = (userId: string) => { + this.setState({ userId }); + saveUsernameAndIdToLocalStorage(this.state.username, userId); }; render() { diff --git a/src/excalidraw-app/data/localStorage.ts b/src/excalidraw-app/data/localStorage.ts index 6902052bd..fe2bfa85f 100644 --- a/src/excalidraw-app/data/localStorage.ts +++ b/src/excalidraw-app/data/localStorage.ts @@ -8,11 +8,14 @@ import { clearElementsForLocalStorage } from "../../element"; import { STORAGE_KEYS } from "../app_constants"; import { ImportedDataState } from "../../data/types"; -export const saveUsernameToLocalStorage = (username: string) => { +export const saveUsernameAndIdToLocalStorage = ( + username: string, + userId: string, +) => { try { localStorage.setItem( STORAGE_KEYS.LOCAL_STORAGE_COLLAB, - JSON.stringify({ username }), + JSON.stringify({ username, userId }), ); } catch (error: any) { // Unable to access window.localStorage @@ -20,11 +23,14 @@ export const saveUsernameToLocalStorage = (username: string) => { } }; -export const importUsernameFromLocalStorage = (): string | null => { +export const importUsernameAndIdFromLocalStorage = (): { + username: string; + userId: string; +} | null => { try { const data = localStorage.getItem(STORAGE_KEYS.LOCAL_STORAGE_COLLAB); if (data) { - return JSON.parse(data).username; + return JSON.parse(data); } } catch (error: any) { // Unable to access localStorage diff --git a/src/excalidraw-app/index.tsx b/src/excalidraw-app/index.tsx index 860437f3c..4fe382a80 100644 --- a/src/excalidraw-app/index.tsx +++ b/src/excalidraw-app/index.tsx @@ -65,7 +65,7 @@ import { import { getLibraryItemsFromStorage, importFromLocalStorage, - importUsernameFromLocalStorage, + importUsernameAndIdFromLocalStorage, } from "./data/localStorage"; import CustomStats from "./CustomStats"; import { restore, restoreAppState, RestoredDataState } from "../data/restore"; @@ -411,7 +411,8 @@ const ExcalidrawWrapper = () => { // don't sync if local state is newer or identical to browser state if (isBrowserStorageStateNewer(STORAGE_KEYS.VERSION_DATA_STATE)) { const localDataState = importFromLocalStorage(); - const username = importUsernameFromLocalStorage(); + const username = + importUsernameAndIdFromLocalStorage()?.username ?? ""; let langCode = languageDetector.detect() || defaultLang.code; if (Array.isArray(langCode)) { langCode = langCode[0];