diff --git a/demo/src/App.tsx b/demo/src/App.tsx index d824ad99..9c79e7b8 100644 --- a/demo/src/App.tsx +++ b/demo/src/App.tsx @@ -1,6 +1,6 @@ -import { useContext, useEffect } from 'react'; +import { useContext, useEffect, useState } from 'react'; -import { Header, SlideMenu, SpacesContext, CurrentSlide, AblySvg, slides } from './components'; +import { Header, SlideMenu, SpacesContext, CurrentSlide, AblySvg, slides, Modal } from './components'; import { getRandomName, getRandomColor } from './utils'; import { useMembers } from './hooks'; import { PreviewProvider } from './components/PreviewContext.tsx'; @@ -8,6 +8,7 @@ import { PreviewProvider } from './components/PreviewContext.tsx'; const App = () => { const space = useContext(SpacesContext); const { self, others } = useMembers(); + const [isModalVisible, setModalIsVisible] = useState(false); useEffect(() => { if (!space || self?.profileData.name) return; @@ -16,6 +17,7 @@ const App = () => { const name = getRandomName(); await space.enter({ name, color: getRandomColor() }); await space.locations.set({ slide: `${0}`, element: null }); + setModalIsVisible(true); }; enter(); @@ -47,6 +49,11 @@ const App = () => { + ); }; diff --git a/demo/src/components/Avatar.tsx b/demo/src/components/Avatar.tsx index d079b157..cb4a0252 100644 --- a/demo/src/components/Avatar.tsx +++ b/demo/src/components/Avatar.tsx @@ -20,7 +20,7 @@ export const Avatar = ({ }: AvatarProps) => { const initials = profileData.name .split(' ') - .map((n: string) => n[0]) + .map((n: string) => n[0].toUpperCase()) .join(''); return ( diff --git a/demo/src/components/Modal.tsx b/demo/src/components/Modal.tsx new file mode 100644 index 00000000..f6a56c3f --- /dev/null +++ b/demo/src/components/Modal.tsx @@ -0,0 +1,55 @@ +import { FormEvent, useContext, useRef } from 'react'; +import cn from 'classnames'; + +import { SpacesContext } from '.'; +import { Member } from '../utils/types'; + +interface Props { + self?: Member; + isVisible?: boolean; + setIsVisible?: (isVisible: boolean) => void; +} + +export const Modal = ({ isVisible = false, setIsVisible, self }: Props) => { + const space = useContext(SpacesContext); + const inputRef = useRef(null); + + const handleSubmit = (e: FormEvent) => { + e.preventDefault(); + + if (!space || !setIsVisible) return; + + space.updateProfileData((profileData) => ({ ...profileData, name: inputRef.current?.value })); + setIsVisible(false); + }; + + return ( +
+
+

Enter your name

+ + +
+
+ ); +}; diff --git a/demo/src/components/index.ts b/demo/src/components/index.ts index e4957dd2..28b16ad4 100644 --- a/demo/src/components/index.ts +++ b/demo/src/components/index.ts @@ -5,6 +5,7 @@ export * from './CurrentSlide'; export * from './Cursors'; export * from './Header'; export * from './Image'; +export * from './Modal'; export * from './Paragraph'; export * from './SlideMenu'; export * from './SlidePreview'; diff --git a/demo/src/hooks/useMembers.ts b/demo/src/hooks/useMembers.ts index 0a437728..47905d24 100644 --- a/demo/src/hooks/useMembers.ts +++ b/demo/src/hooks/useMembers.ts @@ -50,7 +50,6 @@ export const useMembers: () => { self?: Member; others: Member[]; members: Membe setMembers(initMembers); setOthers(membersToOthers(initMembers, initSelf)); } - space.subscribe('update', handler); };