From 7ee439c7d3a25e68f5a623ce4163418ef5cb3341 Mon Sep 17 00:00:00 2001 From: Daniel <101145494+dan-jan@users.noreply.github.com> Date: Mon, 20 Nov 2023 22:57:56 +0800 Subject: [PATCH 1/4] Make Windows Installation more succinct --- docs/docs/install/windows.md | 60 ++++++++++++++++++++++++++++++------ docs/sidebars.js | 8 ++++- 2 files changed, 57 insertions(+), 11 deletions(-) diff --git a/docs/docs/install/windows.md b/docs/docs/install/windows.md index 00a30a199..1f1aab601 100644 --- a/docs/docs/install/windows.md +++ b/docs/docs/install/windows.md @@ -2,19 +2,59 @@ title: Windows --- -# Jan on Windows +# Installing Jan on Windows ## Installation -1. To download the lastest version of Jan on Windows, please visit the [Jan's homepage](https://jan.ai/). -2. Once Jan installer (jan-win-x64-{version}.exe) is downloaded, run the installer. The installation process is expected to take around a minute. -3. By default, Jan is installed under this directory + +Jan is available for download via our homepage, [https://jan.ai](https://jan.ai/). + +For Windows, the download should be available as a `.exe` file in the following format. + ```bash +jan-win-x64-{version}.exe +``` + +The typical installation process takes around a minute. + +### Github Releases + +Jan is also available from [Jan's Github Releases](https://github.com/janhq/jan/releases) page, with a recommended [latest stable release](https://github.com/janhq/jan/releases/latest). + +Within the Releases' assets, you will find the following files for Windows: + +```bash +# Windows Installers +jan-win-x64-{version}.exe +jan-win-x64-{version}.exe.blockmap +``` + +### Default Installation Directory + +By default, Jan is installed in the following directory: + +```bash +# Default installation directory C:\Users\{username}\AppData\Local\Programs\Jan ``` -## Uninstall Jan -If you have installed Jan on your Windows computer, either as a User or System installation, you can easily uninstall it by going to the Windows Control Panel. -In case you wish to completely remove all user data associated with Jan after uninstallation, you can delete the user data folders located at `%APPDATA%\Jan`. This will return your system to its state prior to the installation of Jan. This method can also be used to reset all settings if you are experiencing any issues with Jan. -## Common Questions -### Microsoft Defender SmartScreen prevented an unrecognized app from starting -When initiating the Jan Installer, be aware that Windows Defender may display a warning. This warning is a standard security measure, as the installer will make changes to the system. To proceed with the installation, navigate through the warning options, typically found in "More info" section and select the appropriate option to continue with the installation. \ No newline at end of file +## Uninstalling Jan + +To uninstall Jan in Windows, use the [Windows Control Panel](https://support.microsoft.com/en-us/windows/uninstall-or-remove-apps-and-programs-in-windows-4b55f974-2cc6-2d2b-d092-5905080eaf98). + +To remove all user data associated with Jan, you can delete the `/Jan` directory in Windows' [AppData directory](https://superuser.com/questions/632891/what-is-appdata). + +```shell +# Jan's User Data directory +%AppData%\Jan +``` + +## Troubleshooting + +### Microsoft Defender SmartScreen + +**Error: "Microsoft Defender Smartscreen prevented an unrecognized app from starting"** + +Windows Defender may display the above warning when running the Jan Installer, as a standard security measure. + +To proceed, select the "More info" option and select the appropriate option to continue with the installation. + diff --git a/docs/sidebars.js b/docs/sidebars.js index 477b82a54..83eb50f5f 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -25,9 +25,15 @@ const sidebars = { { type: "category", label: "Installation", + link: { type: "doc", id: "install/overview" }, collapsible: true, collapsed: true, - items: ["install/overview","install/windows", "install/mac", "install/linux", "install/from-source"], + items: [ + "install/windows", + "install/mac", + "install/linux", + "install/from-source", + ], }, { type: "category", From 333408c06e054922cd667317e23b0db4ba549124 Mon Sep 17 00:00:00 2001 From: Daniel <101145494+dan-jan@users.noreply.github.com> Date: Mon, 20 Nov 2023 23:14:10 +0800 Subject: [PATCH 2/4] Shorten H3 --- docs/docs/install/windows.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/install/windows.md b/docs/docs/install/windows.md index 1f1aab601..a0d2912ca 100644 --- a/docs/docs/install/windows.md +++ b/docs/docs/install/windows.md @@ -50,7 +50,7 @@ To remove all user data associated with Jan, you can delete the `/Jan` directory ## Troubleshooting -### Microsoft Defender SmartScreen +### Microsoft Defender **Error: "Microsoft Defender Smartscreen prevented an unrecognized app from starting"** From eba225c888fdd805270fd2cd414764812e1e7046 Mon Sep 17 00:00:00 2001 From: hieu-jan <150573299+hieu-jan@users.noreply.github.com> Date: Wed, 22 Nov 2023 17:57:26 +0900 Subject: [PATCH 3/4] docs: update window installation guide --- docs/docs/install/windows.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/docs/install/windows.md b/docs/docs/install/windows.md index a0d2912ca..fd3f173c3 100644 --- a/docs/docs/install/windows.md +++ b/docs/docs/install/windows.md @@ -25,7 +25,6 @@ Within the Releases' assets, you will find the following files for Windows: ```bash # Windows Installers jan-win-x64-{version}.exe -jan-win-x64-{version}.exe.blockmap ``` ### Default Installation Directory @@ -56,5 +55,5 @@ To remove all user data associated with Jan, you can delete the `/Jan` directory Windows Defender may display the above warning when running the Jan Installer, as a standard security measure. -To proceed, select the "More info" option and select the appropriate option to continue with the installation. +To proceed, select the "More info" option and select the "Run Anyway" option to continue with the installation. From f7f1e3da74381a6da6484f8f6ae11206c23aaeed Mon Sep 17 00:00:00 2001 From: Louis Date: Thu, 23 Nov 2023 13:50:34 +0700 Subject: [PATCH 4/4] fix: app shows wrong performance tag, all say not enough ram on windows --- web/containers/ModalCancelDownload/index.tsx | 2 - web/hooks/useGetPerformanceTag.ts | 45 +++++++++---------- .../ExploreModelItemHeader/index.tsx | 27 ++++++++--- 3 files changed, 43 insertions(+), 31 deletions(-) diff --git a/web/containers/ModalCancelDownload/index.tsx b/web/containers/ModalCancelDownload/index.tsx index 3413d02c4..33476fda1 100644 --- a/web/containers/ModalCancelDownload/index.tsx +++ b/web/containers/ModalCancelDownload/index.tsx @@ -16,7 +16,6 @@ import { import { atom, useAtomValue } from 'jotai' import { useDownloadState } from '@/hooks/useDownloadState' -import useGetPerformanceTag from '@/hooks/useGetPerformanceTag' import { formatDownloadPercentage } from '@/utils/converter' @@ -30,7 +29,6 @@ export default function ModalCancelDownload({ isFromList, }: Props) { const { modelDownloadStateAtom } = useDownloadState() - useGetPerformanceTag() const downloadAtom = useMemo( () => atom((get) => get(modelDownloadStateAtom)[suitableModel.name]), // eslint-disable-next-line react-hooks/exhaustive-deps diff --git a/web/hooks/useGetPerformanceTag.ts b/web/hooks/useGetPerformanceTag.ts index 4c9934778..435f82c4c 100644 --- a/web/hooks/useGetPerformanceTag.ts +++ b/web/hooks/useGetPerformanceTag.ts @@ -1,40 +1,37 @@ -import { useState } from 'react' - import { ModelVersion } from '@janhq/core/lib/types' -import { useAtomValue } from 'jotai' import { ModelPerformance, TagType } from '@/constants/tagType' -import { totalRamAtom } from '@/helpers/atoms/SystemBar.atom' - // Recommendation: // `Recommended (green)`: "Max RAM required" is 80% of users max RAM. // `Slow on your device (yellow)`: Max RAM required is 80-100% of users max RAM // `Not enough RAM (red)`: User RAM is below "Max RAM required" export default function useGetPerformanceTag() { - const [performanceTag, setPerformanceTag] = useState() - const totalRam = useAtomValue(totalRamAtom) - - const getPerformanceForModel = async (modelVersion: ModelVersion) => { + async function getPerformanceForModel( + modelVersion: ModelVersion, + totalRam: number + ): Promise<{ title: string; performanceTag: TagType }> { const requiredRam = modelVersion.maxRamRequired - setPerformanceTag(calculateRamPerformance(requiredRam, totalRam)) + const performanceTag = calculateRamPerformance(requiredRam, totalRam) + + let title = '' + + switch (performanceTag) { + case ModelPerformance.PerformancePositive: + title = 'Recommended' + break + case ModelPerformance.PerformanceNeutral: + title = 'Slow on your device' + break + case ModelPerformance.PerformanceNegative: + title = 'Not enough RAM' + break + } + return { title, performanceTag } } - let title = '' - switch (performanceTag) { - case ModelPerformance.PerformancePositive: - title = 'Recommended' - break - case ModelPerformance.PerformanceNeutral: - title = 'Slow on your device' - break - case ModelPerformance.PerformanceNegative: - title = 'Not enough RAM' - break - } - - return { performanceTag, title, getPerformanceForModel } + return { getPerformanceForModel } } const calculateRamPerformance = ( diff --git a/web/screens/ExploreModels/ExploreModelItemHeader/index.tsx b/web/screens/ExploreModels/ExploreModelItemHeader/index.tsx index fe3c9c3e9..31a9933ee 100644 --- a/web/screens/ExploreModels/ExploreModelItemHeader/index.tsx +++ b/web/screens/ExploreModels/ExploreModelItemHeader/index.tsx @@ -1,5 +1,5 @@ /* eslint-disable react-hooks/exhaustive-deps */ -import { useCallback, useEffect, useMemo } from 'react' +import { useCallback, useEffect, useMemo, useState } from 'react' import { ModelCatalog, ModelVersion } from '@janhq/core/lib/types' import { Badge, Button } from '@janhq/uikit' @@ -20,6 +20,8 @@ import { useMainViewState } from '@/hooks/useMainViewState' import { toGigabytes } from '@/utils/converter' +import { totalRamAtom } from '@/helpers/atoms/SystemBar.atom' + type Props = { suitableModel: ModelVersion exploreModel: ModelCatalog @@ -32,8 +34,12 @@ const ExploreModelItemHeader: React.FC = ({ const { downloadModel } = useDownloadModel() const { downloadedModels } = useGetDownloadedModels() const { modelDownloadStateAtom, downloadStates } = useDownloadState() - const { performanceTag, title, getPerformanceForModel } = - useGetPerformanceTag() + const { getPerformanceForModel } = useGetPerformanceTag() + const [title, setTitle] = useState('Recommended') + const totalRam = useAtomValue(totalRamAtom) + const [performanceTag, setPerformanceTag] = useState( + ModelPerformance.PerformancePositive + ) const downloadAtom = useMemo( () => atom((get) => get(modelDownloadStateAtom)[suitableModel.name]), [suitableModel.name] @@ -41,9 +47,20 @@ const ExploreModelItemHeader: React.FC = ({ const downloadState = useAtomValue(downloadAtom) const { setMainViewState } = useMainViewState() + const calculatePerformance = useCallback( + (suitableModel: ModelVersion) => async () => { + const { title, performanceTag } = await getPerformanceForModel( + suitableModel, + totalRam + ) + setPerformanceTag(performanceTag) + setTitle(title) + }, + [totalRam] + ) + useEffect(() => { - getPerformanceForModel(suitableModel) - // eslint-disable-next-line react-hooks/exhaustive-deps + calculatePerformance(suitableModel) }, [suitableModel]) const onDownloadClick = useCallback(() => {