diff --git a/.github/scripts/rename-app-beta.sh b/.github/scripts/rename-app-beta.sh deleted file mode 100644 index a12d1d635..000000000 --- a/.github/scripts/rename-app-beta.sh +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/bash - -# Check if the correct number of arguments is provided -if [ "$#" -ne 1 ]; then - echo "Usage: $0 " - exit 1 -fi - -INPUT_JSON_FILE="$1" - -# Check if the input file exists -if [ ! -f "$INPUT_JSON_FILE" ]; then - echo "Input file not found: $INPUT_JSON_FILE" - exit 1 -fi - -# Use jq to transform the content -jq ' - .name = "jan-beta" | - .productName = "Jan-beta" | - .build.appId = "jan-beta.ai.app" | - .build.productName = "Jan-beta" | - .build.appId = "jan-beta.ai.app" | - .build.protocols[0].name = "Jan-beta" | - .build.protocols[0].schemes = ["jan-beta"] | - .build.artifactName = "jan-beta-${os}-${arch}-${version}.${ext}" | - .build.publish[0].channel = "beta" -' "$INPUT_JSON_FILE" > ./package.json.tmp - -cat ./package.json.tmp - -rm $INPUT_JSON_FILE -mv ./package.json.tmp $INPUT_JSON_FILE - -# Update the layout file -LAYOUT_FILE_PATH="web/app/layout.tsx" - -if [ ! -f "$LAYOUT_FILE_PATH" ]; then - echo "File does not exist: $LAYOUT_FILE_PATH" - exit 1 -fi - -# Perform the replacements -sed -i -e "s#Jan#Jan-beta#g" "$LAYOUT_FILE_PATH" - -# Notify completion -echo "File has been updated: $LAYOUT_FILE_PATH" \ No newline at end of file diff --git a/.github/scripts/rename-app.sh b/.github/scripts/rename-app.sh new file mode 100644 index 000000000..7c2ad6ef3 --- /dev/null +++ b/.github/scripts/rename-app.sh @@ -0,0 +1,55 @@ +#!/bin/bash + +# Check if the correct number of arguments is provided +if [ "$#" -ne 2 ]; then + echo "Usage: $0 " + exit 1 +fi + +INPUT_JSON_FILE="$1" + +CHANNEL="$2" + +if [ "$CHANNEL" == "nightly" ]; then + UPDATER="latest" +else + UPDATER="beta" +fi + +# Check if the input file exists +if [ ! -f "$INPUT_JSON_FILE" ]; then + echo "Input file not found: $INPUT_JSON_FILE" + exit 1 +fi + +# Use jq to transform the content +jq --arg channel "$CHANNEL" --arg updater "$UPDATER" ' + .name = "jan-\($channel)" | + .productName = "Jan-\($channel)" | + .build.appId = "jan-\($channel).ai.app" | + .build.productName = "Jan-\($channel)" | + .build.appId = "jan-\($channel).ai.app" | + .build.protocols[0].name = "Jan-\($channel)" | + .build.protocols[0].schemes = ["jan-\($channel)"] | + .build.artifactName = "jan-\($channel)-${os}-${arch}-${version}.${ext}" | + .build.publish[0].channel = $updater +' "$INPUT_JSON_FILE" > ./package.json.tmp + +cat ./package.json.tmp + +rm $INPUT_JSON_FILE +mv ./package.json.tmp $INPUT_JSON_FILE + +# Update the layout file +LAYOUT_FILE_PATH="web/app/layout.tsx" + +if [ ! -f "$LAYOUT_FILE_PATH" ]; then + echo "File does not exist: $LAYOUT_FILE_PATH" + exit 1 +fi + +# Perform the replacements +sed -i -e "s#Jan#Jan-$CHANNEL#g" "$LAYOUT_FILE_PATH" + +# Notify completion +echo "File has been updated: $LAYOUT_FILE_PATH" diff --git a/.github/scripts/rename-uninstaller-beta.sh b/.github/scripts/rename-uninstaller.sh similarity index 61% rename from .github/scripts/rename-uninstaller-beta.sh rename to .github/scripts/rename-uninstaller.sh index c322825da..7d3992fd0 100644 --- a/.github/scripts/rename-uninstaller-beta.sh +++ b/.github/scripts/rename-uninstaller.sh @@ -3,6 +3,14 @@ # File path to be modified FILE_PATH="electron/scripts/uninstaller.nsh" +# Check if the correct number of arguments is provided +if [ "$#" -ne 1 ]; then + echo "Usage: $0 " + exit 1 +fi + +CHANNEL="$1" + # Check if the file exists if [ ! -f "$FILE_PATH" ]; then echo "File does not exist: $FILE_PATH" @@ -10,7 +18,7 @@ if [ ! -f "$FILE_PATH" ]; then fi # Perform the replacements -sed -i -e "s#jan#jan-beta#g" "$FILE_PATH" +sed -i -e "s#jan#jan-$CHANNEL#g" "$FILE_PATH" # Notify completion echo "File has been updated: $FILE_PATH" \ No newline at end of file diff --git a/.github/scripts/rename-workspace-beta.sh b/.github/scripts/rename-workspace.sh similarity index 74% rename from .github/scripts/rename-workspace-beta.sh rename to .github/scripts/rename-workspace.sh index 6286d1889..420042e2c 100644 --- a/.github/scripts/rename-workspace-beta.sh +++ b/.github/scripts/rename-workspace.sh @@ -3,6 +3,8 @@ # File path to be modified FILE_PATH="$1" +CHANNEL="$2" + # Check if the file exists if [ ! -f "$FILE_PATH" ]; then echo "File does not exist: $FILE_PATH" @@ -10,7 +12,7 @@ if [ ! -f "$FILE_PATH" ]; then fi # Perform the replacements -sed -i -e 's/yarn workspace jan/yarn workspace jan-beta/g' "$FILE_PATH" +sed -i -e "s/yarn workspace jan/yarn workspace jan-$CHANNEL/g" "$FILE_PATH" # Notify completion echo "File has been updated: $FILE_PATH" \ No newline at end of file diff --git a/.github/workflows/jan-electron-build-nightly.yml b/.github/workflows/jan-electron-build-nightly.yml index d79080990..1b29b84af 100644 --- a/.github/workflows/jan-electron-build-nightly.yml +++ b/.github/workflows/jan-electron-build-nightly.yml @@ -114,8 +114,8 @@ jobs: - name: Upload latest-mac.yml if: ${{ needs.set-public-provider.outputs.public_provider == 'aws-s3' }} run: | - aws s3 cp ./latest-mac.yml "s3://${{ secrets.DELTA_AWS_S3_BUCKET_NAME }}/temp-latest/latest-mac.yml" - aws s3 sync s3://${{ secrets.DELTA_AWS_S3_BUCKET_NAME }}/temp-latest/ s3://${{ secrets.DELTA_AWS_S3_BUCKET_NAME }}/latest/ + aws s3 cp ./latest-mac.yml "s3://${{ secrets.DELTA_AWS_S3_BUCKET_NAME }}/temp-nightly/latest-mac.yml" + aws s3 sync s3://${{ secrets.DELTA_AWS_S3_BUCKET_NAME }}/temp-nightly/ s3://${{ secrets.DELTA_AWS_S3_BUCKET_NAME }}/nightly/ env: AWS_ACCESS_KEY_ID: ${{ secrets.DELTA_AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.DELTA_AWS_SECRET_ACCESS_KEY }} @@ -123,35 +123,35 @@ jobs: AWS_EC2_METADATA_DISABLED: "true" - noti-discord-nightly-and-update-url-readme: - needs: [build-macos-x64, build-macos-arm64, build-windows-x64, build-linux-x64, get-update-version, set-public-provider, combine-latest-mac-yml] - secrets: inherit - if: github.event_name == 'schedule' - uses: ./.github/workflows/template-noti-discord-and-update-url-readme.yml - with: - ref: refs/heads/dev - build_reason: Nightly - push_to_branch: dev - new_version: ${{ needs.get-update-version.outputs.new_version }} + # noti-discord-nightly-and-update-url-readme: + # needs: [build-macos-x64, build-macos-arm64, build-windows-x64, build-linux-x64, get-update-version, set-public-provider, combine-latest-mac-yml] + # secrets: inherit + # if: github.event_name == 'schedule' + # uses: ./.github/workflows/template-noti-discord-and-update-url-readme.yml + # with: + # ref: refs/heads/dev + # build_reason: Nightly + # push_to_branch: dev + # new_version: ${{ needs.get-update-version.outputs.new_version }} - noti-discord-pre-release-and-update-url-readme: - needs: [build-macos-x64, build-macos-arm64, build-windows-x64, build-linux-x64, get-update-version, set-public-provider, combine-latest-mac-yml] - secrets: inherit - if: github.event_name == 'push' - uses: ./.github/workflows/template-noti-discord-and-update-url-readme.yml - with: - ref: refs/heads/dev - build_reason: Pre-release - push_to_branch: dev - new_version: ${{ needs.get-update-version.outputs.new_version }} + # noti-discord-pre-release-and-update-url-readme: + # needs: [build-macos-x64, build-macos-arm64, build-windows-x64, build-linux-x64, get-update-version, set-public-provider, combine-latest-mac-yml] + # secrets: inherit + # if: github.event_name == 'push' + # uses: ./.github/workflows/template-noti-discord-and-update-url-readme.yml + # with: + # ref: refs/heads/dev + # build_reason: Pre-release + # push_to_branch: dev + # new_version: ${{ needs.get-update-version.outputs.new_version }} - noti-discord-manual-and-update-url-readme: - needs: [build-macos-x64, build-macos-arm64, build-windows-x64, build-linux-x64, get-update-version, set-public-provider, combine-latest-mac-yml] - secrets: inherit - if: github.event_name == 'workflow_dispatch' && github.event.inputs.public_provider == 'aws-s3' - uses: ./.github/workflows/template-noti-discord-and-update-url-readme.yml - with: - ref: refs/heads/dev - build_reason: Manual - push_to_branch: dev - new_version: ${{ needs.get-update-version.outputs.new_version }} + # noti-discord-manual-and-update-url-readme: + # needs: [build-macos-x64, build-macos-arm64, build-windows-x64, build-linux-x64, get-update-version, set-public-provider, combine-latest-mac-yml] + # secrets: inherit + # if: github.event_name == 'workflow_dispatch' && github.event.inputs.public_provider == 'aws-s3' + # uses: ./.github/workflows/template-noti-discord-and-update-url-readme.yml + # with: + # ref: refs/heads/dev + # build_reason: Manual + # push_to_branch: dev + # new_version: ${{ needs.get-update-version.outputs.new_version }} diff --git a/.github/workflows/template-build-linux-x64.yml b/.github/workflows/template-build-linux-x64.yml index 496d153ae..afd5f6647 100644 --- a/.github/workflows/template-build-linux-x64.yml +++ b/.github/workflows/template-build-linux-x64.yml @@ -60,18 +60,25 @@ jobs: mv /tmp/package.json electron/package.json jq --arg version "${{ inputs.new_version }}" '.version = $version' web/package.json > /tmp/package.json mv /tmp/package.json web/package.json - jq '.build.publish = [{"provider": "generic", "url": "${{ secrets.CLOUDFLARE_R2_PUBLIC_URL }}", "channel": "latest"}, {"provider": "s3", "acl": null, "bucket": "${{ secrets.DELTA_AWS_S3_BUCKET_NAME }}", "region": "${{ secrets.DELTA_AWS_REGION}}", "path": "temp-latest", "channel": "latest"}]' electron/package.json > /tmp/package.json + jq '.build.publish = [{"provider": "generic", "url": "https://delta.jan.ai/nightly", "channel": "latest"}, {"provider": "s3", "acl": null, "bucket": "${{ secrets.DELTA_AWS_S3_BUCKET_NAME }}", "region": "${{ secrets.DELTA_AWS_REGION}}", "path": "temp-nightly", "channel": "latest"}]' electron/package.json > /tmp/package.json mv /tmp/package.json electron/package.json cat electron/package.json + chmod +x .github/scripts/rename-app.sh + .github/scripts/rename-app.sh ./electron/package.json nightly + chmod +x .github/scripts/rename-workspace.sh + .github/scripts/rename-workspace.sh ./package.json nightly + echo "------------------------" + cat ./electron/package.json + echo "------------------------" - name: Change App Name for beta version if: inputs.beta == true shell: bash run: | - chmod +x .github/scripts/rename-app-beta.sh - .github/scripts/rename-app-beta.sh ./electron/package.json - chmod +x .github/scripts/rename-workspace-beta.sh - .github/scripts/rename-workspace-beta.sh ./package.json + chmod +x .github/scripts/rename-app.sh + .github/scripts/rename-app.sh ./electron/package.json beta + chmod +x .github/scripts/rename-workspace.sh + .github/scripts/rename-workspace.sh ./package.json beta echo "------------------------" cat ./electron/package.json echo "------------------------" diff --git a/.github/workflows/template-build-macos-arm64.yml b/.github/workflows/template-build-macos-arm64.yml index 40cdda627..46f884473 100644 --- a/.github/workflows/template-build-macos-arm64.yml +++ b/.github/workflows/template-build-macos-arm64.yml @@ -72,22 +72,29 @@ jobs: jq --arg version "${{ inputs.new_version }}" '.version = $version' web/package.json > /tmp/package.json mv /tmp/package.json web/package.json - jq '.build.publish = [{"provider": "generic", "url": "${{ secrets.CLOUDFLARE_R2_PUBLIC_URL }}", "channel": "latest"}, {"provider": "s3", "acl": null, "bucket": "${{ secrets.DELTA_AWS_S3_BUCKET_NAME }}", "region": "${{ secrets.DELTA_AWS_REGION}}", "path": "temp-latest", "channel": "latest"}]' electron/package.json > /tmp/package.json + jq '.build.publish = [{"provider": "generic", "url": "https://delta.jan.ai/nightly", "channel": "latest"}, {"provider": "s3", "acl": null, "bucket": "${{ secrets.DELTA_AWS_S3_BUCKET_NAME }}", "region": "${{ secrets.DELTA_AWS_REGION}}", "path": "temp-nightly", "channel": "latest"}]' electron/package.json > /tmp/package.json mv /tmp/package.json electron/package.json jq --arg teamid "${{ secrets.APPLE_TEAM_ID }}" '.build.mac.notarize.teamId = $teamid' electron/package.json > /tmp/package.json mv /tmp/package.json electron/package.json cat electron/package.json + chmod +x .github/scripts/rename-app.sh + .github/scripts/rename-app.sh ./electron/package.json nightly + chmod +x .github/scripts/rename-workspace.sh + .github/scripts/rename-workspace.sh ./package.json nightly + echo "------------------------" + cat ./electron/package.json + echo "------------------------" - name: Change App Name for beta version if: inputs.beta == true shell: bash run: | - chmod +x .github/scripts/rename-app-beta.sh - .github/scripts/rename-app-beta.sh ./electron/package.json - chmod +x .github/scripts/rename-workspace-beta.sh - .github/scripts/rename-workspace-beta.sh ./package.json + chmod +x .github/scripts/rename-app.sh + .github/scripts/rename-app.sh ./electron/package.json beta + chmod +x .github/scripts/rename-workspace.sh + .github/scripts/rename-workspace.sh ./package.json beta echo "------------------------" cat ./electron/package.json echo "------------------------" @@ -186,7 +193,7 @@ jobs: uses: actions/upload-artifact@v4 with: name: jan-mac-arm64-${{ inputs.new_version }} - path: ./electron/dist/jan-mac-arm64-${{ inputs.new_version }}.dmg + path: ./electron/dist/*.dmg - name: Upload Artifact if: inputs.beta == false diff --git a/.github/workflows/template-build-macos-x64.yml b/.github/workflows/template-build-macos-x64.yml index f139797af..7781eb630 100644 --- a/.github/workflows/template-build-macos-x64.yml +++ b/.github/workflows/template-build-macos-x64.yml @@ -72,22 +72,29 @@ jobs: jq --arg version "${{ inputs.new_version }}" '.version = $version' web/package.json > /tmp/package.json mv /tmp/package.json web/package.json - jq '.build.publish = [{"provider": "generic", "url": "${{ secrets.CLOUDFLARE_R2_PUBLIC_URL }}", "channel": "latest"}, {"provider": "s3", "acl": null, "bucket": "${{ secrets.DELTA_AWS_S3_BUCKET_NAME }}", "region": "${{ secrets.DELTA_AWS_REGION}}", "path": "temp-latest", "channel": "latest"}]' electron/package.json > /tmp/package.json + jq '.build.publish = [{"provider": "generic", "url": "https://delta.jan.ai/nightly", "channel": "latest"}, {"provider": "s3", "acl": null, "bucket": "${{ secrets.DELTA_AWS_S3_BUCKET_NAME }}", "region": "${{ secrets.DELTA_AWS_REGION}}", "path": "temp-nightly", "channel": "latest"}]' electron/package.json > /tmp/package.json mv /tmp/package.json electron/package.json jq --arg teamid "${{ secrets.APPLE_TEAM_ID }}" '.build.mac.notarize.teamId = $teamid' electron/package.json > /tmp/package.json mv /tmp/package.json electron/package.json cat electron/package.json + chmod +x .github/scripts/rename-app.sh + .github/scripts/rename-app.sh ./electron/package.json nightly + chmod +x .github/scripts/rename-workspace.sh + .github/scripts/rename-workspace.sh ./package.json nightly + echo "------------------------" + cat ./electron/package.json + echo "------------------------" - name: Change App Name for beta version if: inputs.beta == true shell: bash run: | - chmod +x .github/scripts/rename-app-beta.sh - .github/scripts/rename-app-beta.sh ./electron/package.json - chmod +x .github/scripts/rename-workspace-beta.sh - .github/scripts/rename-workspace-beta.sh ./package.json + chmod +x .github/scripts/rename-app.sh + .github/scripts/rename-app.sh ./electron/package.json beta + chmod +x .github/scripts/rename-workspace.sh + .github/scripts/rename-workspace.sh ./package.json beta echo "------------------------" cat ./electron/package.json echo "------------------------" @@ -186,7 +193,7 @@ jobs: uses: actions/upload-artifact@v4 with: name: jan-mac-x64-${{ inputs.new_version }} - path: ./electron/dist/jan-mac-x64-${{ inputs.new_version }}.dmg + path: ./electron/dist/*.dmg - name: Upload Artifact if: inputs.beta == false diff --git a/.github/workflows/template-build-windows-x64.yml b/.github/workflows/template-build-windows-x64.yml index ffe94fecc..76db4aadc 100644 --- a/.github/workflows/template-build-windows-x64.yml +++ b/.github/workflows/template-build-windows-x64.yml @@ -73,23 +73,34 @@ jobs: jq --arg version "${{ inputs.new_version }}" '.version = $version' web/package.json > /tmp/package.json mv /tmp/package.json web/package.json - jq '.build.publish = [{"provider": "generic", "url": "${{ secrets.CLOUDFLARE_R2_PUBLIC_URL }}", "channel": "latest"}, {"provider": "s3", "acl": null, "bucket": "${{ secrets.DELTA_AWS_S3_BUCKET_NAME }}", "region": "${{ secrets.DELTA_AWS_REGION}}", "path": "temp-latest", "channel": "latest"}]' electron/package.json > /tmp/package.json + jq '.build.publish = [{"provider": "generic", "url": "https://delta.jan.ai/nightly", "channel": "latest"}, {"provider": "s3", "acl": null, "bucket": "${{ secrets.DELTA_AWS_S3_BUCKET_NAME }}", "region": "${{ secrets.DELTA_AWS_REGION}}", "path": "temp-nightly", "channel": "latest"}]' electron/package.json > /tmp/package.json mv /tmp/package.json electron/package.json jq '.build.win.sign = "./sign.js"' electron/package.json > /tmp/package.json mv /tmp/package.json electron/package.json cat electron/package.json + chmod +x .github/scripts/rename-app.sh + .github/scripts/rename-app.sh ./electron/package.json nightly + chmod +x .github/scripts/rename-workspace.sh + .github/scripts/rename-workspace.sh ./package.json nightly + chmod +x .github/scripts/rename-uninstaller.sh + .github/scripts/rename-uninstaller.sh nightly + echo "------------------------" + cat ./electron/package.json + echo "------------------------" + cat ./package.json + echo "------------------------" - name: Change App Name for beta version if: inputs.beta == true shell: bash run: | - chmod +x .github/scripts/rename-app-beta.sh - .github/scripts/rename-app-beta.sh ./electron/package.json - chmod +x .github/scripts/rename-workspace-beta.sh - .github/scripts/rename-workspace-beta.sh ./package.json - chmod +x .github/scripts/rename-uninstaller-beta.sh - .github/scripts/rename-uninstaller-beta.sh + chmod +x .github/scripts/rename-app.sh + .github/scripts/rename-app.sh ./electron/package.json beta + chmod +x .github/scripts/rename-workspace.sh + .github/scripts/rename-workspace.sh ./package.json beta + chmod +x .github/scripts/rename-uninstaller.sh + .github/scripts/rename-uninstaller.sh beta echo "------------------------" cat ./electron/package.json echo "------------------------" diff --git a/electron/package.json b/electron/package.json index 4768ae5b7..662a912f0 100644 --- a/electron/package.json +++ b/electron/package.json @@ -113,7 +113,7 @@ "@kirillvakalov/nut-tree__nut-js": "4.2.1-2" }, "devDependencies": { - "@electron/notarize": "^2.3.2", + "@electron/notarize": "^2.5.0", "@playwright/test": "^1.38.1", "@types/npmcli__arborist": "^5.6.4", "@types/pacote": "^11.1.7", diff --git a/web/containers/ErrorMessage/index.test.tsx b/web/containers/ErrorMessage/index.test.tsx index 99dad5415..d2ae5aa81 100644 --- a/web/containers/ErrorMessage/index.test.tsx +++ b/web/containers/ErrorMessage/index.test.tsx @@ -1,54 +1,43 @@ // ErrorMessage.test.tsx -import React from 'react'; -import { render, screen, fireEvent } from '@testing-library/react'; -import '@testing-library/jest-dom'; -import ErrorMessage from './index'; -import { ThreadMessage, MessageStatus, ErrorCode } from '@janhq/core'; -import { useAtomValue, useSetAtom } from 'jotai'; -import useSendChatMessage from '@/hooks/useSendChatMessage'; +import React from 'react' +import { render, screen, fireEvent } from '@testing-library/react' +import '@testing-library/jest-dom' +import ErrorMessage from './index' +import { ThreadMessage, MessageStatus, ErrorCode } from '@janhq/core' +import { useAtomValue, useSetAtom } from 'jotai' +import useSendChatMessage from '@/hooks/useSendChatMessage' // Mock the dependencies jest.mock('jotai', () => { - const originalModule = jest.requireActual('jotai') - return { - ...originalModule, - useAtomValue: jest.fn(), - useSetAtom: jest.fn(), - } - }) + const originalModule = jest.requireActual('jotai') + return { + ...originalModule, + useAtomValue: jest.fn(), + useSetAtom: jest.fn(), + } +}) jest.mock('@/hooks/useSendChatMessage', () => ({ __esModule: true, default: jest.fn(), -})); +})) describe('ErrorMessage Component', () => { - const mockSetMainState = jest.fn(); - const mockSetSelectedSettingScreen = jest.fn(); - const mockSetModalTroubleShooting = jest.fn(); - const mockResendChatMessage = jest.fn(); + const mockSetMainState = jest.fn() + const mockSetSelectedSettingScreen = jest.fn() + const mockSetModalTroubleShooting = jest.fn() + const mockResendChatMessage = jest.fn() beforeEach(() => { - jest.clearAllMocks(); - (useAtomValue as jest.Mock).mockReturnValue([]); - (useSetAtom as jest.Mock).mockReturnValue(mockSetMainState); - (useSetAtom as jest.Mock).mockReturnValue(mockSetSelectedSettingScreen); - (useSetAtom as jest.Mock).mockReturnValue(mockSetModalTroubleShooting); - (useSendChatMessage as jest.Mock).mockReturnValue({ resendChatMessage: mockResendChatMessage }); - }); - - it('renders stopped message correctly', () => { - const message: ThreadMessage = { - id: '1', - status: MessageStatus.Stopped, - content: [{ text: { value: 'Test message' } }], - } as ThreadMessage; - - render(); - - expect(screen.getByText("Oops! The generation was interrupted. Let's give it another go!")).toBeInTheDocument(); - expect(screen.getByText('Regenerate')).toBeInTheDocument(); - }); + jest.clearAllMocks() + ;(useAtomValue as jest.Mock).mockReturnValue([]) + ;(useSetAtom as jest.Mock).mockReturnValue(mockSetMainState) + ;(useSetAtom as jest.Mock).mockReturnValue(mockSetSelectedSettingScreen) + ;(useSetAtom as jest.Mock).mockReturnValue(mockSetModalTroubleShooting) + ;(useSendChatMessage as jest.Mock).mockReturnValue({ + resendChatMessage: mockResendChatMessage, + }) + }) it('renders error message with InvalidApiKey correctly', () => { const message: ThreadMessage = { @@ -56,13 +45,13 @@ describe('ErrorMessage Component', () => { status: MessageStatus.Error, error_code: ErrorCode.InvalidApiKey, content: [{ text: { value: 'Invalid API Key' } }], - } as ThreadMessage; + } as ThreadMessage - render(); - - expect(screen.getByTestId('invalid-API-key-error')).toBeInTheDocument(); - expect(screen.getByText('Settings')).toBeInTheDocument(); - }); + render() + + expect(screen.getByTestId('invalid-API-key-error')).toBeInTheDocument() + expect(screen.getByText('Settings')).toBeInTheDocument() + }) it('renders general error message correctly', () => { const message: ThreadMessage = { @@ -70,26 +59,15 @@ describe('ErrorMessage Component', () => { status: MessageStatus.Error, error_code: ErrorCode.Unknown, content: [{ text: { value: 'Unknown error occurred' } }], - } as ThreadMessage; + } as ThreadMessage - render(); - - expect(screen.getByText("Apologies, something’s amiss!")).toBeInTheDocument(); - expect(screen.getByText('troubleshooting assistance')).toBeInTheDocument(); - }); + render() - it('calls regenerateMessage when Regenerate button is clicked', () => { - const message: ThreadMessage = { - id: '1', - status: MessageStatus.Stopped, - content: [{ text: { value: 'Test message' } }], - } as ThreadMessage; - - render(); - - fireEvent.click(screen.getByText('Regenerate')); - expect(mockResendChatMessage).toHaveBeenCalled(); - }); + expect( + screen.getByText('Apologies, something’s amiss!') + ).toBeInTheDocument() + expect(screen.getByText('troubleshooting assistance')).toBeInTheDocument() + }) it('opens troubleshooting modal when link is clicked', () => { const message: ThreadMessage = { @@ -97,11 +75,11 @@ describe('ErrorMessage Component', () => { status: MessageStatus.Error, error_code: ErrorCode.Unknown, content: [{ text: { value: 'Unknown error occurred' } }], - } as ThreadMessage; + } as ThreadMessage - render(); - - fireEvent.click(screen.getByText('troubleshooting assistance')); - expect(mockSetModalTroubleShooting).toHaveBeenCalledWith(true); - }); -}); + render() + + fireEvent.click(screen.getByText('troubleshooting assistance')) + expect(mockSetModalTroubleShooting).toHaveBeenCalledWith(true) + }) +}) diff --git a/web/containers/ErrorMessage/index.tsx b/web/containers/ErrorMessage/index.tsx index bcd056b93..add2bd89b 100644 --- a/web/containers/ErrorMessage/index.tsx +++ b/web/containers/ErrorMessage/index.tsx @@ -4,9 +4,8 @@ import { MessageStatus, ThreadMessage, } from '@janhq/core' -import { Button } from '@janhq/joi' + import { useAtomValue, useSetAtom } from 'jotai' -import { RefreshCcw } from 'lucide-react' import AutoLink from '@/containers/AutoLink' import ModalTroubleShooting, { @@ -15,27 +14,17 @@ import ModalTroubleShooting, { import { MainViewState } from '@/constants/screens' -import useSendChatMessage from '@/hooks/useSendChatMessage' - import { mainViewStateAtom } from '@/helpers/atoms/App.atom' -import { getCurrentChatMessagesAtom } from '@/helpers/atoms/ChatMessage.atom' + import { selectedSettingAtom } from '@/helpers/atoms/Setting.atom' import { activeThreadAtom } from '@/helpers/atoms/Thread.atom' const ErrorMessage = ({ message }: { message: ThreadMessage }) => { - const messages = useAtomValue(getCurrentChatMessagesAtom) - const { resendChatMessage } = useSendChatMessage() const setModalTroubleShooting = useSetAtom(modalTroubleShootingAtom) const setMainState = useSetAtom(mainViewStateAtom) const setSelectedSettingScreen = useSetAtom(selectedSettingAtom) const activeThread = useAtomValue(activeThreadAtom) - const regenerateMessage = async () => { - const lastMessageIndex = messages.length - 1 - const message = messages[lastMessageIndex] - resendChatMessage(message) - } - const getErrorTitle = () => { switch (message.error_code) { case ErrorCode.Unknown: @@ -77,23 +66,6 @@ const ErrorMessage = ({ message }: { message: ThreadMessage }) => { return (
- {message.status === MessageStatus.Stopped && ( -
- - Oops! The generation was interrupted. Let's give it another go! - - -
- )} {message.status === MessageStatus.Error && (
{
= (props) => { ) : (
diff --git a/web/screens/Thread/ThreadCenterPanel/index.tsx b/web/screens/Thread/ThreadCenterPanel/index.tsx index 2440af2c5..3f74181f7 100644 --- a/web/screens/Thread/ThreadCenterPanel/index.tsx +++ b/web/screens/Thread/ThreadCenterPanel/index.tsx @@ -25,6 +25,7 @@ import ChatBody from '@/screens/Thread/ThreadCenterPanel/ChatBody' import ChatInput from './ChatInput' import RequestDownloadModel from './RequestDownloadModel' +import { showSystemMonitorPanelAtom } from '@/helpers/atoms/App.atom' import { experimentalFeatureEnabledAtom } from '@/helpers/atoms/AppConfig.atom' import { activeThreadAtom } from '@/helpers/atoms/Thread.atom' @@ -144,6 +145,8 @@ const ThreadCenterPanel = () => { const isGeneratingResponse = useAtomValue(isGeneratingResponseAtom) + const showSystemMonitorPanel = useAtomValue(showSystemMonitorPanelAtom) + return (
{
)} -
+
{activeThread ? (