|
51 | 51 | UserRemoveSolid, |
52 | 52 | FileLinesOutline, |
53 | 53 | ExclamationCircleOutline, |
54 | | - LockSolid |
| 54 | + LockSolid, |
| 55 | + CheckCircleOutline |
55 | 56 | } from 'flowbite-svelte-icons'; |
56 | 57 | import { sadToast, happyToast } from '$lib/toast'; |
57 | 58 | import { humanSize } from '$lib/size'; |
|
429 | 430 | }, {}); |
430 | 431 | $: selectedClassName = classNameDict[selectedClass] || 'Select a class...'; |
431 | 432 |
|
432 | | - const updateSelectedClass = (classValue: string) => { |
| 433 | + const updateSelectedClass = async (classValue: string) => { |
| 434 | + canvasClassVerified = false; |
| 435 | + canvasClassBeingVerified = true; |
| 436 | + canvasClassVerificationError = ''; |
433 | 437 | classSelectDropdownOpen = false; |
434 | 438 | selectedClass = classValue; |
| 439 | + await verifyCanvasClass(); |
435 | 440 | }; |
436 | 441 |
|
437 | 442 | const saveSelectedClass = async () => { |
|
448 | 453 | } |
449 | 454 | }; |
450 | 455 |
|
| 456 | + let canvasClassVerified = false; |
| 457 | + let canvasClassBeingVerified = false; |
| 458 | + let canvasClassVerificationError = ''; |
| 459 | +
|
| 460 | + const verifyCanvasClass = async () => { |
| 461 | + canvasClassBeingVerified = true; |
| 462 | + const result = await api.verifyCanvasClass(fetch, data.class.id, 'harvard', selectedClass); |
| 463 | + const response = api.expandResponse(result); |
| 464 | + if (response.error) { |
| 465 | + canvasClassVerificationError = |
| 466 | + response.error.detail || |
| 467 | + 'There was an issue while trying to verify your access to the class roster. Try again later.'; |
| 468 | + } else { |
| 469 | + canvasClassVerified = true; |
| 470 | + } |
| 471 | + canvasClassBeingVerified = false; |
| 472 | + }; |
| 473 | +
|
451 | 474 | let syncingCanvasClass = false; |
452 | 475 | const syncClass = async () => { |
453 | 476 | syncingCanvasClass = true; |
|
975 | 998 | /> |
976 | 999 | </DropdownContainer> |
977 | 1000 | <div class="flex gap-2 items-center"> |
| 1001 | + {#if canvasClassBeingVerified} |
| 1002 | + <Spinner color="yellow" class="w-6 h-6" /> |
| 1003 | + <Tooltip |
| 1004 | + defaultClass="text-wrap py-2 px-3 mr-5 text-sm font-light shadow-sm" |
| 1005 | + arrow={false} |
| 1006 | + >We're verifying your access to the class roster. This shouldn't take long.</Tooltip |
| 1007 | + > |
| 1008 | + {:else if canvasClassVerified} |
| 1009 | + <CheckCircleOutline class="w-6 h-6 text-amber-800" /> |
| 1010 | + <Tooltip |
| 1011 | + defaultClass="text-wrap py-2 px-3 mr-5 text-sm font-light shadow-sm" |
| 1012 | + arrow={false}>Your access to the class roster has been verified.</Tooltip |
| 1013 | + > |
| 1014 | + {:else if canvasClassVerificationError} |
| 1015 | + <ExclamationCircleOutline class="w-6 h-6 text-amber-800" /> |
| 1016 | + <Tooltip |
| 1017 | + defaultClass="text-wrap py-2 px-3 mr-5 text-sm font-light shadow-sm" |
| 1018 | + arrow={false}>{canvasClassVerificationError}</Tooltip |
| 1019 | + > |
| 1020 | + {:else if !canvasClassVerified} |
| 1021 | + <CheckCircleOutline class="w-6 h-6 text-amber-800 text-opacity-25" /> |
| 1022 | + <Tooltip |
| 1023 | + defaultClass="text-wrap py-2 px-3 mr-5 text-sm font-light shadow-sm" |
| 1024 | + arrow={false} |
| 1025 | + >We'll verify your permissions to access the class roster. Select a class to |
| 1026 | + begin.</Tooltip |
| 1027 | + > |
| 1028 | + {/if} |
978 | 1029 | <Button |
979 | 1030 | pill |
980 | 1031 | size="xs" |
981 | 1032 | class="shrink-0 max-h-fit border border-amber-900 bg-gradient-to-t from-amber-900 to-amber-800 text-white hover:from-amber-800 hover:to-amber-700" |
982 | 1033 | on:click={saveSelectedClass} |
983 | 1034 | on:touchstart={saveSelectedClass} |
984 | | - disabled={loadingCanvasClasses || !selectedClass} |
| 1035 | + disabled={loadingCanvasClasses || |
| 1036 | + !selectedClass || |
| 1037 | + canvasClassBeingVerified || |
| 1038 | + !canvasClassVerified} |
985 | 1039 | > |
986 | 1040 | Save</Button |
987 | 1041 | > |
988 | 1042 | <Button |
989 | 1043 | pill |
990 | 1044 | size="xs" |
991 | 1045 | class="shrink-0 max-h-fit border border-gray-400 bg-gradient-to-t from-gray-100 to-gray-100 text-gray-800 hover:from-gray-200 hover:to-gray-100" |
| 1046 | + disabled={loadingCanvasClasses || canvasClassBeingVerified} |
992 | 1047 | on:click={() => { |
993 | 1048 | $loadedCanvasClasses = []; |
994 | 1049 | selectedClass = ''; |
| 1050 | + canvasClassVerified = false; |
| 1051 | + canvasClassBeingVerified = false; |
| 1052 | + canvasClassVerificationError = ''; |
| 1053 | + classSelectDropdownOpen = false; |
995 | 1054 | }} |
996 | 1055 | on:touchstart={() => { |
997 | 1056 | $loadedCanvasClasses = []; |
998 | 1057 | selectedClass = ''; |
| 1058 | + canvasClassVerified = false; |
| 1059 | + canvasClassBeingVerified = false; |
| 1060 | + canvasClassVerificationError = ''; |
| 1061 | + classSelectDropdownOpen = false; |
999 | 1062 | }} |
1000 | 1063 | > |
1001 | 1064 | Cancel</Button |
|
1188 | 1251 | <span class="text-lg font-medium">Important: Reconnect your Canvas account</span> |
1189 | 1252 | </div> |
1190 | 1253 | <p class="mt-2 text-sm"> |
1191 | | - We faced an issue when trying to connect to your Canvas account. Use the |
1192 | | - reconnection button below to reauthorize Pingpong to access your Canvas account and |
1193 | | - ensure uninterrupted syncing of your class roster. |
| 1254 | + We faced an issue when trying to get the class roster from your Canvas account. Use |
| 1255 | + the reconnection button below to reauthorize Pingpong to access your Canvas account |
| 1256 | + and ensure uninterrupted syncing of your class roster. |
1194 | 1257 | </p> |
1195 | 1258 | <p class="mt-2 mb-4 text-sm"> |
1196 | 1259 | Last sync: {data.class.lms_last_synced |
1197 | 1260 | ? dayjs.utc(data.class.lms_last_synced).fromNow() |
1198 | 1261 | : 'never'} |
1199 | 1262 | </p> |
1200 | | - <div class="flex gap-2"> |
| 1263 | + <div class="flex flex-row justify-between items-center"> |
1201 | 1264 | <Button |
1202 | 1265 | pill |
1203 | 1266 | size="xs" |
|
1207 | 1270 | > |
1208 | 1271 | <RefreshOutline class="w-4 h-4 me-2" />Reconnect Canvas account</Button |
1209 | 1272 | > |
| 1273 | + <Button |
| 1274 | + pill |
| 1275 | + size="xs" |
| 1276 | + class="border border-red-900 hover:bg-red-900 text-red-900 hover:bg-gradient-to-t hover:from-red-800 hover:to-red-700 hover:text-white" |
| 1277 | + on:click={() => (disconnectCanvas = true)} |
| 1278 | + on:touchstart={() => (disconnectCanvas = true)} |
| 1279 | + > |
| 1280 | + <UserRemoveSolid class="w-4 h-4 me-2" />Disconnect Canvas account</Button |
| 1281 | + > |
1210 | 1282 | </div> |
| 1283 | + <Modal bind:open={disconnectCanvas} size="sm" autoclose> |
| 1284 | + <CanvasDisconnectModal |
| 1285 | + canvasCourseCode={data.class.lms_class?.course_code || ''} |
| 1286 | + on:keep={() => removeCanvasConnection(true)} |
| 1287 | + on:remove={() => removeCanvasConnection(false)} |
| 1288 | + /> |
| 1289 | + </Modal> |
1211 | 1290 | </div> |
1212 | 1291 | </Alert> |
1213 | 1292 | {:else if data.class.lms_status === 'error'} |
|
0 commit comments