@@ -2,6 +2,7 @@ import { createStore, StateCreator, StoreApi } from "zustand";
22import { devtools } from "zustand/middleware" ;
33import produce from "immer" ;
44import { createContext } from "react" ;
5+ import { MonacoCompletionProvider } from "../monacoCompletionProvider" ;
56
67import {
78 normalize ,
@@ -22,6 +23,8 @@ import { addAwarenessStyle } from "../styles";
2223import { Annotation } from "../parser" ;
2324import { MyState , Pod } from "." ;
2425
26+ declare type Monaco = typeof import ( "monaco-editor" ) ;
27+
2528let serverURL ;
2629if ( window . location . protocol === "http:" ) {
2730 serverURL = `ws://${ window . location . host } /socket` ;
@@ -46,6 +49,7 @@ export interface RepoStateSlice {
4649 clients : Map < string , any > ;
4750 user : any ;
4851 ydoc : Doc ;
52+ monaco : Monaco | null ;
4953 collaborators : any [ ] ;
5054 addCollaborator : ( client : ApolloClient < object > , email : string ) => any ;
5155 deleteCollaborator : ( client : ApolloClient < object > , id : string ) => any ;
@@ -74,6 +78,12 @@ export interface RepoStateSlice {
7478 yjsConnecting : boolean ;
7579 connectYjs : ( ) => void ;
7680 disconnectYjs : ( ) => void ;
81+ setMonaco : ( monaco : Monaco ) => void ;
82+ autoCompletion : boolean ;
83+ unregisterCompletionHandler : null | ( ( ) => void ) ;
84+ registerCompletion : ( ) => void ;
85+ unregisterCompletion : ( ) => void ;
86+ flipAutoCompletion : ( ) => void ;
7787}
7888
7989export const createRepoStateSlice : StateCreator <
@@ -96,7 +106,9 @@ export const createRepoStateSlice: StateCreator<
96106 currentEditor : null ,
97107 //TODO: all presence information are now saved in clients map for future usage. create a modern UI to show those information from clients (e.g., online users)
98108 clients : new Map ( ) ,
99-
109+ monaco : null ,
110+ autoCompletion : false ,
111+ unregisterCompletionHandler : null ,
100112 loadError : null ,
101113 role : "GUEST" ,
102114 collaborators : [ ] ,
@@ -283,6 +295,64 @@ export const createRepoStateSlice: StateCreator<
283295 state . ydoc . destroy ( ) ;
284296 } )
285297 ) ,
298+ setMonaco : ( monaco ) => {
299+ set (
300+ produce ( ( state ) => {
301+ if ( state . monaco === null ) {
302+ state . monaco = monaco ;
303+ console . log ( "set monaco as" , monaco ) ;
304+ if ( state . autoCompletion ) {
305+ state . registerCompletion ( ) ;
306+ }
307+ }
308+ } )
309+ ) ;
310+ } ,
311+ registerCompletion : ( ) => {
312+ set (
313+ produce ( ( state ) => {
314+ if ( state . monaco && ! state . unregisterCompletionHandler ) {
315+ const completionProvider = new MonacoCompletionProvider ( ) ;
316+ const { dispose } =
317+ state . monaco . languages . registerCompletionItemProvider (
318+ "codeium" ,
319+ completionProvider
320+ ) ;
321+ console . log ( "register completion" , dispose ) ;
322+ state . unregisterCompletionHandler = dispose ;
323+ state . monaco . editor . registerCommand (
324+ "codeium.acceptCompletion" ,
325+ ( accessor , args ) => {
326+ console . log ( "acceptCompletion" , args ) ;
327+ }
328+ ) ;
329+ }
330+ } )
331+ ) ;
332+ } ,
333+
334+ unregisterCompletion : ( ) =>
335+ set (
336+ produce ( ( state ) => {
337+ if ( state . unregisterCompletionHandler ) {
338+ console . log ( "unregister" , state . unregisterCompletionHandler ) ;
339+ state . unregisterCompletionHandler ( ) ;
340+ state . unregisterCompletionHandler = null ;
341+ }
342+ } )
343+ ) ,
344+
345+ flipAutoCompletion : ( ) =>
346+ set (
347+ produce ( ( state ) => {
348+ state . autoCompletion = ! state . autoCompletion ;
349+ if ( state . autoCompletion ) {
350+ state . registerCompletion ( ) ;
351+ } else {
352+ state . unregisterCompletion ( ) ;
353+ }
354+ } )
355+ ) ,
286356} ) ;
287357
288358function loadRepo ( set , get ) {
0 commit comments