|
1358 | 1358 | // Web functions |
1359 | 1359 | ////////////////////////// |
1360 | 1360 |
|
1361 | | - const initNewChat = async () => { |
1362 | | - console.log('initNewChat'); |
1363 | | - resetWebSearchConfirmation(); |
1364 | | -
|
1365 | | - // Mark the outgoing chat as read before resetting; in-place created chats |
1366 | | - // keep chatIdProp undefined, so navigateHandler never marks them read. |
1367 | | - if ($chatId && !$temporaryChatEnabled) { |
1368 | | - updateLastReadAt($chatId); |
1369 | | - } |
1370 | | -
|
1371 | | - if ($user?.role !== 'admin' && $user?.permissions?.chat?.temporary_enforced) { |
1372 | | - await temporaryChatEnabled.set(true); |
1373 | | - } |
1374 | | -
|
1375 | | - if ($settings?.temporaryChatByDefault ?? false) { |
1376 | | - if ($temporaryChatEnabled === false) { |
1377 | | - await temporaryChatEnabled.set(true); |
1378 | | - } else if ($temporaryChatEnabled === null) { |
1379 | | - // if set to null set to false; refer to temp chat toggle click handler |
1380 | | - await temporaryChatEnabled.set(false); |
1381 | | - } |
| 1361 | + const applySelectedModels = async () => { |
| 1362 | + // $models loads asynchronously; resolving while empty blanks the selector and never recovers |
| 1363 | + if ($models.length === 0) { |
| 1364 | + return; |
1382 | 1365 | } |
1383 | 1366 |
|
1384 | | - if ($user?.role !== 'admin' && !$user?.permissions?.chat?.temporary) { |
1385 | | - await temporaryChatEnabled.set(false); |
| 1367 | + // keep a valid existing selection (e.g. user's manual choice) |
| 1368 | + if (selectedModels.some((modelId) => modelId && $models.some((m) => m.id === modelId))) { |
| 1369 | + return; |
1386 | 1370 | } |
1387 | 1371 |
|
1388 | 1372 | const availableModels = $models |
|
1400 | 1384 |
|
1401 | 1385 | if (urlModels.length === 1) { |
1402 | 1386 | if (!$models.find((m) => m.id === urlModels[0])) { |
1403 | | - // Model not found; open model selector and prefill |
| 1387 | + // model not in list — open the selector prefilled with the requested id |
1404 | 1388 | const modelSelectorButton = document.getElementById('model-selector-0-button'); |
1405 | 1389 | if (modelSelectorButton) { |
1406 | 1390 | modelSelectorButton.click(); |
|
1414 | 1398 | } |
1415 | 1399 | } |
1416 | 1400 | } else { |
1417 | | - // Model found; set it as selected |
1418 | 1401 | selectedModels = urlModels; |
1419 | 1402 | } |
1420 | 1403 | } else { |
1421 | | - // Multiple models; set as selected |
1422 | 1404 | selectedModels = urlModels; |
1423 | 1405 | } |
1424 | 1406 |
|
1425 | | - // Unavailable models filtering |
1426 | 1407 | selectedModels = selectedModels.filter((modelId) => |
1427 | 1408 | $models.map((m) => m.id).includes(modelId) |
1428 | 1409 | ); |
1429 | 1410 | } else { |
| 1411 | + // priority: folder → sticky session → user default → admin default |
1430 | 1412 | if ($selectedFolder?.data?.model_ids) { |
1431 | | - // Set from folder model IDs |
1432 | 1413 | selectedModels = $selectedFolder?.data?.model_ids; |
1433 | | - } else { |
1434 | | - if (sessionStorage.selectedModels) { |
1435 | | - // Set from session storage (temporary selection) |
1436 | | - selectedModels = JSON.parse(sessionStorage.selectedModels); |
1437 | | - sessionStorage.removeItem('selectedModels'); |
1438 | | - } else { |
1439 | | - if ($settings?.models) { |
1440 | | - // Set from user settings |
1441 | | - selectedModels = $settings?.models; |
1442 | | - } else if (defaultModels && defaultModels.length > 0) { |
1443 | | - // Set from default models |
1444 | | - selectedModels = defaultModels; |
1445 | | - } |
1446 | | - } |
| 1414 | + } else if (sessionStorage.selectedModels) { |
| 1415 | + selectedModels = JSON.parse(sessionStorage.selectedModels); |
| 1416 | + sessionStorage.removeItem('selectedModels'); |
| 1417 | + } else if ($settings?.models) { |
| 1418 | + selectedModels = $settings?.models; |
| 1419 | + } else if (defaultModels && defaultModels.length > 0) { |
| 1420 | + selectedModels = defaultModels; |
1447 | 1421 | } |
1448 | 1422 |
|
1449 | | - // Unavailable & hidden models filtering |
1450 | 1423 | selectedModels = selectedModels.filter((modelId) => availableModels.includes(modelId)); |
1451 | 1424 | } |
1452 | 1425 |
|
1453 | | - // Ensure at least one model is selected |
| 1426 | + // fall back to admin default, then the first available model |
1454 | 1427 | if (selectedModels.length === 0 || (selectedModels.length === 1 && selectedModels[0] === '')) { |
1455 | 1428 | if (availableModels.length > 0) { |
1456 | 1429 | if (defaultModels && defaultModels.length > 0) { |
|
1461 | 1434 | selectedModels.length === 0 || |
1462 | 1435 | (selectedModels.length === 1 && selectedModels[0] === '') |
1463 | 1436 | ) { |
1464 | | - // Only fall back to first available model if default models didn't resolve |
1465 | 1437 | selectedModels = [availableModels?.at(0) ?? '']; |
1466 | 1438 | } |
1467 | 1439 | } else { |
1468 | 1440 | selectedModels = ['']; |
1469 | 1441 | } |
1470 | 1442 | } |
1471 | 1443 |
|
| 1444 | + selectedModels = selectedModels.map((modelId) => |
| 1445 | + $models.map((m) => m.id).includes(modelId) ? modelId : '' |
| 1446 | + ); |
| 1447 | + }; |
| 1448 | +
|
| 1449 | + // re-resolve once models load, covering the race where initNewChat() ran while $models was empty |
| 1450 | +
|
| 1451 | + $: if (chatIdProp === '' && $models.length > 0) { |
| 1452 | + applySelectedModels(); |
| 1453 | + } |
| 1454 | +
|
| 1455 | + const initNewChat = async () => { |
| 1456 | + console.log('initNewChat'); |
| 1457 | + resetWebSearchConfirmation(); |
| 1458 | +
|
| 1459 | + // Mark the outgoing chat as read before resetting; in-place created chats |
| 1460 | + // keep chatIdProp undefined, so navigateHandler never marks them read. |
| 1461 | + if ($chatId && !$temporaryChatEnabled) { |
| 1462 | + updateLastReadAt($chatId); |
| 1463 | + } |
| 1464 | +
|
| 1465 | + if ($user?.role !== 'admin' && $user?.permissions?.chat?.temporary_enforced) { |
| 1466 | + await temporaryChatEnabled.set(true); |
| 1467 | + } |
| 1468 | +
|
| 1469 | + if ($settings?.temporaryChatByDefault ?? false) { |
| 1470 | + if ($temporaryChatEnabled === false) { |
| 1471 | + await temporaryChatEnabled.set(true); |
| 1472 | + } else if ($temporaryChatEnabled === null) { |
| 1473 | + // if set to null set to false; refer to temp chat toggle click handler |
| 1474 | + await temporaryChatEnabled.set(false); |
| 1475 | + } |
| 1476 | + } |
| 1477 | +
|
| 1478 | + if ($user?.role !== 'admin' && !$user?.permissions?.chat?.temporary) { |
| 1479 | + await temporaryChatEnabled.set(false); |
| 1480 | + } |
| 1481 | +
|
| 1482 | + await applySelectedModels(); |
| 1483 | +
|
1472 | 1484 | if ($mobile) { |
1473 | 1485 | await showControls.set(false); |
1474 | 1486 | } |
|
0 commit comments