@@ -25,7 +25,7 @@ import {
25
25
import clsx from 'clsx'
26
26
import type { ApiDocument , ApiWorkspace } from '@briefer/database'
27
27
import { useEnvironmentStatus } from '@/hooks/useEnvironmentStatus'
28
- import { RefObject , useCallback , useMemo } from 'react'
28
+ import { RefObject , useCallback , useMemo , useState } from 'react'
29
29
import {
30
30
ExecutingPythonText ,
31
31
LoadingEnvText ,
@@ -91,19 +91,39 @@ function PythonBlock(props: Props) {
91
91
startedAt : environmentStartedAt ,
92
92
} = useEnvironmentStatus ( props . document . workspaceId )
93
93
94
+ const [ localResultHidden , setLocalResultHidden ] = useState < boolean | null > (
95
+ null
96
+ )
97
+
94
98
const toggleResultHidden = useCallback ( ( ) => {
95
- props . block . doc ?. transact ( ( ) => {
96
- const currentIsResultHidden = props . block . getAttribute ( 'isResultHidden' )
97
- props . block . setAttribute ( 'isResultHidden' , ! currentIsResultHidden )
98
- } )
99
- } , [ props . block ] )
99
+ if ( props . isEditable ) {
100
+ props . block . doc ?. transact ( ( ) => {
101
+ const currentIsResultHidden = props . block . getAttribute ( 'isResultHidden' )
102
+ props . block . setAttribute ( 'isResultHidden' , ! currentIsResultHidden )
103
+ } )
104
+ } else {
105
+ setLocalResultHidden ( ( prev ) => {
106
+ const blockResultHidden = props . block . getAttribute ( 'isResultHidden' )
107
+ return prev === null ? ! blockResultHidden : ! prev
108
+ } )
109
+ }
110
+ } , [ props . block , props . isEditable ] )
111
+
112
+ const [ localCodeHidden , setLocalCodeHidden ] = useState < boolean | null > ( null )
100
113
101
114
const toggleCodeHidden = useCallback ( ( ) => {
102
- props . block . doc ?. transact ( ( ) => {
103
- const currentIsCodeHidden = props . block . getAttribute ( 'isCodeHidden' )
104
- props . block . setAttribute ( 'isCodeHidden' , ! currentIsCodeHidden )
105
- } )
106
- } , [ props . block ] )
115
+ if ( props . isEditable ) {
116
+ props . block . doc ?. transact ( ( ) => {
117
+ const currentIsCodeHidden = props . block . getAttribute ( 'isCodeHidden' )
118
+ props . block . setAttribute ( 'isCodeHidden' , ! currentIsCodeHidden )
119
+ } )
120
+ } else {
121
+ setLocalCodeHidden ( ( prev ) => {
122
+ const blockCodeHidden = props . block . getAttribute ( 'isCodeHidden' )
123
+ return prev === null ? ! blockCodeHidden : ! prev
124
+ } )
125
+ }
126
+ } , [ props . block , props . isEditable ] )
107
127
108
128
const executions = useBlockExecutions (
109
129
props . executionQueue ,
@@ -189,12 +209,34 @@ function PythonBlock(props: Props) {
189
209
const startQueryTime = props . block . getAttribute ( 'startQueryTime' )
190
210
const lastQueryTime = props . block . getAttribute ( 'lastQueryTime' )
191
211
212
+ const isCodeHidden =
213
+ ( ! props . dashboardMode || ! dashboardModeHasControls ( props . dashboardMode ) ) &&
214
+ ( props . isEditable
215
+ ? props . block . getAttribute ( 'isCodeHidden' ) ?? false
216
+ : localCodeHidden === null
217
+ ? props . block . getAttribute ( 'isCodeHidden' ) ?? false
218
+ : localCodeHidden )
219
+
220
+ const isResultHidden =
221
+ ( ! props . dashboardMode || ! dashboardModeHasControls ( props . dashboardMode ) ) &&
222
+ ( props . isEditable
223
+ ? props . block . getAttribute ( 'isResultHidden' ) ?? false
224
+ : localResultHidden === null
225
+ ? props . block . getAttribute ( 'isResultHidden' ) ?? false
226
+ : localResultHidden )
227
+
192
228
const queryStatusText : JSX . Element | null = useMemo ( ( ) => {
193
229
switch ( status ) {
194
230
case 'idle' :
195
231
case 'completed' :
196
232
if ( source ?. toJSON ( ) === lastQuery && lastQueryTime ) {
197
- return < PythonSucceededText lastExecutionTime = { lastQueryTime } />
233
+ return (
234
+ < PythonSucceededText
235
+ lastExecutionTime = { lastQueryTime }
236
+ isResultHidden = { isResultHidden ?? false }
237
+ onToggleResultHidden = { toggleResultHidden }
238
+ />
239
+ )
198
240
}
199
241
return null
200
242
case 'running' :
@@ -217,15 +259,10 @@ function PythonBlock(props: Props) {
217
259
lastQueryTime ,
218
260
source . toJSON ( ) ,
219
261
envStatus ,
262
+ isResultHidden ,
263
+ toggleResultHidden ,
220
264
] )
221
265
222
- const isCodeHidden =
223
- props . block . getAttribute ( 'isCodeHidden' ) &&
224
- ( ! props . dashboardMode || ! dashboardModeHasControls ( props . dashboardMode ) )
225
- const isResultHidden =
226
- props . block . getAttribute ( 'isResultHidden' ) &&
227
- ( ! props . dashboardMode || ! dashboardModeHasControls ( props . dashboardMode ) )
228
-
229
266
const { title } = getBaseAttributes ( props . block )
230
267
const onChangeTitle = useCallback (
231
268
( e : React . ChangeEvent < HTMLInputElement > ) => {
@@ -457,25 +494,17 @@ function PythonBlock(props: Props) {
457
494
< div className = "flex items-center justify-between px-3 pr-4 gap-x-4 font-sans h-12" >
458
495
< div className = "select-none text-gray-300 text-xs flex items-center w-full h-full gap-x-1.5" >
459
496
< div className = "relative group w-4 h-4" >
460
- < CommandLineIcon
461
- className = { clsx (
462
- 'absolute inset-0 h-4 w-4 text-gray-400' ,
463
- props . isEditable &&
464
- 'group-hover:opacity-0 transition-opacity'
497
+ < CommandLineIcon className = "absolute inset-0 h-4 w-4 text-gray-400 group-hover:opacity-0 transition-opacity" />
498
+ < button
499
+ className = "absolute inset-0 opacity-0 group-hover:opacity-100 transition-opacity"
500
+ onClick = { toggleCodeHidden }
501
+ >
502
+ { isCodeHidden ? (
503
+ < ChevronRightIcon className = "h-4 w-4" />
504
+ ) : (
505
+ < ChevronDownIcon className = "h-4 w-4" />
465
506
) }
466
- />
467
- { props . isEditable && (
468
- < button
469
- className = "absolute inset-0 opacity-0 group-hover:opacity-100 transition-opacity"
470
- onClick = { toggleCodeHidden }
471
- >
472
- { isCodeHidden ? (
473
- < ChevronRightIcon className = "h-4 w-4" />
474
- ) : (
475
- < ChevronDownIcon className = "h-4 w-4" />
476
- ) }
477
- </ button >
478
- ) }
507
+ </ button >
479
508
</ div >
480
509
< input
481
510
type = "text"
0 commit comments