1515 <td class =" p-3 border border-gray-300" >{{ room.states }}</td >
1616 <td class =" p-3 border border-gray-300 text-center" >
1717 <button
18- v-if =" room.status !== 'connected '"
18+ v-if =" room.status === 'disconnected '"
1919 @click =" room.connect()"
2020 class =" border-2 border-black bg-black text-white px-4 py-2 rounded"
2121 >
2222 connect
2323 </button >
24+
2425 <button
25- v-if =" room.status !== 'disconnected '"
26+ v-else- if =" room.status === 'connected '"
2627 @click =" room.disconnect()"
2728 class =" border-2 border-black px-4 py-2 rounded"
2829 >
3435 </div >
3536</template >
3637
37- <script >
38+ <script lang="ts" >
3839import * as Y from ' yjs'
39- // import { WebsocketProvider } from 'y-websocket'
40- import { HocuspocusProvider } from ' @hocuspocus/provider'
40+ import { ref } from ' vue'
41+ import { HocuspocusProvider , StatesArray } from ' @hocuspocus/provider'
42+ // eslint-disable-next-line import/no-extraneous-dependencies
43+ import { awarenessStatesToArray } from ' @hocuspocus/common'
4144
4245class Room {
4346 doc = new Y .Doc ()
4447
4548 name = ' '
4649
47- status = ' disconnected'
50+ status = ref (' disconnected' )
51+
52+ numberOfUsers = ref (0 )
4853
49- states = []
54+ states: StatesArray = []
5055
51- constructor (name ) {
56+ provider: HocuspocusProvider
57+
58+ constructor (name : string ) {
5259 this .name = name
5360 // this.provider = new WebsocketProvider('ws://localhost:1234', this.name, this.doc)
5461 this .provider = new HocuspocusProvider ({
5562 url: ' ws://localhost:1234' ,
5663 document: this .doc ,
5764 name: this .name ,
65+ broadcast: false ,
66+ connect: false ,
67+ preserveConnection: false ,
5868 onStatus : ({ status }) => {
59- this .status = status
69+ this .status . value = status
6070 },
6171 onAwarenessUpdate : ({ states }) => {
6272 this .states = states
73+ this .numberOfUsers .value = awarenessStatesToArray (this .provider .awareness .getStates ()).filter ((state => ' user' in state )).length
74+ },
75+ onDisconnect : () => {
76+ this .states = []
77+ this .numberOfUsers .value = 0
6378 },
6479 })
6580
66- this .provider .setAwarenessField (' user' , { name: ` Jon @ ${ this .name } ` })
67- }
68-
69- get numberOfUsers () {
70- return this .provider .awareness .getStates ().size
7181 }
7282
7383 connect() {
84+ this .provider .setAwarenessField (' user' , { name: ` Jon @ ${this .name } ` })
7485 this .provider .connect ()
7586 }
7687
@@ -86,7 +97,7 @@ class Room {
8697export default {
8798 data() {
8899 return {
89- rooms: [],
100+ rooms: [] as Room [] ,
90101 }
91102 },
92103
0 commit comments