@@ -2,108 +2,16 @@ import * as vscode from "vscode";
2
2
// Allow using JSX within this file by overriding our own createElement function
3
3
import React from "../utils/FakeReact" ;
4
4
5
- import Messages , {
6
- MessageType ,
7
- MessageTypeNames ,
8
- sendToFrontend ,
9
- } from "../utils/messages" ;
5
+ import { MessageType , sendToFrontend } from "../utils/messages" ;
10
6
import { LANGUAGES } from "../utils/languages" ;
11
7
import { setWebviewContent } from "../utils/webview" ;
12
8
import config from "../utils/config" ;
13
- import { Editor } from "../utils/editor" ;
14
9
import { FRONTEND_ELEMENT_ID } from "../constants" ;
15
- import { client , SOURCE_ACADEMY_ICON_URI } from "../extension" ;
16
10
import _ from "lodash" ;
17
- import { treeDataProvider } from "../treeview " ;
18
- import { codeRemovePrepend , getNumPrependLines } from "../utils/editorUtils " ;
11
+ import { MessageHandler } from "../utils/messageHandler " ;
12
+ import { SOURCE_ACADEMY_ICON_URI } from "../extension " ;
19
13
20
- let panel : vscode . WebviewPanel | null = null ;
21
- // This needs to be a reference to active
22
- // TODO: Fix this ugly code!
23
- export let activeEditor : Editor | null = null ;
24
-
25
- const messageQueue : MessageType [ ] = [ ] ;
26
- let handling = false ;
27
-
28
- // TODO: Remove panel and handling message logic out of the commands/ directory
29
-
30
- async function handleMessage (
31
- context : vscode . ExtensionContext ,
32
- message : MessageType ,
33
- ) {
34
- messageQueue . push ( message ) ;
35
- if ( handling ) {
36
- return ;
37
- }
38
- handling = true ;
39
-
40
- while ( messageQueue . length > 0 ) {
41
- const message = messageQueue . shift ( ) ! ;
42
- console . log ( `${ Date . now ( ) } Beginning handleMessage: ${ message . type } ` ) ;
43
- switch ( message . type ) {
44
- case MessageTypeNames . ExtensionPing :
45
- sendToFrontend ( panel , Messages . ExtensionPong ( null ) ) ;
46
- break ;
47
- case MessageTypeNames . NewEditor :
48
- activeEditor = await Editor . create (
49
- message . workspaceLocation ,
50
- message . assessmentName ,
51
- message . questionId ,
52
- message . prepend ,
53
- message . initialCode ,
54
- ) ;
55
- activeEditor . uri ;
56
- const info = context . globalState . get ( "info" ) ?? { } ;
57
- if ( activeEditor . uri ) {
58
- // TODO: Write our own wrapper to set nested keys easily, removing lodash
59
- _ . set ( info , `["${ activeEditor . uri } "].chapter` , message . chapter ?? 1 ) ;
60
- const nPrependLines = getNumPrependLines ( message . prepend ) ;
61
- _ . set ( info , `["${ activeEditor . uri } "].prepend` , nPrependLines ) ;
62
- context . globalState . update ( "info" , info ) ;
63
- client . sendRequest ( "source/publishInfo" , info ) ;
64
- }
65
-
66
- panel ?. reveal ( vscode . ViewColumn . Two ) ;
67
- console . log (
68
- `EXTENSION: NewEditor: activeEditor set to ${ activeEditor . assessmentName } _${ activeEditor . questionId } ` ,
69
- ) ;
70
- activeEditor . onChange ( ( editor ) => {
71
- const workspaceLocation = editor . workspaceLocation ;
72
- const code = editor . getText ( ) ;
73
- if ( ! code ) {
74
- return ;
75
- }
76
- if ( editor !== activeEditor ) {
77
- console . log (
78
- `EXTENSION: Editor ${ editor . assessmentName } _${ editor . questionId } is no longer active, skipping onChange` ,
79
- ) ;
80
- }
81
- const message = Messages . Text (
82
- workspaceLocation ,
83
- codeRemovePrepend ( code ) ,
84
- ) ;
85
- sendToFrontend ( panel , message ) ;
86
- } ) ;
87
- break ;
88
- // case MessageTypeNames.Text:
89
- // if (!activeEditor) {
90
- // console.log("ERROR: activeEditor is not set");
91
- // break;
92
- // }
93
- // activeEditor.replace(message.code, "Text");
94
- // break;
95
- case MessageTypeNames . NotifyAssessmentsOverview :
96
- const { assessmentOverviews, courseId } = message ;
97
- context . globalState . update ( "assessmentOverviews" , assessmentOverviews ) ;
98
- context . globalState . update ( "courseId" , courseId ) ;
99
- treeDataProvider . refresh ( ) ;
100
- break ;
101
- }
102
- console . log ( `${ Date . now ( ) } Finish handleMessage: ${ message . type } ` ) ;
103
- }
104
-
105
- handling = false ;
106
- }
14
+ let messageHandler = MessageHandler . getInstance ( ) ;
107
15
108
16
export async function showPanel (
109
17
context : vscode . ExtensionContext ,
@@ -117,7 +25,7 @@ export async function showPanel(
117
25
// Get a reference to the active editor (before the focus is switched to our newly created webview)
118
26
// firstEditor = vscode.window.activeTextEditor!;
119
27
120
- panel = vscode . window . createWebviewPanel (
28
+ messageHandler . panel = vscode . window . createWebviewPanel (
121
29
"source-academy-panel" ,
122
30
"Source Academy" ,
123
31
vscode . ViewColumn . Beside ,
@@ -127,18 +35,17 @@ export async function showPanel(
127
35
} ,
128
36
) ;
129
37
130
- panel . webview . onDidReceiveMessage (
131
- ( message : MessageType ) => handleMessage ( context , message ) ,
38
+ messageHandler . panel . webview . onDidReceiveMessage (
39
+ ( message : MessageType ) => messageHandler . handleMessage ( context , message ) ,
132
40
undefined ,
133
41
context . subscriptions ,
134
42
) ;
135
43
136
44
const iframeUrl = new URL ( route ?? "/playground" , config . frontendBaseUrl )
137
45
. href ;
138
46
139
- // equivalent to panel.webview.html = ...
140
47
setWebviewContent (
141
- panel ,
48
+ messageHandler . panel ,
142
49
context ,
143
50
// NOTE: This is not React code, but our FakeReact!
144
51
< div
@@ -158,16 +65,16 @@ export async function showPanel(
158
65
</ div > ,
159
66
) ;
160
67
161
- panel . iconPath = SOURCE_ACADEMY_ICON_URI ;
68
+ messageHandler . panel . iconPath = SOURCE_ACADEMY_ICON_URI ;
162
69
}
163
70
164
- // TODO: Move this to a util file
165
71
export async function sendToFrontendWrapped ( message : MessageType ) {
72
+ sendToFrontend ( messageHandler . panel , message ) ;
166
73
// TODO: This returning of status code shouldn't be necessary after refactor
167
- if ( ! panel ) {
74
+ if ( ! messageHandler . panel ) {
168
75
console . error ( "ERROR: panel is not set" ) ;
169
76
return false ;
170
77
}
171
- sendToFrontend ( panel , message ) ;
78
+ sendToFrontend ( messageHandler . panel , message ) ;
172
79
return true ;
173
80
}
0 commit comments