diff --git a/.github/workflows/app.yml b/.github/workflows/app.yml
new file mode 100644
index 0000000..01c44e2
--- /dev/null
+++ b/.github/workflows/app.yml
@@ -0,0 +1,91 @@
+name: Release App
+
+on:
+ workflow_dispatch:
+ release:
+ types: [published]
+
+jobs:
+ create-release:
+ permissions:
+ contents: write
+ runs-on: ubuntu-20.04
+ outputs:
+ release_id: ${{ steps.create-release.outputs.result }}
+
+ steps:
+ - uses: actions/checkout@v3
+ - name: setup node
+ uses: actions/setup-node@v3
+ with:
+ node-version: 16
+ - name: get version
+ run: echo "PACKAGE_VERSION=$(node -p "require('./package.json').version")" >> $GITHUB_ENV
+ - name: create release
+ id: create-release
+ uses: actions/github-script@v6
+ with:
+ script: |
+ const { data } = await github.rest.repos.createRelease({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ tag_name: `app-v${process.env.PACKAGE_VERSION}`,
+ name: `Desktop App v${process.env.PACKAGE_VERSION}`,
+ body: 'Take a look at the assets to download and install this app.',
+ draft: true,
+ prerelease: false
+ })
+ return data.id
+
+ build-tauri:
+ needs: create-release
+ permissions:
+ contents: write
+ strategy:
+ fail-fast: false
+ matrix:
+ platform: [macos-latest, ubuntu-20.04, windows-latest]
+
+ runs-on: ${{ matrix.platform }}
+ steps:
+ - uses: actions/checkout@v3
+ - name: setup node
+ uses: actions/setup-node@v3
+ with:
+ node-version: 16
+ - name: install Rust stable
+ uses: dtolnay/rust-toolchain@stable
+ - name: install dependencies (ubuntu only)
+ if: matrix.platform == 'ubuntu-20.04'
+ run: |
+ sudo apt-get update
+ sudo apt-get install -y libgtk-3-dev libwebkit2gtk-4.0-dev libappindicator3-dev librsvg2-dev patchelf
+ - name: install frontend dependencies
+ run: yarn install # change this to npm or pnpm depending on which one you use
+ - uses: tauri-apps/tauri-action@v0
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ with:
+ releaseId: ${{ needs.create-release.outputs.release_id }}
+
+ publish-release:
+ permissions:
+ contents: write
+ runs-on: ubuntu-20.04
+ needs: [create-release, build-tauri]
+
+ steps:
+ - name: publish release
+ id: publish-release
+ uses: actions/github-script@v6
+ env:
+ release_id: ${{ needs.create-release.outputs.release_id }}
+ with:
+ script: |
+ github.rest.repos.updateRelease({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ release_id: process.env.release_id,
+ draft: false,
+ prerelease: false
+ })
diff --git a/.github/workflows/sync.yml b/.github/workflows/sync.yml
index a4c14c8..ebf5587 100644
--- a/.github/workflows/sync.yml
+++ b/.github/workflows/sync.yml
@@ -35,6 +35,6 @@ jobs:
- name: Sync check
if: failure()
run: |
- echo "::error::由于权限不足,导致同步失败(这是预期的行为),请前往仓库首页手动执行[Sync fork]。"
- echo "::error::Due to insufficient permissions, synchronization failed (as expected). Please go to the repository homepage and manually perform [Sync fork]."
+ echo "[Error] 由于上游仓库的 workflow 文件变更,导致 GitHub 自动暂停了本次自动更新,你需要手动 Sync Fork 一次,详细教程请查看:https://github.com/Yidadaa/ChatGPT-Next-Web/blob/main/README_CN.md#%E6%89%93%E5%BC%80%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0"
+ echo "[Error] Due to a change in the workflow file of the upstream repository, GitHub has automatically suspended the scheduled automatic update. You need to manually sync your fork. Please refer to the detailed tutorial for instructions: https://github.com/Yidadaa/ChatGPT-Next-Web#enable-automatic-updates"
exit 1
diff --git a/app/components/chat.tsx b/app/components/chat.tsx
index ffd2b7d..38daa3c 100644
--- a/app/components/chat.tsx
+++ b/app/components/chat.tsx
@@ -1,5 +1,11 @@
import { useDebouncedCallback } from "use-debounce";
-import React, { useState, useRef, useEffect, useLayoutEffect } from "react";
+import React, {
+ useState,
+ useRef,
+ useEffect,
+ useLayoutEffect,
+ useMemo,
+} from "react";
import SendWhiteIcon from "../icons/send-white.svg";
import BrainIcon from "../icons/brain.svg";
@@ -61,6 +67,7 @@ import { useMaskStore } from "../store/mask";
import { useCommand } from "../command";
import { prettyObject } from "../utils/format";
import { ExportMessageModal } from "./exporter";
+import { getClientConfig } from "../config/client";
const Markdown = dynamic(async () => (await import("./markdown")).Markdown, {
loading: () => ,
@@ -704,9 +711,13 @@ export function Chat() {
}
};
+ const clientConfig = useMemo(() => getClientConfig(), []);
+
const location = useLocation();
const isChat = location.pathname === Path.Chat;
+
const autoFocus = !isMobileScreen || isChat; // only focus in chat page
+ const showMaxIcon = !isMobileScreen && !clientConfig?.isApp;
useCommand({
fill: setUserInput,
@@ -755,7 +766,7 @@ export function Chat() {
}}
/>
- {!isMobileScreen && (
+ {showMaxIcon && (
:
}
diff --git a/app/components/settings.tsx b/app/components/settings.tsx
index 4f8379f..38e6107 100644
--- a/app/components/settings.tsx
+++ b/app/components/settings.tsx
@@ -286,6 +286,9 @@ export function Settings() {
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
+ const clientConfig = useMemo(() => getClientConfig(), []);
+ const showAccessCode = enabledAccessControl && !clientConfig?.isApp;
+
return (
@@ -485,7 +488,7 @@ export function Settings() {
- {enabledAccessControl ? (
+ {showAccessCode ? (
{
return {
commitId: COMMIT_ID,
buildMode: process.env.BUILD_MODE ?? "standalone",
+ isApp: !!process.env.BUILD_APP,
};
};
diff --git a/app/config/server.ts b/app/config/server.ts
index f5fee71..0f6e6fb 100644
--- a/app/config/server.ts
+++ b/app/config/server.ts
@@ -11,6 +11,7 @@ declare global {
HIDE_USER_API_KEY?: string; // disable user's api key input
DISABLE_GPT4?: string; // allow user to use gpt-4 or not
BUILD_MODE?: "standalone" | "export";
+ BUILD_APP?: string; // is building desktop app
}
}
}
diff --git a/app/store/access.ts b/app/store/access.ts
index daefa0a..0601903 100644
--- a/app/store/access.ts
+++ b/app/store/access.ts
@@ -60,7 +60,7 @@ export const useAccessStore = create()(
);
},
fetch() {
- if (fetchState > 0) return;
+ if (fetchState > 0 || getClientConfig()?.buildMode === "export") return;
fetchState = 1;
fetch("/api/config", {
method: "post",
diff --git a/app/store/config.ts b/app/store/config.ts
index 3378b9c..6858fc5 100644
--- a/app/store/config.ts
+++ b/app/store/config.ts
@@ -1,6 +1,7 @@
import { create } from "zustand";
import { persist } from "zustand/middleware";
import { StoreKey } from "../constant";
+import { getBuildConfig } from "../config/build";
export enum SubmitKey {
Enter = "Enter",
@@ -21,7 +22,7 @@ export const DEFAULT_CONFIG = {
avatar: "1f603",
fontSize: 14,
theme: Theme.Auto as Theme,
- tightBorder: false,
+ tightBorder: !getBuildConfig().isApp,
sendPreviewBubble: true,
sidebarWidth: 300,
diff --git a/package.json b/package.json
index b7e920e..35a98e0 100644
--- a/package.json
+++ b/package.json
@@ -7,9 +7,10 @@
"build": "next build",
"start": "next start",
"lint": "next lint",
- "export": "BUILD_MODE=export yarn build",
- "export:dev": "BUILD_MODE=export yarn dev",
+ "export": "cross-env BUILD_MODE=export BUILD_APP=1 yarn build",
+ "export:dev": "cross-env BUILD_MODE=export BUILD_APP=1 yarn dev",
"app:dev": "yarn tauri dev",
+ "app:build": "yarn tauri build",
"prompts": "node ./scripts/fetch-prompts.mjs",
"prepare": "husky install",
"proxy-dev": "sh ./scripts/init-proxy.sh && proxychains -f ./scripts/proxychains.conf yarn dev"
diff --git a/src-tauri/icons/128x128.png b/src-tauri/icons/128x128.png
index 77e7d23..7fee8db 100644
Binary files a/src-tauri/icons/128x128.png and b/src-tauri/icons/128x128.png differ
diff --git a/src-tauri/icons/128x128@2x.png b/src-tauri/icons/128x128@2x.png
index 0f7976f..178761b 100644
Binary files a/src-tauri/icons/128x128@2x.png and b/src-tauri/icons/128x128@2x.png differ
diff --git a/src-tauri/icons/32x32.png b/src-tauri/icons/32x32.png
index 98fda06..471cdbb 100644
Binary files a/src-tauri/icons/32x32.png and b/src-tauri/icons/32x32.png differ
diff --git a/src-tauri/icons/Square107x107Logo.png b/src-tauri/icons/Square107x107Logo.png
index f35d84f..241e101 100644
Binary files a/src-tauri/icons/Square107x107Logo.png and b/src-tauri/icons/Square107x107Logo.png differ
diff --git a/src-tauri/icons/Square142x142Logo.png b/src-tauri/icons/Square142x142Logo.png
index 1823bb2..b27ce75 100644
Binary files a/src-tauri/icons/Square142x142Logo.png and b/src-tauri/icons/Square142x142Logo.png differ
diff --git a/src-tauri/icons/Square150x150Logo.png b/src-tauri/icons/Square150x150Logo.png
index dc2b22c..d9d58df 100644
Binary files a/src-tauri/icons/Square150x150Logo.png and b/src-tauri/icons/Square150x150Logo.png differ
diff --git a/src-tauri/icons/Square284x284Logo.png b/src-tauri/icons/Square284x284Logo.png
index 0ed3984..64dd15d 100644
Binary files a/src-tauri/icons/Square284x284Logo.png and b/src-tauri/icons/Square284x284Logo.png differ
diff --git a/src-tauri/icons/Square30x30Logo.png b/src-tauri/icons/Square30x30Logo.png
index 60bf0ea..c585069 100644
Binary files a/src-tauri/icons/Square30x30Logo.png and b/src-tauri/icons/Square30x30Logo.png differ
diff --git a/src-tauri/icons/Square310x310Logo.png b/src-tauri/icons/Square310x310Logo.png
index c8ca0ad..70b0b5d 100644
Binary files a/src-tauri/icons/Square310x310Logo.png and b/src-tauri/icons/Square310x310Logo.png differ
diff --git a/src-tauri/icons/Square44x44Logo.png b/src-tauri/icons/Square44x44Logo.png
index 8756459..6657a96 100644
Binary files a/src-tauri/icons/Square44x44Logo.png and b/src-tauri/icons/Square44x44Logo.png differ
diff --git a/src-tauri/icons/Square71x71Logo.png b/src-tauri/icons/Square71x71Logo.png
index 2c8023c..865a99e 100644
Binary files a/src-tauri/icons/Square71x71Logo.png and b/src-tauri/icons/Square71x71Logo.png differ
diff --git a/src-tauri/icons/Square89x89Logo.png b/src-tauri/icons/Square89x89Logo.png
index 2c5e603..4be7164 100644
Binary files a/src-tauri/icons/Square89x89Logo.png and b/src-tauri/icons/Square89x89Logo.png differ
diff --git a/src-tauri/icons/StoreLogo.png b/src-tauri/icons/StoreLogo.png
index 17d142c..9791b7a 100644
Binary files a/src-tauri/icons/StoreLogo.png and b/src-tauri/icons/StoreLogo.png differ
diff --git a/src-tauri/icons/icon.icns b/src-tauri/icons/icon.icns
index a2993ad..deca5bc 100644
Binary files a/src-tauri/icons/icon.icns and b/src-tauri/icons/icon.icns differ
diff --git a/src-tauri/icons/icon.ico b/src-tauri/icons/icon.ico
index 06c23c8..59f1568 100644
Binary files a/src-tauri/icons/icon.ico and b/src-tauri/icons/icon.ico differ
diff --git a/src-tauri/icons/icon.png b/src-tauri/icons/icon.png
index d1756ce..3ae7ae9 100644
Binary files a/src-tauri/icons/icon.png and b/src-tauri/icons/icon.png differ
diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json
index 9db5da4..b5f33cd 100644
--- a/src-tauri/tauri.conf.json
+++ b/src-tauri/tauri.conf.json
@@ -29,8 +29,8 @@
"icons/icon.icns",
"icons/icon.ico"
],
- "identifier": "com.yida.chatgpt.nextweb",
- "longDescription": "",
+ "identifier": "com.yida.chatgpt.next.web",
+ "longDescription": "ChatGPT Next Web is a cross-platform ChatGPT client, including Web/Win/Linux/OSX/PWA.",
"macOS": {
"entitlements": null,
"exceptionDomain": "",
@@ -39,7 +39,7 @@
"signingIdentity": null
},
"resources": [],
- "shortDescription": "",
+ "shortDescription": "ChatGPT Next Web App",
"targets": "all",
"windows": {
"certificateThumbprint": null,
@@ -59,7 +59,7 @@
"height": 600,
"resizable": true,
"title": "tauri-next",
- "width": 800
+ "width": 960
}
]
}