@learnpack/learnpack 5.0.79 → 5.0.83
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -13
- package/lib/creatorDist/assets/{index-WzdhAujs.js → index-CwPh6b6M.js} +1729 -1674
- package/lib/creatorDist/assets/{index-BJ2JJzVC.css → index-DSLkFVbA.css} +30 -2
- package/lib/creatorDist/index.html +2 -2
- package/oclif.manifest.json +1 -1
- package/package.json +1 -1
- package/src/creator/src/App.tsx +1 -7
- package/src/creator/src/assets/svgs.tsx +18 -0
- package/src/creator/src/components/Login.tsx +4 -0
- package/src/creator/src/components/Message.tsx +1 -1
- package/src/creator/src/components/syllabus/ContentIndex.tsx +39 -9
- package/src/creator/src/components/syllabus/Sidebar.tsx +1 -1
- package/src/creator/src/components/syllabus/SyllabusEditor.tsx +7 -3
- package/src/creator/src/index.css +7 -0
- package/src/creatorDist/assets/{index-WzdhAujs.js → index-CwPh6b6M.js} +1729 -1674
- package/src/creatorDist/assets/{index-BJ2JJzVC.css → index-DSLkFVbA.css} +30 -2
- package/src/creatorDist/index.html +2 -2
@@ -401,6 +401,9 @@
|
|
401
401
|
.bottom-3 {
|
402
402
|
bottom: calc(var(--spacing) * 3);
|
403
403
|
}
|
404
|
+
.bottom-5 {
|
405
|
+
bottom: calc(var(--spacing) * 5);
|
406
|
+
}
|
404
407
|
.left-0 {
|
405
408
|
left: calc(var(--spacing) * 0);
|
406
409
|
}
|
@@ -474,12 +477,18 @@
|
|
474
477
|
.mr-1 {
|
475
478
|
margin-right: calc(var(--spacing) * 1);
|
476
479
|
}
|
480
|
+
.mr-4 {
|
481
|
+
margin-right: calc(var(--spacing) * 4);
|
482
|
+
}
|
477
483
|
.mb-2 {
|
478
484
|
margin-bottom: calc(var(--spacing) * 2);
|
479
485
|
}
|
480
486
|
.mb-4 {
|
481
487
|
margin-bottom: calc(var(--spacing) * 4);
|
482
488
|
}
|
489
|
+
.mb-5 {
|
490
|
+
margin-bottom: calc(var(--spacing) * 5);
|
491
|
+
}
|
483
492
|
.mb-6 {
|
484
493
|
margin-bottom: calc(var(--spacing) * 6);
|
485
494
|
}
|
@@ -510,6 +519,9 @@
|
|
510
519
|
.h-6 {
|
511
520
|
height: calc(var(--spacing) * 6);
|
512
521
|
}
|
522
|
+
.h-15 {
|
523
|
+
height: calc(var(--spacing) * 15);
|
524
|
+
}
|
513
525
|
.h-20 {
|
514
526
|
height: calc(var(--spacing) * 20);
|
515
527
|
}
|
@@ -531,8 +543,8 @@
|
|
531
543
|
.h-screen {
|
532
544
|
height: 100vh;
|
533
545
|
}
|
534
|
-
.max-h-\[
|
535
|
-
max-height:
|
546
|
+
.max-h-\[75vh\] {
|
547
|
+
max-height: 75vh;
|
536
548
|
}
|
537
549
|
.max-h-\[300px\] {
|
538
550
|
max-height: 300px;
|
@@ -555,6 +567,9 @@
|
|
555
567
|
.w-6 {
|
556
568
|
width: calc(var(--spacing) * 6);
|
557
569
|
}
|
570
|
+
.w-15 {
|
571
|
+
width: calc(var(--spacing) * 15);
|
572
|
+
}
|
558
573
|
.w-20 {
|
559
574
|
width: calc(var(--spacing) * 20);
|
560
575
|
}
|
@@ -679,6 +694,9 @@
|
|
679
694
|
.rounded {
|
680
695
|
border-radius: 0.25rem;
|
681
696
|
}
|
697
|
+
.rounded-\[50\%\] {
|
698
|
+
border-radius: 50%;
|
699
|
+
}
|
682
700
|
.rounded-full {
|
683
701
|
border-radius: 3.40282e38px;
|
684
702
|
}
|
@@ -751,6 +769,9 @@
|
|
751
769
|
.bg-gray-50 {
|
752
770
|
background-color: var(--color-gray-50);
|
753
771
|
}
|
772
|
+
.bg-gray-200 {
|
773
|
+
background-color: var(--color-gray-200);
|
774
|
+
}
|
754
775
|
.bg-gray-300 {
|
755
776
|
background-color: var(--color-gray-300);
|
756
777
|
}
|
@@ -963,6 +984,9 @@
|
|
963
984
|
.hover\:bg-blue-700:hover {
|
964
985
|
background-color: var(--color-blue-700);
|
965
986
|
}
|
987
|
+
.hover\:bg-gray-300:hover {
|
988
|
+
background-color: var(--color-gray-300);
|
989
|
+
}
|
966
990
|
.hover\:bg-red-300:hover {
|
967
991
|
background-color: var(--color-red-300);
|
968
992
|
}
|
@@ -1118,6 +1142,10 @@ h1 {
|
|
1118
1142
|
top: -10px;
|
1119
1143
|
left: 10px;
|
1120
1144
|
}
|
1145
|
+
.fluid-svg > svg {
|
1146
|
+
width: 100%;
|
1147
|
+
height: 100%;
|
1148
|
+
}
|
1121
1149
|
@property --tw-translate-x {
|
1122
1150
|
syntax: "*";
|
1123
1151
|
inherits: false;
|
@@ -10,8 +10,8 @@
|
|
10
10
|
/>
|
11
11
|
|
12
12
|
<title>Learnpack Creator: Craft tutorials in seconds!</title>
|
13
|
-
<script type="module" crossorigin src="/creator/assets/index-
|
14
|
-
<link rel="stylesheet" crossorigin href="/creator/assets/index-
|
13
|
+
<script type="module" crossorigin src="/creator/assets/index-CwPh6b6M.js"></script>
|
14
|
+
<link rel="stylesheet" crossorigin href="/creator/assets/index-DSLkFVbA.css">
|
15
15
|
</head>
|
16
16
|
<body>
|
17
17
|
<div id="root"></div>
|
package/oclif.manifest.json
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":"5.0.
|
1
|
+
{"version":"5.0.83","commands":{"audit":{"id":"audit","description":"learnpack audit is the command in charge of creating an auditory of the repository\n...\nlearnpack audit checks for the following information in a repository:\n 1. The configuration object has slug, repository and description. (Error)\n 2. The command learnpack clean has been run. (Error)\n 3. If a markdown or test file doesn't have any content. (Error)\n 4. The links are accessing to valid servers. (Error)\n 5. The relative images are working (If they have the shortest path to the image or if the images exists in the assets). (Error)\n 6. The external images are working (If they are pointing to a valid server). (Error)\n 7. The exercises directory names are valid. (Error)\n 8. If an exercise doesn't have a README file. (Error)\n 9. The exercises array (Of the config file) has content. (Error)\n 10. The exercses have the same translations. (Warning)\n 11. The .gitignore file exists. (Warning)\n 12. If there is a file within the exercises folder but not inside of any particular exercise's folder. (Warning)\n","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{"strict":{"name":"strict","type":"boolean","char":"s","description":"strict mode","allowNo":false}},"args":[]},"breakToken":{"id":"breakToken","description":"Break the token","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{"yes":{"name":"yes","type":"boolean","char":"y","description":"Skip all prompts and initialize an empty project","allowNo":false},"grading":{"name":"grading","type":"boolean","char":"h","description":"show CLI help","allowNo":false}},"args":[]},"clean":{"id":"clean","description":"Clean the configuration object\n ...\n Extra documentation goes here\n ","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{},"args":[]},"download":{"id":"download","description":"Describe the command here\n...\nExtra documentation goes here\n","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{},"args":[{"name":"package","description":"The unique string that identifies this package on learnpack","required":false,"hidden":false}]},"init":{"id":"init","description":"Create a new learning package: Book, Tutorial or Exercise","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{"yes":{"name":"yes","type":"boolean","char":"y","description":"Skip all prompts and initialize an empty project","allowNo":false},"grading":{"name":"grading","type":"boolean","char":"h","description":"show CLI help","allowNo":false}},"args":[]},"login":{"id":"login","description":"Describe the command here\n ...\n Extra documentation goes here\n ","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{},"args":[{"name":"package","description":"The unique string that identifies this package on learnpack","required":false,"hidden":false}]},"logout":{"id":"logout","description":"Describe the command here\n ...\n Extra documentation goes here\n ","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{},"args":[{"name":"package","description":"The unique string that identifies this package on learnpack","required":false,"hidden":false}]},"publish":{"id":"publish","description":"Builds the project by copying necessary files and directories into a zip file","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{"strict":{"name":"strict","type":"boolean","char":"s","description":"strict mode","allowNo":false},"help":{"name":"help","type":"boolean","char":"h","description":"show CLI help","allowNo":false}},"args":[]},"serve":{"id":"serve","description":"Runs a small server to build tutorials","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{"yes":{"name":"yes","type":"boolean","char":"y","description":"Skip all prompts and initialize an empty project","allowNo":false},"port":{"name":"port","type":"option","char":"p","description":"server port"},"host":{"name":"host","type":"option","char":"h","description":"server host"},"debug":{"name":"debug","type":"boolean","char":"d","description":"debugger mode for more verbage","allowNo":false}},"args":[]},"start":{"id":"start","description":"Runs a small server with all the exercise instructions","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{"yes":{"name":"yes","type":"boolean","char":"y","description":"Skip all prompts and initialize an empty project","allowNo":false},"port":{"name":"port","type":"option","char":"p","description":"server port"},"host":{"name":"host","type":"option","char":"h","description":"server host"},"disableGrading":{"name":"disableGrading","type":"boolean","char":"D","description":"disble grading functionality","allowNo":false},"watch":{"name":"watch","type":"boolean","char":"w","description":"Watch for file changes","allowNo":false},"editor":{"name":"editor","type":"option","char":"e","description":"[preview, extension]","options":["extension","preview"]},"version":{"name":"version","type":"option","char":"v","description":"E.g: 1.0.1"},"grading":{"name":"grading","type":"option","char":"g","description":"[isolated, incremental]","options":["isolated","incremental"]},"debug":{"name":"debug","type":"boolean","char":"d","description":"debugger mode for more verbage","allowNo":false}},"args":[]},"test":{"id":"test","description":"Test exercises","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{"yes":{"name":"yes","type":"boolean","char":"y","description":"Skip all prompts and initialize an empty project","allowNo":false}},"args":[{"name":"exerciseSlug","description":"The name of the exercise to test","required":false,"hidden":false}]},"translate":{"id":"translate","description":"List all the lessons, the user is able of select many of them to translate to the given languages","pluginName":"@learnpack/learnpack","pluginType":"core","aliases":[],"flags":{"yes":{"name":"yes","type":"boolean","char":"y","description":"Skip all prompts and initialize an empty project","allowNo":false}},"args":[]}}}
|
package/package.json
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
2
|
"name": "@learnpack/learnpack",
|
3
3
|
"description": "Seamlessly build, sell and/or take interactive & auto-graded tutorials, start learning now or build a new tutorial to your audience.",
|
4
|
-
"version": "5.0.
|
4
|
+
"version": "5.0.83",
|
5
5
|
"author": "Alejandro Sanchez @alesanchezr",
|
6
6
|
"contributors": [
|
7
7
|
{
|
package/src/creator/src/App.tsx
CHANGED
@@ -266,13 +266,7 @@ function App() {
|
|
266
266
|
{formState.isCompleted ? (
|
267
267
|
<Loader
|
268
268
|
text="Learnpack is setting up your tutorial. It may take a moment..."
|
269
|
-
icon={
|
270
|
-
<img
|
271
|
-
src={"/rigo-float.gif"}
|
272
|
-
alt="rigo"
|
273
|
-
className="w-20 h-20"
|
274
|
-
/>
|
275
|
-
}
|
269
|
+
icon={<img src={"creator/rigo-float.gif"} alt="rigo" className="w-20 h-20" />}
|
276
270
|
/>
|
277
271
|
) : (
|
278
272
|
<StepWizard
|
@@ -263,4 +263,22 @@ export const SVGS = {
|
|
263
263
|
/>
|
264
264
|
</svg>
|
265
265
|
),
|
266
|
+
undo: (
|
267
|
+
<svg
|
268
|
+
width="20px"
|
269
|
+
height="20px"
|
270
|
+
viewBox="0 0 24 24"
|
271
|
+
fill="none"
|
272
|
+
xmlns="http://www.w3.org/2000/svg"
|
273
|
+
>
|
274
|
+
<path
|
275
|
+
d="M12 20.75C10.078 20.7474 8.23546 19.9827 6.8764 18.6236C5.51733 17.2645 4.75265 15.422 4.75 13.5C4.75 13.3011 4.82902 13.1103 4.96967 12.9697C5.11032 12.829 5.30109 12.75 5.5 12.75C5.69891 12.75 5.88968 12.829 6.03033 12.9697C6.17098 13.1103 6.25 13.3011 6.25 13.5C6.25 14.6372 6.58723 15.7489 7.21905 16.6945C7.85087 17.6401 8.74889 18.3771 9.79957 18.8123C10.8502 19.2475 12.0064 19.3614 13.1218 19.1395C14.2372 18.9177 15.2617 18.37 16.0659 17.5659C16.87 16.7617 17.4177 15.7372 17.6395 14.6218C17.8614 13.5064 17.7475 12.3502 17.3123 11.2996C16.8771 10.2489 16.1401 9.35087 15.1945 8.71905C14.2489 8.08723 13.1372 7.75 12 7.75H9.5C9.30109 7.75 9.11032 7.67098 8.96967 7.53033C8.82902 7.38968 8.75 7.19891 8.75 7C8.75 6.80109 8.82902 6.61032 8.96967 6.46967C9.11032 6.32902 9.30109 6.25 9.5 6.25H12C13.9228 6.25 15.7669 7.01384 17.1265 8.37348C18.4862 9.73311 19.25 11.5772 19.25 13.5C19.25 15.4228 18.4862 17.2669 17.1265 18.6265C15.7669 19.9862 13.9228 20.75 12 20.75Z"
|
276
|
+
fill="#000000"
|
277
|
+
/>
|
278
|
+
<path
|
279
|
+
d="M12 10.75C11.9015 10.7505 11.8038 10.7313 11.7128 10.6935C11.6218 10.6557 11.5393 10.6001 11.47 10.53L8.47001 7.53003C8.32956 7.38941 8.25067 7.19878 8.25067 7.00003C8.25067 6.80128 8.32956 6.61066 8.47001 6.47003L11.47 3.47003C11.5387 3.39634 11.6215 3.33724 11.7135 3.29625C11.8055 3.25526 11.9048 3.23322 12.0055 3.23144C12.1062 3.22966 12.2062 3.24819 12.2996 3.28591C12.393 3.32363 12.4778 3.37977 12.549 3.45099C12.6203 3.52221 12.6764 3.60705 12.7141 3.70043C12.7519 3.79382 12.7704 3.89385 12.7686 3.99455C12.7668 4.09526 12.7448 4.19457 12.7038 4.28657C12.6628 4.37857 12.6037 4.46137 12.53 4.53003L10.06 7.00003L12.53 9.47003C12.6705 9.61066 12.7494 9.80128 12.7494 10C12.7494 10.1988 12.6705 10.3894 12.53 10.53C12.4608 10.6001 12.3782 10.6557 12.2872 10.6935C12.1962 10.7313 12.0986 10.7505 12 10.75Z"
|
280
|
+
fill="#000000"
|
281
|
+
/>
|
282
|
+
</svg>
|
283
|
+
),
|
266
284
|
}
|
@@ -85,6 +85,10 @@ export default function Login({ onFinish }: { onFinish: () => void }) {
|
|
85
85
|
className="bg-white p-8 rounded-xl shadow-md max-w-sm w-full"
|
86
86
|
onClick={(e) => e.stopPropagation()}
|
87
87
|
>
|
88
|
+
<p className="mb-4 text-center text-gray-700">
|
89
|
+
You need to have a 4Geeks account with a creator plan to create a
|
90
|
+
tutorial.
|
91
|
+
</p>
|
88
92
|
<button
|
89
93
|
onClick={redirectGithub}
|
90
94
|
className="w-full border border-gray-300 py-2 rounded-md font-semibold flex items-center justify-center gap-2 mb-4"
|
@@ -16,7 +16,7 @@ export const Message: React.FC<TMessage> = ({ type, content }) => {
|
|
16
16
|
|
17
17
|
console.log("user", user)
|
18
18
|
return isLoading ? (
|
19
|
-
<RigoLoader text="Thinking..." svg={<img src="
|
19
|
+
<RigoLoader text="Thinking..." svg={<img src="rigo-float.gif" />} />
|
20
20
|
) : (
|
21
21
|
<div
|
22
22
|
className={`flex items-start space-x-2 p-3 rounded-md border ${
|
@@ -18,7 +18,7 @@ const ContentIndexHeader = ({
|
|
18
18
|
.length === 2
|
19
19
|
|
20
20
|
const headerText = isFirst
|
21
|
-
?
|
21
|
+
? `I've created a detailed structure for your course: ${syllabus.courseInfo.title}`
|
22
22
|
: "I've updated the structure based on your feedback."
|
23
23
|
|
24
24
|
const subText = isFirst
|
@@ -36,7 +36,7 @@ const ContentIndexHeader = ({
|
|
36
36
|
animate={{ opacity: 1, y: 0 }}
|
37
37
|
exit={{ opacity: 0, y: 10 }}
|
38
38
|
transition={{ duration: 0.2 }}
|
39
|
-
className="text-lg font-semibold"
|
39
|
+
className="text-lg font-semibold "
|
40
40
|
>
|
41
41
|
{headerText}
|
42
42
|
</motion.h2>
|
@@ -49,15 +49,11 @@ const ContentIndexHeader = ({
|
|
49
49
|
animate={{ opacity: 1 }}
|
50
50
|
exit={{ opacity: 0 }}
|
51
51
|
transition={{ duration: 0.2, delay: 0.1 }}
|
52
|
-
className="text-sm text-gray-600 mt-1"
|
52
|
+
className="text-sm text-gray-600 mt-1 mb-5"
|
53
53
|
>
|
54
54
|
{subText}
|
55
55
|
</motion.p>
|
56
56
|
</AnimatePresence>
|
57
|
-
|
58
|
-
<h3 className="text-sm text-gray-600 mt-2 font-bold">
|
59
|
-
{syllabus.courseInfo.title}
|
60
|
-
</h3>
|
61
57
|
</div>
|
62
58
|
)
|
63
59
|
}
|
@@ -66,11 +62,24 @@ export default ContentIndexHeader
|
|
66
62
|
|
67
63
|
export const GenerateButton = ({
|
68
64
|
handleSubmit,
|
65
|
+
handleUndo,
|
66
|
+
hasChanges,
|
69
67
|
}: {
|
70
68
|
handleSubmit: () => void
|
69
|
+
handleUndo: () => void
|
70
|
+
hasChanges: boolean
|
71
71
|
}) => {
|
72
72
|
return (
|
73
73
|
<div className="flex justify-end mt-6">
|
74
|
+
{hasChanges && (
|
75
|
+
<button
|
76
|
+
className="text-gray-500 mr-4 cursor-pointer bg-gray-200 rounded px-4 py-2 hover:bg-gray-300 flex items-center gap-2"
|
77
|
+
onClick={() => handleUndo()}
|
78
|
+
>
|
79
|
+
{SVGS.undo}
|
80
|
+
Revert changes
|
81
|
+
</button>
|
82
|
+
)}
|
74
83
|
<button
|
75
84
|
onClick={async () => {
|
76
85
|
handleSubmit()
|
@@ -83,16 +92,33 @@ export const GenerateButton = ({
|
|
83
92
|
</div>
|
84
93
|
)
|
85
94
|
}
|
95
|
+
|
96
|
+
function hasChanges(current: Lesson[], previous: Lesson[]): boolean {
|
97
|
+
return current.some(
|
98
|
+
(c) =>
|
99
|
+
!previous.some(
|
100
|
+
(p) =>
|
101
|
+
p.id === c.id &&
|
102
|
+
p.title === c.title &&
|
103
|
+
p.type === c.type &&
|
104
|
+
p.duration === c.duration &&
|
105
|
+
p.description === c.description
|
106
|
+
)
|
107
|
+
)
|
108
|
+
}
|
109
|
+
|
86
110
|
export const ContentIndex = ({
|
87
111
|
prevLessons,
|
88
112
|
handleSubmit,
|
89
113
|
messages,
|
90
114
|
isThinking,
|
115
|
+
handleUndo,
|
91
116
|
}: {
|
92
117
|
prevLessons?: Lesson[]
|
93
118
|
handleSubmit: () => void
|
94
119
|
messages: TMessage[]
|
95
120
|
isThinking: boolean
|
121
|
+
handleUndo: () => void
|
96
122
|
}) => {
|
97
123
|
const syllabus = useStore((state) => state.syllabus)
|
98
124
|
const setSyllabus = useStore((state) => state.setSyllabus)
|
@@ -171,7 +197,7 @@ export const ContentIndex = ({
|
|
171
197
|
<ContentIndexHeader messages={messages} syllabus={syllabus} />
|
172
198
|
<div
|
173
199
|
ref={containerRef}
|
174
|
-
className=" space-y-3 overflow-y-auto max-h-[
|
200
|
+
className=" space-y-3 overflow-y-auto max-h-[75vh] pr-2 scrollbar-hide relative pb-5"
|
175
201
|
>
|
176
202
|
{isThinking ? (
|
177
203
|
<Loader text="Thinking..." minheight="min-h-[70vh]" />
|
@@ -207,7 +233,11 @@ export const ContentIndex = ({
|
|
207
233
|
</div>
|
208
234
|
</div>
|
209
235
|
))}
|
210
|
-
<GenerateButton
|
236
|
+
<GenerateButton
|
237
|
+
handleSubmit={handleSubmit}
|
238
|
+
handleUndo={handleUndo}
|
239
|
+
hasChanges={hasChanges(syllabus.lessons, prevLessons || [])}
|
240
|
+
/>
|
211
241
|
</>
|
212
242
|
)}
|
213
243
|
</div>
|
@@ -24,7 +24,7 @@ export const Sidebar = ({
|
|
24
24
|
<>
|
25
25
|
{!isOpen && (
|
26
26
|
<button
|
27
|
-
className="fixed
|
27
|
+
className="fixed bottom-5 left-2 z-50 lg:hidden p-1 shadow-md cursor-pointer p-2 w-15 h-15 flex items-center justify-center bg-blue-600 rounded-[50%] fluid-svg"
|
28
28
|
onClick={() => setIsOpen(true)}
|
29
29
|
>
|
30
30
|
{SVGS.rigoSoftBlue}
|
@@ -162,9 +162,7 @@ const SyllabusEditor: React.FC = () => {
|
|
162
162
|
return isGenerating ? (
|
163
163
|
<Loader
|
164
164
|
listeningTo="course-generation"
|
165
|
-
icon={
|
166
|
-
<img src={"creator/rigo-float.gif"} alt="rigo" className="w-20 h-20" />
|
167
|
-
}
|
165
|
+
icon={<img src={"rigo-float.gif"} alt="rigo" className="w-20 h-20" />}
|
168
166
|
initialBuffer="🚀 Starting course generation..."
|
169
167
|
text="Learnpack is setting up your tutorial.
|
170
168
|
It may take a moment..."
|
@@ -192,6 +190,12 @@ It may take a moment..."
|
|
192
190
|
prevLessons={prevLessons.current}
|
193
191
|
handleSubmit={handleSubmit}
|
194
192
|
messages={messages}
|
193
|
+
handleUndo={() => {
|
194
|
+
setSyllabus({
|
195
|
+
...syllabus,
|
196
|
+
lessons: prevLessons.current,
|
197
|
+
})
|
198
|
+
}}
|
195
199
|
isThinking={isThinking}
|
196
200
|
/>
|
197
201
|
</div>
|