Merge branch 'main' into screenshare
This commit is contained in:
commit
f34f42b161
28 changed files with 681 additions and 164 deletions
16
.github/workflows/release.yml
vendored
16
.github/workflows/release.yml
vendored
|
@ -26,19 +26,3 @@ jobs:
|
||||||
with:
|
with:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
RELEASE: true
|
RELEASE: true
|
||||||
|
|
||||||
- name: Update AUR package
|
|
||||||
if: ${{ matrix.os == 'ubuntu-latest' }}
|
|
||||||
run: |
|
|
||||||
mkdir -p -m 700 ~/.ssh
|
|
||||||
echo $SSH_KEY > ~/.ssh/aur
|
|
||||||
echo $SSH_PUB_KEY > ~/.ssh/aur.pub
|
|
||||||
chmod 600 ~/.ssh/*
|
|
||||||
|
|
||||||
export GIT_SSH_COMMAND="ssh -i ~/.ssh/aur"
|
|
||||||
|
|
||||||
sudo ./scripts/ci/install_makepkg.sh
|
|
||||||
./scripts/ci/aur_bump.sh
|
|
||||||
env:
|
|
||||||
SSH_KEY: ${{ secrets.AUR_SSH_KEY }}
|
|
||||||
SSH_PUB_KEY: ${{ secrets.AUR_SSH_PUB_KEY }}
|
|
||||||
|
|
12
README.md
12
README.md
|
@ -1,8 +1,16 @@
|
||||||
# Vencord Desktop
|
# Vencord Desktop
|
||||||
|
|
||||||
A standalone Electron app that loads Discord & Vencord
|
Vencord Desktop is a cross platform desktop app aiming to give you a snappier Discord experience with Vencord pre-installed
|
||||||
|
|
||||||
Vencord Desktop is currently in very early alpha. Bug reports, feature requests & contributions are highly appreciated!!
|
Vencord Desktop is currently in beta
|
||||||
|
|
||||||
|
**Not yet supported**:
|
||||||
|
- Screensharing
|
||||||
|
- Global Keybinds
|
||||||
|
|
||||||
|
Bug reports, feature requests & contributions are highly appreciated!!
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
## Installing
|
## Installing
|
||||||
|
|
||||||
|
|
26
package.json
26
package.json
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "VencordDesktop",
|
"name": "VencordDesktop",
|
||||||
"version": "0.1.8",
|
"version": "0.2.1",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "",
|
"description": "",
|
||||||
"keywords": [],
|
"keywords": [],
|
||||||
|
@ -22,11 +22,16 @@
|
||||||
"testTypes": "tsc --noEmit",
|
"testTypes": "tsc --noEmit",
|
||||||
"watch": "pnpm build --watch"
|
"watch": "pnpm build --watch"
|
||||||
},
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"arrpc": "^3.1.0"
|
||||||
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@fal-works/esbuild-plugin-global-externals": "^2.1.2",
|
||||||
"@types/node": "^18.15.11",
|
"@types/node": "^18.15.11",
|
||||||
"@types/react": "^18.0.33",
|
"@types/react": "^18.0.33",
|
||||||
"@typescript-eslint/eslint-plugin": "^5.57.1",
|
"@typescript-eslint/eslint-plugin": "^5.57.1",
|
||||||
"@typescript-eslint/parser": "^5.57.1",
|
"@typescript-eslint/parser": "^5.57.1",
|
||||||
|
"@vencord/types": "^0.1.2",
|
||||||
"dotenv": "^16.0.3",
|
"dotenv": "^16.0.3",
|
||||||
"electron": "^23.2.0",
|
"electron": "^23.2.0",
|
||||||
"electron-builder": "^23.6.0",
|
"electron-builder": "^23.6.0",
|
||||||
|
@ -78,11 +83,30 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"mac": {
|
"mac": {
|
||||||
|
"target": [
|
||||||
|
{
|
||||||
|
"target": "default",
|
||||||
|
"arch": [
|
||||||
|
"x64",
|
||||||
|
"arm64"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
"category": "Network"
|
"category": "Network"
|
||||||
},
|
},
|
||||||
"nsis": {
|
"nsis": {
|
||||||
"include": "build/installer.nsh",
|
"include": "build/installer.nsh",
|
||||||
"oneClick": false
|
"oneClick": false
|
||||||
|
},
|
||||||
|
"win": {
|
||||||
|
"target": [
|
||||||
|
"nsis",
|
||||||
|
"portable"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"publish": {
|
||||||
|
"provider": "github",
|
||||||
|
"releaseType": "release"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,14 @@
|
||||||
lockfileVersion: '6.0'
|
lockfileVersion: '6.0'
|
||||||
|
|
||||||
|
dependencies:
|
||||||
|
arrpc:
|
||||||
|
specifier: ^3.1.0
|
||||||
|
version: 3.1.0
|
||||||
|
|
||||||
devDependencies:
|
devDependencies:
|
||||||
|
'@fal-works/esbuild-plugin-global-externals':
|
||||||
|
specifier: ^2.1.2
|
||||||
|
version: 2.1.2
|
||||||
'@types/node':
|
'@types/node':
|
||||||
specifier: ^18.15.11
|
specifier: ^18.15.11
|
||||||
version: 18.15.11
|
version: 18.15.11
|
||||||
|
@ -13,6 +21,9 @@ devDependencies:
|
||||||
'@typescript-eslint/parser':
|
'@typescript-eslint/parser':
|
||||||
specifier: ^5.57.1
|
specifier: ^5.57.1
|
||||||
version: 5.57.1(eslint@8.38.0)(typescript@5.0.2)
|
version: 5.57.1(eslint@8.38.0)(typescript@5.0.2)
|
||||||
|
'@vencord/types':
|
||||||
|
specifier: ^0.1.2
|
||||||
|
version: 0.1.2
|
||||||
dotenv:
|
dotenv:
|
||||||
specifier: ^16.0.3
|
specifier: ^16.0.3
|
||||||
version: 16.0.3
|
version: 16.0.3
|
||||||
|
@ -367,6 +378,10 @@ packages:
|
||||||
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/@fal-works/esbuild-plugin-global-externals@2.1.2:
|
||||||
|
resolution: {integrity: sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ==}
|
||||||
|
dev: true
|
||||||
|
|
||||||
/@humanwhocodes/config-array@0.11.8:
|
/@humanwhocodes/config-array@0.11.8:
|
||||||
resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==}
|
resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==}
|
||||||
engines: {node: '>=10.10.0'}
|
engines: {node: '>=10.10.0'}
|
||||||
|
@ -492,6 +507,10 @@ packages:
|
||||||
'@types/node': 18.15.11
|
'@types/node': 18.15.11
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/@types/lodash@4.14.194:
|
||||||
|
resolution: {integrity: sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g==}
|
||||||
|
dev: true
|
||||||
|
|
||||||
/@types/minimatch@5.1.2:
|
/@types/minimatch@5.1.2:
|
||||||
resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==}
|
resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==}
|
||||||
dev: true
|
dev: true
|
||||||
|
@ -522,6 +541,19 @@ packages:
|
||||||
resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==}
|
resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/@types/react-dom@18.0.11:
|
||||||
|
resolution: {integrity: sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==}
|
||||||
|
dependencies:
|
||||||
|
'@types/react': 18.0.33
|
||||||
|
dev: true
|
||||||
|
|
||||||
|
/@types/react@17.0.2:
|
||||||
|
resolution: {integrity: sha512-Xt40xQsrkdvjn1EyWe1Bc0dJLcil/9x2vAuW7ya+PuQip4UYUaXyhzWmAbwRsdMgwOFHpfp7/FFZebDU6Y8VHA==}
|
||||||
|
dependencies:
|
||||||
|
'@types/prop-types': 15.7.5
|
||||||
|
csstype: 3.1.2
|
||||||
|
dev: true
|
||||||
|
|
||||||
/@types/react@18.0.33:
|
/@types/react@18.0.33:
|
||||||
resolution: {integrity: sha512-sHxzVxeanvQyQ1lr8NSHaj0kDzcNiGpILEVt69g9S31/7PfMvNCKLKcsHw4lYKjs3cGNJjXSP4mYzX43QlnjNA==}
|
resolution: {integrity: sha512-sHxzVxeanvQyQ1lr8NSHaj0kDzcNiGpILEVt69g9S31/7PfMvNCKLKcsHw4lYKjs3cGNJjXSP4mYzX43QlnjNA==}
|
||||||
dependencies:
|
dependencies:
|
||||||
|
@ -698,6 +730,18 @@ packages:
|
||||||
eslint-visitor-keys: 3.4.0
|
eslint-visitor-keys: 3.4.0
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/@vencord/types@0.1.2:
|
||||||
|
resolution: {integrity: sha512-C/dqZHn3aod/4izZT9sgZEef4478M7QNKTY8Gx2yB1CRYawJcs6hupXT/1SMmepKqrULbltL04Cnh5ieBm3Ucw==}
|
||||||
|
dependencies:
|
||||||
|
'@types/lodash': 4.14.194
|
||||||
|
'@types/node': 18.15.11
|
||||||
|
'@types/react': 18.0.33
|
||||||
|
'@types/react-dom': 18.0.11
|
||||||
|
discord-types: 1.3.26
|
||||||
|
standalone-electron-types: 1.0.0
|
||||||
|
type-fest: 3.8.0
|
||||||
|
dev: true
|
||||||
|
|
||||||
/acorn-jsx@5.3.2(acorn@8.8.2):
|
/acorn-jsx@5.3.2(acorn@8.8.2):
|
||||||
resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
|
resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
|
@ -850,6 +894,15 @@ packages:
|
||||||
es-shim-unscopables: 1.0.0
|
es-shim-unscopables: 1.0.0
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/arrpc@3.1.0:
|
||||||
|
resolution: {integrity: sha512-QKagtB5fUDqDXT31tTUzcG3+rFxsMlrjKb3iE68/b2NbT1c6+0WYkkrJh4GaVPqH0Tlqy13sEgPW3XJ/VNmBDQ==}
|
||||||
|
dependencies:
|
||||||
|
ws: 8.13.0
|
||||||
|
transitivePeerDependencies:
|
||||||
|
- bufferutil
|
||||||
|
- utf-8-validate
|
||||||
|
dev: false
|
||||||
|
|
||||||
/asar@3.2.0:
|
/asar@3.2.0:
|
||||||
resolution: {integrity: sha512-COdw2ZQvKdFGFxXwX3oYh2/sOsJWJegrdJCGxnN4MZ7IULgRBp9P6665aqj9z1v9VwP4oP1hRBojRDQ//IGgAg==}
|
resolution: {integrity: sha512-COdw2ZQvKdFGFxXwX3oYh2/sOsJWJegrdJCGxnN4MZ7IULgRBp9P6665aqj9z1v9VwP4oP1hRBojRDQ//IGgAg==}
|
||||||
engines: {node: '>=10.12.0'}
|
engines: {node: '>=10.12.0'}
|
||||||
|
@ -1342,6 +1395,13 @@ packages:
|
||||||
path-type: 4.0.0
|
path-type: 4.0.0
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/discord-types@1.3.26:
|
||||||
|
resolution: {integrity: sha512-ToG51AOCH+JTQf7b+8vuYQe5Iqwz7nZ7StpECAZ/VZcI1ZhQk13pvt9KkRTfRv1xNvwJ2qib4e3+RifQlo8VPQ==}
|
||||||
|
dependencies:
|
||||||
|
'@types/react': 17.0.2
|
||||||
|
moment: 2.29.4
|
||||||
|
dev: true
|
||||||
|
|
||||||
/dmg-builder@23.6.0:
|
/dmg-builder@23.6.0:
|
||||||
resolution: {integrity: sha512-jFZvY1JohyHarIAlTbfQOk+HnceGjjAdFjVn3n8xlDWKsYNqbO4muca6qXEZTfGXeQMG7TYim6CeS5XKSfSsGA==}
|
resolution: {integrity: sha512-jFZvY1JohyHarIAlTbfQOk+HnceGjjAdFjVn3n8xlDWKsYNqbO4muca6qXEZTfGXeQMG7TYim6CeS5XKSfSsGA==}
|
||||||
dependencies:
|
dependencies:
|
||||||
|
@ -2875,6 +2935,10 @@ packages:
|
||||||
hasBin: true
|
hasBin: true
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/moment@2.29.4:
|
||||||
|
resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==}
|
||||||
|
dev: true
|
||||||
|
|
||||||
/ms@2.0.0:
|
/ms@2.0.0:
|
||||||
resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
|
resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
|
||||||
dev: true
|
dev: true
|
||||||
|
@ -3390,6 +3454,12 @@ packages:
|
||||||
dev: true
|
dev: true
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
|
/standalone-electron-types@1.0.0:
|
||||||
|
resolution: {integrity: sha512-0HOi/tlTz3mjWhsAz4uRbpQcHMZ+ifj1JzWW9nugykOHClBBG77ps8QinrzX1eow4Iw2pnC+RFaSYRgufF4BOg==}
|
||||||
|
dependencies:
|
||||||
|
'@types/node': 18.15.11
|
||||||
|
dev: true
|
||||||
|
|
||||||
/stat-mode@1.0.0:
|
/stat-mode@1.0.0:
|
||||||
resolution: {integrity: sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==}
|
resolution: {integrity: sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==}
|
||||||
engines: {node: '>= 6'}
|
engines: {node: '>= 6'}
|
||||||
|
@ -3729,6 +3799,19 @@ packages:
|
||||||
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
|
resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
/ws@8.13.0:
|
||||||
|
resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==}
|
||||||
|
engines: {node: '>=10.0.0'}
|
||||||
|
peerDependencies:
|
||||||
|
bufferutil: ^4.0.1
|
||||||
|
utf-8-validate: '>=5.0.2'
|
||||||
|
peerDependenciesMeta:
|
||||||
|
bufferutil:
|
||||||
|
optional: true
|
||||||
|
utf-8-validate:
|
||||||
|
optional: true
|
||||||
|
dev: false
|
||||||
|
|
||||||
/xmlbuilder@15.1.1:
|
/xmlbuilder@15.1.1:
|
||||||
resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==}
|
resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==}
|
||||||
engines: {node: '>=8.0'}
|
engines: {node: '>=8.0'}
|
||||||
|
|
|
@ -6,6 +6,8 @@
|
||||||
|
|
||||||
import { BuildContext, BuildOptions, context } from "esbuild";
|
import { BuildContext, BuildOptions, context } from "esbuild";
|
||||||
|
|
||||||
|
import vencordDep from "./vencordDep.mjs";
|
||||||
|
|
||||||
const isDev = process.argv.includes("--dev");
|
const isDev = process.argv.includes("--dev");
|
||||||
|
|
||||||
const CommonOpts: BuildOptions = {
|
const CommonOpts: BuildOptions = {
|
||||||
|
@ -35,17 +37,20 @@ await Promise.all([
|
||||||
createContext({
|
createContext({
|
||||||
...NodeCommonOpts,
|
...NodeCommonOpts,
|
||||||
entryPoints: ["src/main/index.ts"],
|
entryPoints: ["src/main/index.ts"],
|
||||||
outfile: "dist/js/main.js"
|
outfile: "dist/js/main.js",
|
||||||
|
footer: { js: "//# sourceURL=VCDMain" }
|
||||||
}),
|
}),
|
||||||
createContext({
|
createContext({
|
||||||
...NodeCommonOpts,
|
...NodeCommonOpts,
|
||||||
entryPoints: ["src/preload/index.ts"],
|
entryPoints: ["src/preload/index.ts"],
|
||||||
outfile: "dist/js/preload.js"
|
outfile: "dist/js/preload.js",
|
||||||
|
footer: { js: "//# sourceURL=VCDPreload" }
|
||||||
}),
|
}),
|
||||||
createContext({
|
createContext({
|
||||||
...NodeCommonOpts,
|
...NodeCommonOpts,
|
||||||
entryPoints: ["src/updater/preload.ts"],
|
entryPoints: ["src/updater/preload.ts"],
|
||||||
outfile: "dist/js/updaterPreload.js"
|
outfile: "dist/js/updaterPreload.js",
|
||||||
|
footer: { js: "//# sourceURL=VCDUpdaterPreload" }
|
||||||
}),
|
}),
|
||||||
createContext({
|
createContext({
|
||||||
...CommonOpts,
|
...CommonOpts,
|
||||||
|
@ -57,7 +62,10 @@ await Promise.all([
|
||||||
jsxFactory: "VencordCreateElement",
|
jsxFactory: "VencordCreateElement",
|
||||||
jsxFragment: "VencordFragment",
|
jsxFragment: "VencordFragment",
|
||||||
// Work around https://github.com/evanw/esbuild/issues/2460
|
// Work around https://github.com/evanw/esbuild/issues/2460
|
||||||
tsconfig: "./scripts/build/tsconfig.esbuild.json"
|
tsconfig: "./scripts/build/tsconfig.esbuild.json",
|
||||||
|
external: ["@vencord/types/*"],
|
||||||
|
plugins: [vencordDep],
|
||||||
|
footer: { js: "//# sourceURL=VCDRenderer" }
|
||||||
})
|
})
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
|
38
scripts/build/vencordDep.mts
Normal file
38
scripts/build/vencordDep.mts
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
/*
|
||||||
|
* SPDX-License-Identifier: GPL-3.0
|
||||||
|
* Vencord Desktop, a desktop app aiming to give you a snappier Discord Experience
|
||||||
|
* Copyright (c) 2023 Vendicated and Vencord contributors
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { globalExternalsWithRegExp } from "@fal-works/esbuild-plugin-global-externals";
|
||||||
|
|
||||||
|
const names = {
|
||||||
|
webpack: "Vencord.Webpack",
|
||||||
|
"webpack/common": "Vencord.Webpack.Common",
|
||||||
|
utils: "Vencord.Util",
|
||||||
|
api: "Vencord.Api",
|
||||||
|
"api/settings": "Vencord",
|
||||||
|
components: "Vencord.Components"
|
||||||
|
};
|
||||||
|
|
||||||
|
export default globalExternalsWithRegExp({
|
||||||
|
getModuleInfo(modulePath) {
|
||||||
|
const path = modulePath.replace("@vencord/types/", "");
|
||||||
|
let varName = names[path];
|
||||||
|
if (!varName) {
|
||||||
|
const altMapping = names[path.split("/")[0]];
|
||||||
|
if (!altMapping) throw new Error("Unknown module path: " + modulePath);
|
||||||
|
|
||||||
|
varName =
|
||||||
|
altMapping +
|
||||||
|
"." +
|
||||||
|
// @ts-ignore
|
||||||
|
path.split("/")[1].replaceAll("/", ".");
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
varName,
|
||||||
|
type: "cjs"
|
||||||
|
};
|
||||||
|
},
|
||||||
|
modulePathFilter: /^@vencord\/types.+$/
|
||||||
|
});
|
|
@ -1,20 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
VERSION=$(git describe --tags --abbrev=0 | tr -d 'v')
|
|
||||||
SHASUM=$(sha256sum "dist/VencordDesktop-$VERSION.tar.gz" | awk '{ print $1 }')
|
|
||||||
|
|
||||||
git clone ssh://aur@aur.archlinux.org/vencord-desktop-bin.git aurpkg
|
|
||||||
|
|
||||||
cd aurpkg
|
|
||||||
|
|
||||||
sed -i "s/^pkgver=.*$/pkgver=$VERSION/" PKGBUILD
|
|
||||||
sed -i "s/^sha256sums=('.*'/sha256sums=('$SHASUM'/" PKGBUILD
|
|
||||||
makepkg --printsrcinfo > .SRCINFO
|
|
||||||
|
|
||||||
git commit -a -m "Bump version to $VERSION"
|
|
||||||
git push
|
|
||||||
|
|
||||||
cd ..
|
|
||||||
rm -rf aurpkg
|
|
|
@ -1,13 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
for i in \
|
|
||||||
"makepkg_6.0.2-3_amd64.deb" \
|
|
||||||
"libalpm13_13.0.2-3_amd64.deb" \
|
|
||||||
"pacman-package-manager_6.0.2-3_amd64.deb"; do
|
|
||||||
wget -O/tmp/$i https://fr.archive.ubuntu.com/ubuntu/pool/universe/p/pacman-package-manager/$i
|
|
||||||
dpkg -i /tmp/$i || true
|
|
||||||
done
|
|
||||||
|
|
||||||
apt-get -f install -oDpkg::Use-Pty=0 -qq
|
|
2
src/globals.d.ts
vendored
2
src/globals.d.ts
vendored
|
@ -7,8 +7,6 @@
|
||||||
declare global {
|
declare global {
|
||||||
export var VencordDesktopNative: typeof import("preload/VencordDesktopNative").VencordDesktopNative;
|
export var VencordDesktopNative: typeof import("preload/VencordDesktopNative").VencordDesktopNative;
|
||||||
export var VencordDesktop: typeof import("renderer/index");
|
export var VencordDesktop: typeof import("renderer/index");
|
||||||
// TODO
|
|
||||||
export var Vencord: any;
|
|
||||||
export var vcdLS: typeof localStorage;
|
export var vcdLS: typeof localStorage;
|
||||||
|
|
||||||
export var IS_DEV: boolean;
|
export var IS_DEV: boolean;
|
||||||
|
|
|
@ -4,7 +4,8 @@
|
||||||
* Copyright (c) 2023 Vendicated and Vencord contributors
|
* Copyright (c) 2023 Vendicated and Vencord contributors
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { BrowserWindow } from "electron";
|
import { app, BrowserWindow } from "electron";
|
||||||
|
import { readFileSync } from "fs";
|
||||||
import { join } from "path";
|
import { join } from "path";
|
||||||
import { ICON_PATH, STATIC_DIR } from "shared/paths";
|
import { ICON_PATH, STATIC_DIR } from "shared/paths";
|
||||||
|
|
||||||
|
@ -19,7 +20,9 @@ export function createAboutWindow() {
|
||||||
|
|
||||||
makeLinksOpenExternally(about);
|
makeLinksOpenExternally(about);
|
||||||
|
|
||||||
about.loadFile(join(STATIC_DIR, "about.html"));
|
const html = readFileSync(join(STATIC_DIR, "about.html"), "utf-8").replaceAll("%VERSION%", app.getVersion());
|
||||||
|
|
||||||
|
about.loadURL("data:text/html;charset=utf-8," + html);
|
||||||
|
|
||||||
return about;
|
return about;
|
||||||
}
|
}
|
||||||
|
|
21
src/main/arrpc.ts
Normal file
21
src/main/arrpc.ts
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
/*
|
||||||
|
* SPDX-License-Identifier: GPL-3.0
|
||||||
|
* Vencord Desktop, a desktop app aiming to give you a snappier Discord Experience
|
||||||
|
* Copyright (c) 2023 Vendicated and Vencord contributors
|
||||||
|
*/
|
||||||
|
|
||||||
|
import Server from "arrpc";
|
||||||
|
import { send as sendToBridge } from "arrpc/src/bridge";
|
||||||
|
|
||||||
|
import { Settings } from "./settings";
|
||||||
|
|
||||||
|
let server: any;
|
||||||
|
|
||||||
|
export async function initArRPC() {
|
||||||
|
if (server || !Settings.store.arRPC) return;
|
||||||
|
|
||||||
|
server = await new Server();
|
||||||
|
server.on("activity", sendToBridge);
|
||||||
|
}
|
||||||
|
|
||||||
|
Settings.addChangeListener("arRPC", initArRPC);
|
48
src/main/autoStart.ts
Normal file
48
src/main/autoStart.ts
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
/*
|
||||||
|
* SPDX-License-Identifier: GPL-3.0
|
||||||
|
* Vencord Desktop, a desktop app aiming to give you a snappier Discord Experience
|
||||||
|
* Copyright (c) 2023 Vendicated and Vencord contributors
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { app } from "electron";
|
||||||
|
import { existsSync, mkdirSync, rmSync, writeFileSync } from "fs";
|
||||||
|
import { join } from "path";
|
||||||
|
|
||||||
|
interface AutoStart {
|
||||||
|
isEnabled(): boolean;
|
||||||
|
enable(): void;
|
||||||
|
disable(): void;
|
||||||
|
}
|
||||||
|
|
||||||
|
function makeAutoStartLinux(): AutoStart {
|
||||||
|
const dir = join(process.env.HOME!, ".config", "autostart");
|
||||||
|
const file = join(dir, "vencord.desktop");
|
||||||
|
|
||||||
|
return {
|
||||||
|
isEnabled: () => existsSync(file),
|
||||||
|
enable() {
|
||||||
|
const desktopFile = `
|
||||||
|
[Desktop Entry]
|
||||||
|
Type=Application
|
||||||
|
Version=1.0
|
||||||
|
Name=Vencord
|
||||||
|
Comment=Vencord autostart script
|
||||||
|
Exec=${process.execPath}
|
||||||
|
Terminal=false
|
||||||
|
StartupNotify=false
|
||||||
|
`.trim();
|
||||||
|
|
||||||
|
mkdirSync(dir, { recursive: true });
|
||||||
|
writeFileSync(file, desktopFile);
|
||||||
|
},
|
||||||
|
disable: () => rmSync(file, { force: true })
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
const autoStartWindowsMac: AutoStart = {
|
||||||
|
isEnabled: () => app.getLoginItemSettings().openAtLogin,
|
||||||
|
enable: () => app.setLoginItemSettings({ openAtLogin: true }),
|
||||||
|
disable: () => app.setLoginItemSettings({ openAtLogin: false })
|
||||||
|
};
|
||||||
|
|
||||||
|
export const autoStart = process.platform === "linux" ? makeAutoStartLinux() : autoStartWindowsMac;
|
67
src/main/firstLaunch.ts
Normal file
67
src/main/firstLaunch.ts
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
/*
|
||||||
|
* SPDX-License-Identifier: GPL-3.0
|
||||||
|
* Vencord Desktop, a desktop app aiming to give you a snappier Discord Experience
|
||||||
|
* Copyright (c) 2023 Vendicated and Vencord contributors
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { app } from "electron";
|
||||||
|
import { BrowserWindow } from "electron/main";
|
||||||
|
import { copyFileSync, mkdirSync, readdirSync } from "fs";
|
||||||
|
import { join } from "path";
|
||||||
|
import { SplashProps } from "shared/browserWinProperties";
|
||||||
|
import { STATIC_DIR } from "shared/paths";
|
||||||
|
|
||||||
|
import { autoStart } from "./autoStart";
|
||||||
|
import { DATA_DIR } from "./constants";
|
||||||
|
import { createWindows } from "./mainWindow";
|
||||||
|
import { Settings } from "./settings";
|
||||||
|
|
||||||
|
interface Data {
|
||||||
|
minimizeToTray: boolean;
|
||||||
|
discordBranch: "stable" | "canary" | "ptb";
|
||||||
|
autoStart: boolean;
|
||||||
|
importSettings: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function createFirstLaunchTour() {
|
||||||
|
const win = new BrowserWindow({
|
||||||
|
...SplashProps,
|
||||||
|
frame: true,
|
||||||
|
autoHideMenuBar: true,
|
||||||
|
height: 420,
|
||||||
|
width: 550
|
||||||
|
});
|
||||||
|
|
||||||
|
win.loadFile(join(STATIC_DIR, "first-launch.html"));
|
||||||
|
win.webContents.addListener("console-message", (_e, _l, msg) => {
|
||||||
|
if (msg === "cancel") return app.exit();
|
||||||
|
|
||||||
|
if (!msg.startsWith("form:")) return;
|
||||||
|
const data = JSON.parse(msg.slice(5)) as Data;
|
||||||
|
|
||||||
|
Settings.store.minimizeToTray = data.minimizeToTray;
|
||||||
|
Settings.store.discordBranch = data.discordBranch;
|
||||||
|
Settings.store.firstLaunch = false;
|
||||||
|
|
||||||
|
if (data.autoStart) autoStart.enable();
|
||||||
|
|
||||||
|
if (data.importSettings) {
|
||||||
|
const from = join(app.getPath("userData"), "..", "Vencord", "settings");
|
||||||
|
const to = join(DATA_DIR, "settings");
|
||||||
|
try {
|
||||||
|
const files = readdirSync(from);
|
||||||
|
mkdirSync(to, { recursive: true });
|
||||||
|
|
||||||
|
for (const file of files) {
|
||||||
|
copyFileSync(join(from, file), join(to, file));
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.error("Failed to import settings:", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
win.close();
|
||||||
|
|
||||||
|
createWindows();
|
||||||
|
});
|
||||||
|
}
|
|
@ -7,16 +7,14 @@
|
||||||
import "./ipc";
|
import "./ipc";
|
||||||
|
|
||||||
import { app, BrowserWindow } from "electron";
|
import { app, BrowserWindow } from "electron";
|
||||||
import { join } from "path";
|
|
||||||
import { checkUpdates } from "updater/main";
|
import { checkUpdates } from "updater/main";
|
||||||
|
|
||||||
import { ICON_PATH } from "../shared/paths";
|
import { ICON_PATH } from "../shared/paths";
|
||||||
import { once } from "../shared/utils/once";
|
import { DATA_DIR } from "./constants";
|
||||||
import { DATA_DIR, VENCORD_FILES_DIR } from "./constants";
|
import { createFirstLaunchTour } from "./firstLaunch";
|
||||||
import { createMainWindow } from "./mainWindow";
|
import { createWindows, mainWin } from "./mainWindow";
|
||||||
import { Settings } from "./settings";
|
import { Settings } from "./settings";
|
||||||
import { createSplashWindow } from "./splash";
|
|
||||||
import { ensureVencordFiles } from "./utils/vencordLoader";
|
|
||||||
if (IS_DEV) {
|
if (IS_DEV) {
|
||||||
require("source-map-support").install();
|
require("source-map-support").install();
|
||||||
}
|
}
|
||||||
|
@ -24,11 +22,21 @@ if (IS_DEV) {
|
||||||
// Make the Vencord files use our DATA_DIR
|
// Make the Vencord files use our DATA_DIR
|
||||||
process.env.VENCORD_USER_DATA_DIR = DATA_DIR;
|
process.env.VENCORD_USER_DATA_DIR = DATA_DIR;
|
||||||
|
|
||||||
const runVencordMain = once(() => require(join(VENCORD_FILES_DIR, "vencordDesktopMain.js")));
|
|
||||||
|
|
||||||
let mainWin: BrowserWindow | null = null;
|
|
||||||
|
|
||||||
function init() {
|
function init() {
|
||||||
|
// <-- BEGIN COPY PASTED FROM DISCORD -->
|
||||||
|
|
||||||
|
// work around chrome 66 disabling autoplay by default
|
||||||
|
app.commandLine.appendSwitch("autoplay-policy", "no-user-gesture-required");
|
||||||
|
|
||||||
|
// WinRetrieveSuggestionsOnlyOnDemand: Work around electron 13 bug w/ async spellchecking on Windows.
|
||||||
|
// HardwareMediaKeyHandling,MediaSessionService: Prevent Discord from registering as a media service.
|
||||||
|
app.commandLine.appendSwitch(
|
||||||
|
"disable-features",
|
||||||
|
"WinRetrieveSuggestionsOnlyOnDemand,HardwareMediaKeyHandling,MediaSessionService"
|
||||||
|
);
|
||||||
|
|
||||||
|
// <-- END COPY PASTED FROM DISCORD -->
|
||||||
|
|
||||||
app.on("second-instance", (_event, _cmdLine, _cwd, data: any) => {
|
app.on("second-instance", (_event, _cmdLine, _cwd, data: any) => {
|
||||||
if (data.IS_DEV) app.quit();
|
if (data.IS_DEV) app.quit();
|
||||||
else if (mainWin) {
|
else if (mainWin) {
|
||||||
|
@ -43,7 +51,7 @@ function init() {
|
||||||
if (process.platform === "win32") app.setAppUserModelId("dev.vencord.desktop");
|
if (process.platform === "win32") app.setAppUserModelId("dev.vencord.desktop");
|
||||||
else if (process.platform === "darwin") app.dock.setIcon(ICON_PATH);
|
else if (process.platform === "darwin") app.dock.setIcon(ICON_PATH);
|
||||||
|
|
||||||
createWindows();
|
bootstrap();
|
||||||
|
|
||||||
app.on("activate", () => {
|
app.on("activate", () => {
|
||||||
if (BrowserWindow.getAllWindows().length === 0) createWindows();
|
if (BrowserWindow.getAllWindows().length === 0) createWindows();
|
||||||
|
@ -63,22 +71,12 @@ if (!app.requestSingleInstanceLock({ IS_DEV })) {
|
||||||
init();
|
init();
|
||||||
}
|
}
|
||||||
|
|
||||||
async function createWindows() {
|
async function bootstrap() {
|
||||||
const splash = createSplashWindow();
|
if (!Object.hasOwn(Settings.store, "firstLaunch")) {
|
||||||
|
createFirstLaunchTour();
|
||||||
await ensureVencordFiles();
|
} else {
|
||||||
runVencordMain();
|
createWindows();
|
||||||
|
|
||||||
mainWin = createMainWindow();
|
|
||||||
|
|
||||||
mainWin.once("ready-to-show", () => {
|
|
||||||
splash.destroy();
|
|
||||||
mainWin!.show();
|
|
||||||
|
|
||||||
if (Settings.store.maximized) {
|
|
||||||
mainWin!.maximize();
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
app.on("window-all-closed", () => {
|
app.on("window-all-closed", () => {
|
||||||
|
|
|
@ -11,6 +11,7 @@ import { join } from "path";
|
||||||
import { debounce } from "shared/utils/debounce";
|
import { debounce } from "shared/utils/debounce";
|
||||||
|
|
||||||
import { IpcEvents } from "../shared/IpcEvents";
|
import { IpcEvents } from "../shared/IpcEvents";
|
||||||
|
import { autoStart } from "./autoStart";
|
||||||
import { VENCORD_FILES_DIR, VENCORD_QUICKCSS_FILE } from "./constants";
|
import { VENCORD_FILES_DIR, VENCORD_QUICKCSS_FILE } from "./constants";
|
||||||
import { mainWin } from "./mainWindow";
|
import { mainWin } from "./mainWindow";
|
||||||
import { Settings } from "./settings";
|
import { Settings } from "./settings";
|
||||||
|
@ -39,6 +40,12 @@ ipcMain.on(IpcEvents.GET_VERSION, e => {
|
||||||
e.returnValue = app.getVersion();
|
e.returnValue = app.getVersion();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
ipcMain.on(IpcEvents.AUTOSTART_ENABLED, e => {
|
||||||
|
e.returnValue = autoStart.isEnabled();
|
||||||
|
});
|
||||||
|
ipcMain.handle(IpcEvents.ENABLE_AUTOSTART, autoStart.enable);
|
||||||
|
ipcMain.handle(IpcEvents.DISABLE_AUTOSTART, autoStart.disable);
|
||||||
|
|
||||||
ipcMain.handle(IpcEvents.SET_SETTINGS, (_, settings: typeof Settings.store, path?: string) => {
|
ipcMain.handle(IpcEvents.SET_SETTINGS, (_, settings: typeof Settings.store, path?: string) => {
|
||||||
Settings.setData(settings, path);
|
Settings.setData(settings, path);
|
||||||
});
|
});
|
||||||
|
|
|
@ -6,13 +6,16 @@
|
||||||
|
|
||||||
import { app, BrowserWindow, BrowserWindowConstructorOptions, Menu, Tray } from "electron";
|
import { app, BrowserWindow, BrowserWindowConstructorOptions, Menu, Tray } from "electron";
|
||||||
import { join } from "path";
|
import { join } from "path";
|
||||||
|
import { once } from "shared/utils/once";
|
||||||
|
|
||||||
import { ICON_PATH } from "../shared/paths";
|
import { ICON_PATH } from "../shared/paths";
|
||||||
import { createAboutWindow } from "./about";
|
import { createAboutWindow } from "./about";
|
||||||
import { DEFAULT_HEIGHT, DEFAULT_WIDTH, MIN_HEIGHT, MIN_WIDTH } from "./constants";
|
import { initArRPC } from "./arrpc";
|
||||||
|
import { DEFAULT_HEIGHT, DEFAULT_WIDTH, MIN_HEIGHT, MIN_WIDTH, VENCORD_FILES_DIR } from "./constants";
|
||||||
import { Settings, VencordSettings } from "./settings";
|
import { Settings, VencordSettings } from "./settings";
|
||||||
|
import { createSplashWindow } from "./splash";
|
||||||
import { makeLinksOpenExternally } from "./utils/makeLinksOpenExternally";
|
import { makeLinksOpenExternally } from "./utils/makeLinksOpenExternally";
|
||||||
import { downloadVencordFiles } from "./utils/vencordLoader";
|
import { downloadVencordFiles, ensureVencordFiles } from "./utils/vencordLoader";
|
||||||
|
|
||||||
let isQuitting = false;
|
let isQuitting = false;
|
||||||
let tray: Tray;
|
let tray: Tray;
|
||||||
|
@ -88,7 +91,6 @@ function initMenuBar(win: BrowserWindow) {
|
||||||
submenu: [
|
submenu: [
|
||||||
{
|
{
|
||||||
label: "About Vencord Desktop",
|
label: "About Vencord Desktop",
|
||||||
role: "about",
|
|
||||||
click: createAboutWindow
|
click: createAboutWindow
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -125,25 +127,20 @@ function initMenuBar(win: BrowserWindow) {
|
||||||
click() {
|
click() {
|
||||||
app.quit();
|
app.quit();
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
// See https://github.com/electron/electron/issues/14742 and https://github.com/electron/electron/issues/5256
|
||||||
|
{
|
||||||
|
label: "Zoom in (hidden, hack for Qwertz and others)",
|
||||||
|
accelerator: "CmdOrCtrl+=",
|
||||||
|
role: "zoomIn",
|
||||||
|
visible: false
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{ role: "fileMenu" },
|
{ role: "fileMenu" },
|
||||||
{ role: "editMenu" },
|
{ role: "editMenu" },
|
||||||
{ role: "viewMenu" },
|
{ role: "viewMenu" },
|
||||||
{ role: "windowMenu" },
|
{ role: "windowMenu" }
|
||||||
{
|
|
||||||
label: "Zoom",
|
|
||||||
submenu: [
|
|
||||||
// See https://github.com/electron/electron/issues/14742 and https://github.com/electron/electron/issues/5256
|
|
||||||
{
|
|
||||||
label: "Zoom in",
|
|
||||||
accelerator: "CmdOrCtrl+=",
|
|
||||||
role: "zoomIn"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
visible: false
|
|
||||||
}
|
|
||||||
]);
|
]);
|
||||||
|
|
||||||
Menu.setApplicationMenu(menu);
|
Menu.setApplicationMenu(menu);
|
||||||
|
@ -219,7 +216,7 @@ function initSettingsListeners(win: BrowserWindow) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export function createMainWindow() {
|
function createMainWindow() {
|
||||||
const win = (mainWin = new BrowserWindow({
|
const win = (mainWin = new BrowserWindow({
|
||||||
show: false,
|
show: false,
|
||||||
autoHideMenuBar: true,
|
autoHideMenuBar: true,
|
||||||
|
@ -232,6 +229,7 @@ export function createMainWindow() {
|
||||||
},
|
},
|
||||||
icon: ICON_PATH,
|
icon: ICON_PATH,
|
||||||
frame: VencordSettings.store.frameless !== true,
|
frame: VencordSettings.store.frameless !== true,
|
||||||
|
...(Settings.store.staticTitle ? { title: "Vencord" } : {}),
|
||||||
...(VencordSettings.store.macosTranslucency
|
...(VencordSettings.store.macosTranslucency
|
||||||
? {
|
? {
|
||||||
vibrancy: "sidebar",
|
vibrancy: "sidebar",
|
||||||
|
@ -250,6 +248,8 @@ export function createMainWindow() {
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (Settings.store.staticTitle) win.on("page-title-updated", e => e.preventDefault());
|
||||||
|
|
||||||
initWindowBoundsListeners(win);
|
initWindowBoundsListeners(win);
|
||||||
if (Settings.store.tray ?? true) initTray(win);
|
if (Settings.store.tray ?? true) initTray(win);
|
||||||
initMenuBar(win);
|
initMenuBar(win);
|
||||||
|
@ -269,3 +269,25 @@ export function createMainWindow() {
|
||||||
|
|
||||||
return win;
|
return win;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const runVencordMain = once(() => require(join(VENCORD_FILES_DIR, "vencordDesktopMain.js")));
|
||||||
|
|
||||||
|
export async function createWindows() {
|
||||||
|
const splash = createSplashWindow();
|
||||||
|
|
||||||
|
await ensureVencordFiles();
|
||||||
|
runVencordMain();
|
||||||
|
|
||||||
|
mainWin = createMainWindow();
|
||||||
|
|
||||||
|
mainWin.once("ready-to-show", () => {
|
||||||
|
splash.destroy();
|
||||||
|
mainWin!.show();
|
||||||
|
|
||||||
|
if (Settings.store.maximized) {
|
||||||
|
mainWin!.maximize();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
initArRPC();
|
||||||
|
}
|
||||||
|
|
|
@ -16,6 +16,11 @@ export const VencordDesktopNative = {
|
||||||
relaunch: () => invoke<void>(IpcEvents.RELAUNCH),
|
relaunch: () => invoke<void>(IpcEvents.RELAUNCH),
|
||||||
getVersion: () => sendSync<void>(IpcEvents.GET_VERSION)
|
getVersion: () => sendSync<void>(IpcEvents.GET_VERSION)
|
||||||
},
|
},
|
||||||
|
autostart: {
|
||||||
|
isEnabled: () => sendSync<boolean>(IpcEvents.AUTOSTART_ENABLED),
|
||||||
|
enable: () => invoke<void>(IpcEvents.ENABLE_AUTOSTART),
|
||||||
|
disable: () => invoke<void>(IpcEvents.DISABLE_AUTOSTART)
|
||||||
|
},
|
||||||
fileManager: {
|
fileManager: {
|
||||||
showItemInFolder: (path: string) => invoke<void>(IpcEvents.SHOW_ITEM_IN_FOLDER, path),
|
showItemInFolder: (path: string) => invoke<void>(IpcEvents.SHOW_ITEM_IN_FOLDER, path),
|
||||||
selectVencordDir: () => invoke<LiteralUnion<"cancelled" | "invalid", string>>(IpcEvents.SELECT_VENCORD_DIR)
|
selectVencordDir: () => invoke<LiteralUnion<"cancelled" | "invalid", string>>(IpcEvents.SELECT_VENCORD_DIR)
|
||||||
|
|
|
@ -6,20 +6,15 @@
|
||||||
|
|
||||||
import "./settings.css";
|
import "./settings.css";
|
||||||
|
|
||||||
|
import { Margins } from "@vencord/types/utils";
|
||||||
|
import { Button, Forms, Select, Switch, Text, useState } from "@vencord/types/webpack/common";
|
||||||
import { useSettings } from "renderer/settings";
|
import { useSettings } from "renderer/settings";
|
||||||
|
|
||||||
import { Common, Util } from "../vencord";
|
|
||||||
|
|
||||||
const { Margins } = Util;
|
|
||||||
|
|
||||||
export default function SettingsUi() {
|
export default function SettingsUi() {
|
||||||
const Settings = useSettings();
|
const Settings = useSettings();
|
||||||
const {
|
|
||||||
Forms: { FormSection, FormText, FormDivider, FormSwitch, FormTitle },
|
const { autostart } = VencordDesktopNative;
|
||||||
Text,
|
const [autoStartEnabled, setAutoStartEnabled] = useState(autostart.isEnabled());
|
||||||
Select,
|
|
||||||
Button
|
|
||||||
} = Common;
|
|
||||||
|
|
||||||
const switches: [keyof typeof Settings, string, string, boolean?, (() => boolean)?][] = [
|
const switches: [keyof typeof Settings, string, string, boolean?, (() => boolean)?][] = [
|
||||||
["tray", "Tray Icon", "Add a tray icon for Vencord Desktop", true],
|
["tray", "Tray Icon", "Add a tray icon for Vencord Desktop", true],
|
||||||
|
@ -30,6 +25,7 @@ export default function SettingsUi() {
|
||||||
true,
|
true,
|
||||||
() => Settings.tray ?? true
|
() => Settings.tray ?? true
|
||||||
],
|
],
|
||||||
|
["arRPC", "Rich Presence", "Enables Rich Presence via arRPC", false],
|
||||||
[
|
[
|
||||||
"disableMinSize",
|
"disableMinSize",
|
||||||
"Disable minimum window size",
|
"Disable minimum window size",
|
||||||
|
@ -39,16 +35,17 @@ export default function SettingsUi() {
|
||||||
"openLinksWithElectron",
|
"openLinksWithElectron",
|
||||||
"Open Links in app (experimental)",
|
"Open Links in app (experimental)",
|
||||||
"Opens links in a new Vencord Desktop window instead of your web browser"
|
"Opens links in a new Vencord Desktop window instead of your web browser"
|
||||||
]
|
],
|
||||||
|
["staticTitle", "Static Title", 'Makes the window title "Vencord" instead of changing to the current page']
|
||||||
];
|
];
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<FormSection>
|
<Forms.FormSection>
|
||||||
<Text variant="heading-lg/semibold" style={{ color: "var(--header-primary)" }} tag="h2">
|
<Text variant="heading-lg/semibold" style={{ color: "var(--header-primary)" }} tag="h2">
|
||||||
Vencord Desktop Settings
|
Vencord Desktop Settings
|
||||||
</Text>
|
</Text>
|
||||||
|
|
||||||
<FormTitle className={Margins.top16}>Discord Branch</FormTitle>
|
<Forms.FormTitle className={Margins.top16}>Discord Branch</Forms.FormTitle>
|
||||||
<Select
|
<Select
|
||||||
placeholder="Stable"
|
placeholder="Stable"
|
||||||
options={[
|
options={[
|
||||||
|
@ -62,22 +59,33 @@ export default function SettingsUi() {
|
||||||
serialize={s => s}
|
serialize={s => s}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<FormDivider className={Margins.top16 + " " + Margins.bottom16} />
|
<Forms.FormDivider className={Margins.top16 + " " + Margins.bottom16} />
|
||||||
|
|
||||||
|
<Switch
|
||||||
|
value={autoStartEnabled}
|
||||||
|
onChange={async v => {
|
||||||
|
await autostart[v ? "enable" : "disable"]();
|
||||||
|
setAutoStartEnabled(v);
|
||||||
|
}}
|
||||||
|
note="Automatically start Vencord Desktop on computer start-up"
|
||||||
|
>
|
||||||
|
Start With System
|
||||||
|
</Switch>
|
||||||
|
|
||||||
{switches.map(([key, text, note, def, predicate]) => (
|
{switches.map(([key, text, note, def, predicate]) => (
|
||||||
<FormSwitch
|
<Switch
|
||||||
value={(Settings[key] ?? def ?? false) && (!predicate || predicate())}
|
value={(Settings[key as any] ?? def ?? false) && predicate?.() !== false}
|
||||||
disabled={predicate && !predicate()}
|
disabled={predicate && !predicate()}
|
||||||
onChange={v => (Settings[key] = v)}
|
onChange={v => (Settings[key as any] = v)}
|
||||||
note={note}
|
note={note}
|
||||||
key={key}
|
key={key}
|
||||||
>
|
>
|
||||||
{text}
|
{text}
|
||||||
</FormSwitch>
|
</Switch>
|
||||||
))}
|
))}
|
||||||
|
|
||||||
<FormTitle>Vencord Location</FormTitle>
|
<Forms.FormTitle>Vencord Location</Forms.FormTitle>
|
||||||
<FormText>
|
<Forms.FormText>
|
||||||
Vencord files are loaded from{" "}
|
Vencord files are loaded from{" "}
|
||||||
{Settings.vencordDir ? (
|
{Settings.vencordDir ? (
|
||||||
<a
|
<a
|
||||||
|
@ -92,7 +100,7 @@ export default function SettingsUi() {
|
||||||
) : (
|
) : (
|
||||||
"the default location"
|
"the default location"
|
||||||
)}
|
)}
|
||||||
</FormText>
|
</Forms.FormText>
|
||||||
<div className="vcd-location-btns">
|
<div className="vcd-location-btns">
|
||||||
<Button
|
<Button
|
||||||
size={Button.Sizes.SMALL}
|
size={Button.Sizes.SMALL}
|
||||||
|
@ -117,6 +125,6 @@ export default function SettingsUi() {
|
||||||
Reset
|
Reset
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
</FormSection>
|
</Forms.FormSection>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,8 @@
|
||||||
|
|
||||||
import "./hideGarbage.css";
|
import "./hideGarbage.css";
|
||||||
|
|
||||||
|
import { waitFor } from "@vencord/types/webpack";
|
||||||
|
|
||||||
import { isFirstRun, localStorage } from "./utils";
|
import { isFirstRun, localStorage } from "./utils";
|
||||||
|
|
||||||
// Make clicking Notifications focus the window
|
// Make clicking Notifications focus the window
|
||||||
|
@ -25,7 +27,7 @@ if (isFirstRun) {
|
||||||
// Hide "Download Discord Desktop now!!!!" banner
|
// Hide "Download Discord Desktop now!!!!" banner
|
||||||
localStorage.setItem("hideNag", "true");
|
localStorage.setItem("hideNag", "true");
|
||||||
|
|
||||||
Vencord.Webpack.waitFor("setDesktopType", m => {
|
waitFor("setDesktopType", m => {
|
||||||
m.setDesktopType("all");
|
m.setDesktopType("all");
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,4 +10,17 @@ import "./screenshare";
|
||||||
console.log("read if cute :3");
|
console.log("read if cute :3");
|
||||||
|
|
||||||
export * as Components from "./components";
|
export * as Components from "./components";
|
||||||
export { Settings } from "./settings";
|
import { Settings } from "./settings";
|
||||||
|
export { Settings };
|
||||||
|
|
||||||
|
const arRPC = Vencord.Plugins.plugins["WebRichPresence (arRPC)"];
|
||||||
|
|
||||||
|
arRPC.required = !!Settings.store.arRPC;
|
||||||
|
|
||||||
|
Settings.addChangeListener("arRPC", v => {
|
||||||
|
arRPC.required = !!v;
|
||||||
|
if (v && !arRPC.started) Vencord.Plugins.startPlugin(arRPC);
|
||||||
|
else if (arRPC.started) {
|
||||||
|
Vencord.Plugins.stopPlugin(arRPC);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
|
@ -4,17 +4,16 @@
|
||||||
* Copyright (c) 2023 Vendicated and Vencord contributors
|
* Copyright (c) 2023 Vendicated and Vencord contributors
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import { useEffect, useReducer } from "@vencord/types/webpack/common";
|
||||||
import { SettingsStore } from "shared/utils/SettingsStore";
|
import { SettingsStore } from "shared/utils/SettingsStore";
|
||||||
|
|
||||||
import { Common } from "./vencord";
|
|
||||||
|
|
||||||
export const Settings = new SettingsStore(VencordDesktopNative.settings.get());
|
export const Settings = new SettingsStore(VencordDesktopNative.settings.get());
|
||||||
Settings.addGlobalChangeListener((o, p) => VencordDesktopNative.settings.set(o, p));
|
Settings.addGlobalChangeListener((o, p) => VencordDesktopNative.settings.set(o, p));
|
||||||
|
|
||||||
export function useSettings() {
|
export function useSettings() {
|
||||||
const [, update] = Common.React.useReducer(x => x + 1, 0);
|
const [, update] = useReducer(x => x + 1, 0);
|
||||||
|
|
||||||
Common.React.useEffect(() => {
|
useEffect(() => {
|
||||||
Settings.addGlobalChangeListener(update);
|
Settings.addGlobalChangeListener(update);
|
||||||
|
|
||||||
return () => Settings.removeGlobalChangeListener(update);
|
return () => Settings.removeGlobalChangeListener(update);
|
||||||
|
|
|
@ -1,13 +0,0 @@
|
||||||
/*
|
|
||||||
* SPDX-License-Identifier: GPL-3.0
|
|
||||||
* Vencord Desktop, a desktop app aiming to give you a snappier Discord Experience
|
|
||||||
* Copyright (c) 2023 Vendicated and Vencord contributors
|
|
||||||
*/
|
|
||||||
|
|
||||||
// FIXME: this is terrible
|
|
||||||
|
|
||||||
const { Webpack, Plugins, Util } = Vencord;
|
|
||||||
const { Common } = Webpack;
|
|
||||||
const { plugins } = Plugins;
|
|
||||||
|
|
||||||
export { Common, Plugins, plugins, Util, Webpack };
|
|
|
@ -10,11 +10,12 @@ export const enum IpcEvents {
|
||||||
GET_RENDERER_SCRIPT = "VCD_GET_RENDERER_SCRIPT",
|
GET_RENDERER_SCRIPT = "VCD_GET_RENDERER_SCRIPT",
|
||||||
GET_RENDERER_CSS_FILE = "VCD_GET_RENDERER_CSS_FILE",
|
GET_RENDERER_CSS_FILE = "VCD_GET_RENDERER_CSS_FILE",
|
||||||
|
|
||||||
RELAUNCH = "VCD_RELAUNCH",
|
|
||||||
FOCUS = "VCD_FOCUS",
|
|
||||||
|
|
||||||
GET_VERSION = "VCD_GET_VERSION",
|
GET_VERSION = "VCD_GET_VERSION",
|
||||||
|
|
||||||
|
RELAUNCH = "VCD_RELAUNCH",
|
||||||
|
CLOSE = "VCD_CLOSE",
|
||||||
|
FOCUS = "VCD_FOCUS",
|
||||||
|
|
||||||
SHOW_ITEM_IN_FOLDER = "VCD_SHOW_ITEM_IN_FOLDER",
|
SHOW_ITEM_IN_FOLDER = "VCD_SHOW_ITEM_IN_FOLDER",
|
||||||
GET_SETTINGS = "VCD_GET_SETTINGS",
|
GET_SETTINGS = "VCD_GET_SETTINGS",
|
||||||
SET_SETTINGS = "VCD_SET_SETTINGS",
|
SET_SETTINGS = "VCD_SET_SETTINGS",
|
||||||
|
@ -29,5 +30,7 @@ export const enum IpcEvents {
|
||||||
|
|
||||||
CAPTURER_GET_SOURCES = "VCD_CAPTURER_GET_SOURCES",
|
CAPTURER_GET_SOURCES = "VCD_CAPTURER_GET_SOURCES",
|
||||||
|
|
||||||
CLOSE = "VCD_CLOSE"
|
AUTOSTART_ENABLED = "VCD_AUTOSTART_ENABLED",
|
||||||
|
ENABLE_AUTOSTART = "VCD_ENABLE_AUTOSTART",
|
||||||
|
DISABLE_AUTOSTART = "VCD_DISABLE_AUTOSTART",
|
||||||
}
|
}
|
||||||
|
|
4
src/shared/settings.d.ts
vendored
4
src/shared/settings.d.ts
vendored
|
@ -17,4 +17,8 @@ export interface Settings {
|
||||||
tray?: boolean;
|
tray?: boolean;
|
||||||
minimizeToTray?: boolean;
|
minimizeToTray?: boolean;
|
||||||
skippedUpdate?: string;
|
skippedUpdate?: string;
|
||||||
|
staticTitle?: boolean;
|
||||||
|
arRPC?: boolean;
|
||||||
|
|
||||||
|
firstLaunch?: boolean;
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,11 +22,18 @@ let updateData: UpdateData;
|
||||||
|
|
||||||
ipcMain.handle(IpcEvents.UPDATER_GET_DATA, () => updateData);
|
ipcMain.handle(IpcEvents.UPDATER_GET_DATA, () => updateData);
|
||||||
ipcMain.handle(IpcEvents.UPDATER_DOWNLOAD, () => {
|
ipcMain.handle(IpcEvents.UPDATER_DOWNLOAD, () => {
|
||||||
|
const portable = !!process.env.PORTABLE_EXECUTABLE_FILE;
|
||||||
|
|
||||||
const { assets } = updateData.release;
|
const { assets } = updateData.release;
|
||||||
const url = (() => {
|
const url = (() => {
|
||||||
switch (process.platform) {
|
switch (process.platform) {
|
||||||
case "win32":
|
case "win32":
|
||||||
return assets.find(a => a.name.endsWith(".exe"))!.browser_download_url;
|
return assets.find(a => {
|
||||||
|
if (!a.name.endsWith(".exe")) return false;
|
||||||
|
|
||||||
|
const isSetup = a.name.includes("Setup");
|
||||||
|
return portable ? !isSetup : isSetup;
|
||||||
|
})!.browser_download_url;
|
||||||
case "darwin":
|
case "darwin":
|
||||||
return assets.find(a => a.name.endsWith(".dmg"))!.browser_download_url;
|
return assets.find(a => a.name.endsWith(".dmg"))!.browser_download_url;
|
||||||
case "linux":
|
case "linux":
|
||||||
|
|
|
@ -13,16 +13,17 @@
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<h1>About Vencord Desktop</h1>
|
<h1>Vencord Desktop %VERSION%</h1>
|
||||||
<p>
|
<p>
|
||||||
Vencord Desktop is a free/libre cross platform desktop app aiming to give you a snappier Discord experience with
|
Vencord Desktop is a free/libre cross platform desktop app aiming to give you a snappier Discord experience with
|
||||||
Vencord pre-installed
|
Vencord pre-installed
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
<section>
|
||||||
<h2>Links</h2>
|
<h2>Links</h2>
|
||||||
<ul>
|
<ul>
|
||||||
<li>
|
<li>
|
||||||
<a href="https://vencord.dev">Vencord Website</a>
|
<a href="https://vencord.dev" target="_blank">Vencord Website</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="https://github.com/Vencord/Desktop" target="_blank">Source Code</a>
|
<a href="https://github.com/Vencord/Desktop" target="_blank">Source Code</a>
|
||||||
|
@ -31,4 +32,31 @@
|
||||||
<a href="https://github.com/Vencord/Desktop/issues" target="_blank">Report bugs / Request features</a>
|
<a href="https://github.com/Vencord/Desktop/issues" target="_blank">Report bugs / Request features</a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<h2>Acknowledgements</h2>
|
||||||
|
<p>These awesome libraries empower Vencord Desktop</p>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<a href="https://github.com/electron/electron" target="_blank">Electron</a>
|
||||||
|
- Build cross-platform desktop apps with JavaScript, HTML, and CSS
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="https://github.com/electron-userland/electron-builder" target="_blank">Electron Builder</a>
|
||||||
|
- A complete solution to package and build a ready for distribution Electron app with “auto update”
|
||||||
|
support out of the box
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="https://github.com/OpenAsar/arrpc" target="_blank">arrpc</a>
|
||||||
|
- An open implementation of Discord's Rich Presence server
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
And many
|
||||||
|
<a href="https://github.com/Vencord/Desktop/blob/main/pnpm-lock.yaml" target="_blank"
|
||||||
|
>more awesome open source libraries</a
|
||||||
|
>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
</body>
|
</body>
|
||||||
|
|
180
static/first-launch.html
Normal file
180
static/first-launch.html
Normal file
|
@ -0,0 +1,180 @@
|
||||||
|
<head>
|
||||||
|
<style>
|
||||||
|
:root {
|
||||||
|
--bg: white;
|
||||||
|
--fg: black;
|
||||||
|
--fg-secondary: #313338;
|
||||||
|
--fg-semi-trans: rgb(0 0 0 / 0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: dark) {
|
||||||
|
:root {
|
||||||
|
--bg: hsl(223 6.7% 20.6%);
|
||||||
|
--fg: white;
|
||||||
|
--fg-secondary: #b5bac1;
|
||||||
|
--fg-semi-trans: rgb(255 255 255 / 0.2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
height: 100vh;
|
||||||
|
|
||||||
|
font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell,
|
||||||
|
"Open Sans", "Helvetica Neue", sans-serif;
|
||||||
|
margin: 0;
|
||||||
|
padding: 1.5em;
|
||||||
|
padding-bottom: 1em;
|
||||||
|
|
||||||
|
border: 1px solid var(--fg-semi-trans);
|
||||||
|
border-top: none;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
body,
|
||||||
|
select {
|
||||||
|
background: var(--bg);
|
||||||
|
color: var(--fg);
|
||||||
|
}
|
||||||
|
|
||||||
|
select {
|
||||||
|
padding: 0.3em;
|
||||||
|
margin: -0.3em;
|
||||||
|
border-radius: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
margin: 0.4em 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
margin: 1em 0 2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
form {
|
||||||
|
display: grid;
|
||||||
|
gap: 1em;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
label {
|
||||||
|
position: relative;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
}
|
||||||
|
|
||||||
|
label:has(input[type="checkbox"]),
|
||||||
|
select {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
label:not(:last-child)::after {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
bottom: -10px;
|
||||||
|
width: 100%;
|
||||||
|
height: 1px;
|
||||||
|
background-color: var(--fg-secondary);
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
label div {
|
||||||
|
display: grid;
|
||||||
|
gap: 0.2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
label h2 {
|
||||||
|
margin: 0;
|
||||||
|
font-weight: normal;
|
||||||
|
font-size: 1.1rem;
|
||||||
|
line-height: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
label span {
|
||||||
|
font-size: 0.9rem;
|
||||||
|
font-weight: 400;
|
||||||
|
color: var(--fg-secondary);
|
||||||
|
}
|
||||||
|
|
||||||
|
#buttons {
|
||||||
|
display: flex;
|
||||||
|
justify-content: end;
|
||||||
|
gap: 0.5em;
|
||||||
|
margin-top: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
button {
|
||||||
|
padding: 0.6em;
|
||||||
|
background: red;
|
||||||
|
color: white;
|
||||||
|
border-radius: 6px;
|
||||||
|
border: none;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: 200ms filter;
|
||||||
|
}
|
||||||
|
|
||||||
|
button:hover {
|
||||||
|
filter: brightness(0.8);
|
||||||
|
}
|
||||||
|
|
||||||
|
#submit {
|
||||||
|
background: green;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<h1>Welcome to Vencord Desktop</h1>
|
||||||
|
<p>Let's customise your experience!</p>
|
||||||
|
|
||||||
|
<form>
|
||||||
|
<label>
|
||||||
|
<h2>Discord Branch</h2>
|
||||||
|
<select name="discordBranch">
|
||||||
|
<option value="stable">stable</option>
|
||||||
|
<option value="canary">canary</option>
|
||||||
|
<option value="ptb">ptb</option>
|
||||||
|
</select>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<label>
|
||||||
|
<div>
|
||||||
|
<h2>Start with System</h2>
|
||||||
|
<span>Automatically open Vencord Desktop when your computer starts</span>
|
||||||
|
</div>
|
||||||
|
<input type="checkbox" name="autoStart" checked />
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<label>
|
||||||
|
<div>
|
||||||
|
<h2>Import Settings</h2>
|
||||||
|
<span>Import Settings from existing Vencord install (if found)</span>
|
||||||
|
</div>
|
||||||
|
<input type="checkbox" name="importSettings" checked />
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<label>
|
||||||
|
<div>
|
||||||
|
<h2>Minimise to Tray</h2>
|
||||||
|
<span>Minimise to Tray when closing</span>
|
||||||
|
</div>
|
||||||
|
<input type="checkbox" name="minimizeToTray" checked />
|
||||||
|
</label>
|
||||||
|
</form>
|
||||||
|
<div id="buttons">
|
||||||
|
<button id="cancel">Cancel</button>
|
||||||
|
<button id="submit">Submit</button>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
cancel.onclick = () => console.info("cancel");
|
||||||
|
submit.onclick = e => {
|
||||||
|
const form = document.querySelector("form");
|
||||||
|
const formData = new FormData(form);
|
||||||
|
const data = Object.fromEntries(formData.entries());
|
||||||
|
console.info("form:" + JSON.stringify(data));
|
||||||
|
e.preventDefault();
|
||||||
|
};
|
||||||
|
</script>
|
|
@ -10,7 +10,12 @@
|
||||||
"target": "ESNEXT",
|
"target": "ESNEXT",
|
||||||
"jsx": "preserve",
|
"jsx": "preserve",
|
||||||
|
|
||||||
"baseUrl": "./src/"
|
// we have duplicate electron types but it's w/e
|
||||||
|
"skipLibCheck": true,
|
||||||
|
|
||||||
|
"baseUrl": "./src/",
|
||||||
|
|
||||||
|
"typeRoots": ["./node_modules/@types", "./node_modules/@vencord"]
|
||||||
},
|
},
|
||||||
"include": ["src/**/*"]
|
"include": ["src/**/*"]
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue