@@ -15,8 +15,8 @@ import {
1515} from 'solid-js' ;
1616import { useParams } from 'solid-app-router' ;
1717import { API , useAppContext } from '../context' ;
18- import createDebounce from '@solid-primitives/debounce ' ;
19- import type { Tab } from '../../src' ;
18+ import { debounce } from '@solid-primitives/scheduled ' ;
19+ import { createTabList , Tab } from '../../src' ;
2020import type { APIRepl } from './home' ;
2121
2222const Repl = lazy ( ( ) => import ( '../../src/components/repl' ) ) ;
@@ -35,35 +35,6 @@ const Repl = lazy(() => import('../../src/components/repl'));
3535 } ,
3636} ;
3737
38- // Custom version of createTabList that allows us to use a resource as the backing signal
39- const createTabList = ( ) => {
40- let sourceSignals : Record < string , [ get : ( ) => string , set : ( value : string ) => string ] > = { } ;
41-
42- const mapTabs = ( tabs : Tab [ ] ) : Tab [ ] => {
43- const oldSignals = sourceSignals ;
44- sourceSignals = { } ;
45-
46- return tabs . map ( ( tab ) => {
47- const id = `${ tab . name } .${ tab . type } ` ;
48- sourceSignals [ id ] = oldSignals [ id ] || createSignal ( tab . source ) ;
49- if ( oldSignals [ id ] ) oldSignals [ id ] [ 1 ] ( tab . source ) ;
50-
51- return {
52- name : tab . name ,
53- type : tab . type ,
54- get source ( ) {
55- return sourceSignals [ id ] [ 0 ] ( ) ;
56- } ,
57- set source ( source : string ) {
58- sourceSignals [ id ] [ 1 ] ( source ) ;
59- } ,
60- } ;
61- } ) ;
62- } ;
63-
64- return mapTabs ;
65- } ;
66-
6738const RenderHeader : ParentComponent = ( props ) => {
6839 onMount ( ( ) => {
6940 const projectName = document . getElementById ( 'project-name' ) ! ;
@@ -86,52 +57,40 @@ export const Edit = (props: { dark: boolean; horizontal: boolean }) => {
8657 const params = useParams ( ) ;
8758 const context = useAppContext ( ) ! ;
8859
89- const tabMapper = ( tabs : Tab [ ] ) => tabs . map ( ( x ) => ( { name : ` ${ x . name } . ${ x . type } ` , content : x . source . split ( '\n' ) } ) ) ;
90- const mapTabs = createTabList ( ) ;
91- const [ resource , { mutate } ] = createResource < { tabs : Tab [ ] ; repl : APIRepl } , string > ( params . repl , async ( repl ) => {
92- let x : APIRepl = await fetch ( `${ API } /repl/${ repl } ` , {
60+ const [ tabs , setTabs ] = createTabList ( [ ] ) ;
61+ const [ current , setCurrent ] = createSignal < string > ( ) ;
62+ const [ resource , { mutate } ] = createResource < APIRepl , string > ( params . repl , async ( repl ) => {
63+ let output : APIRepl = await fetch ( `${ API } /repl/${ repl } ` , {
9364 headers : { authorization : `Bearer ${ context . token } ` } ,
9465 } ) . then ( ( r ) => r . json ( ) ) ;
9566
96- return {
97- repl : x ,
98- tabs : mapTabs (
99- x . files . map ( ( x ) => {
100- let dot = x . name . lastIndexOf ( '.' ) ;
101- return { name : x . name . slice ( 0 , dot ) , type : x . name . slice ( dot + 1 ) , source : x . content . join ( '\n' ) } ;
102- } ) ,
103- ) ,
104- } ;
105- } ) ;
106-
107- const [ current , setCurrent ] = createSignal < string > ( ) ;
108- createEffect ( ( ) => {
109- const myRepl = resource ( ) ;
110- if ( ! myRepl ) return ;
111- setCurrent ( `${ myRepl . tabs [ 0 ] . name } .${ myRepl . tabs [ 0 ] . type } ` ) ;
67+ setCurrent ( output . files [ 0 ] . name ) ;
68+ setTabs (
69+ output . files . map ( ( x ) => {
70+ let dot = x . name . lastIndexOf ( '.' ) ;
71+ return { name : x . name . slice ( 0 , dot ) , type : x . name . slice ( dot + 1 ) , source : x . content . join ( '\n' ) } ;
72+ } ) ,
73+ ) ;
74+ return output ;
11275 } ) ;
11376
114- const tabs = ( ) => resource ( ) ?. tabs || [ ] ;
115- const setTabs = ( tabs : Tab [ ] ) => {
116- if ( resource . latest ) mutate ( { repl : resource . latest . repl , tabs : mapTabs ( tabs ) } ) ;
117- } ;
118-
119- const updateRepl = createDebounce ( ( ) => {
120- const repl = resource ( ) ;
77+ const tabMapper = ( tabs : Tab [ ] ) => tabs . map ( ( x ) => ( { name : `${ x . name } .${ x . type } ` , content : x . source . split ( '\n' ) } ) ) ;
78+ const updateRepl = debounce ( ( ) => {
79+ const repl = resource . latest ;
12180 if ( ! repl ) return ;
122- const tabs = tabMapper ( repl . tabs ) ;
81+ const files = tabMapper ( tabs ( ) ) ;
12382 fetch ( `${ API } /repl/${ params . repl } ` , {
12483 method : 'PUT' ,
12584 headers : {
12685 authorization : `Bearer ${ context . token } ` ,
12786 'Content-Type' : 'application/json' ,
12887 } ,
12988 body : JSON . stringify ( {
130- title : repl . repl . title ,
131- version : repl . repl . version ,
132- public : repl . repl . public ,
133- labels : repl . repl . labels ,
134- files : tabs ,
89+ title : repl . title ,
90+ version : repl . version ,
91+ public : repl . public ,
92+ labels : repl . labels ,
93+ files,
13594 } ) ,
13695 } ) ;
13796 } , 1000 ) ;
@@ -173,7 +132,29 @@ export const Edit = (props: { dark: boolean; horizontal: boolean }) => {
173132 id = "repl"
174133 />
175134 < RenderHeader >
176- < input class = "bg-transparent" value = { resource ( ) ?. repl ?. title || '' } />
135+ < input
136+ class = "bg-transparent"
137+ value = { resource ( ) ?. title || '' }
138+ onChange = { ( e ) => {
139+ mutate ( ( x ) => x && { ...x , title : e . currentTarget . value } ) ;
140+ const repl = resource . latest ! ;
141+ const files = tabMapper ( tabs ( ) ) ;
142+ fetch ( `${ API } /repl/${ params . repl } ` , {
143+ method : 'PUT' ,
144+ headers : {
145+ authorization : `Bearer ${ context . token } ` ,
146+ 'Content-Type' : 'application/json' ,
147+ } ,
148+ body : JSON . stringify ( {
149+ title : e . currentTarget . value ,
150+ version : repl . version ,
151+ public : repl . public ,
152+ labels : repl . labels ,
153+ files : files ,
154+ } ) ,
155+ } ) ;
156+ } }
157+ />
177158 </ RenderHeader >
178159 </ Suspense >
179160 ) ;
0 commit comments