Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0f4ee9f78c
|
||
|
|
cc5d814740
|
||
|
|
53ecbbd07f
|
No files matched your search
@@ -28,7 +28,7 @@
|
|||||||
"@tailwindcss/postcss": "4.1.18",
|
"@tailwindcss/postcss": "4.1.18",
|
||||||
"@tauri-apps/cli": "2.9.6",
|
"@tauri-apps/cli": "2.9.6",
|
||||||
"@types/crypto-js": "4.2.2",
|
"@types/crypto-js": "4.2.2",
|
||||||
"@types/node": "25.0.10",
|
"@types/node": "25.1.0",
|
||||||
"@types/react": "19.2.10",
|
"@types/react": "19.2.10",
|
||||||
"@types/react-dom": "19.2.3",
|
"@types/react-dom": "19.2.3",
|
||||||
"crypto-js": "4.2.0",
|
"crypto-js": "4.2.0",
|
||||||
@@ -290,7 +290,7 @@
|
|||||||
|
|
||||||
"@types/json5": ["@types/json5@0.0.29", "", {}, "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ=="],
|
"@types/json5": ["@types/json5@0.0.29", "", {}, "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ=="],
|
||||||
|
|
||||||
"@types/node": ["@types/node@25.0.10", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-zWW5KPngR/yvakJgGOmZ5vTBemDoSqF3AcV/LrO5u5wTWyEAVVh+IT39G4gtyAkh3CtTZs8aX/yRM82OfzHJRg=="],
|
"@types/node": ["@types/node@25.1.0", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-t7frlewr6+cbx+9Ohpl0NOTKXZNV9xHRmNOvql47BFJKcEG1CxtxlPEEe+gR9uhVWM4DwhnvTF110mIL4yP9RA=="],
|
||||||
|
|
||||||
"@types/react": ["@types/react@19.2.10", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-WPigyYuGhgZ/cTPRXB2EwUw+XvsRA3GqHlsP4qteqrnnjDrApbS7MxcGr/hke5iUoeB7E/gQtrs9I37zAJ0Vjw=="],
|
"@types/react": ["@types/react@19.2.10", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-WPigyYuGhgZ/cTPRXB2EwUw+XvsRA3GqHlsP4qteqrnnjDrApbS7MxcGr/hke5iUoeB7E/gQtrs9I37zAJ0Vjw=="],
|
||||||
|
|
||||||
@@ -398,7 +398,7 @@
|
|||||||
|
|
||||||
"balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
|
"balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
|
||||||
|
|
||||||
"baseline-browser-mapping": ["baseline-browser-mapping@2.9.18", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-e23vBV1ZLfjb9apvfPk4rHVu2ry6RIr2Wfs+O324okSidrX7pTAnEJPCh/O5BtRlr7QtZI7ktOP3vsqr7Z5XoA=="],
|
"baseline-browser-mapping": ["baseline-browser-mapping@2.9.19", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg=="],
|
||||||
|
|
||||||
"brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="],
|
"brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="],
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "lncvrt-games-launcher",
|
"name": "lncvrt-games-launcher",
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "1.5.1",
|
"version": "1.5.2",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "next dev",
|
"dev": "next dev",
|
||||||
@@ -34,7 +34,7 @@
|
|||||||
"@tailwindcss/postcss": "4.1.18",
|
"@tailwindcss/postcss": "4.1.18",
|
||||||
"@tauri-apps/cli": "2.9.6",
|
"@tauri-apps/cli": "2.9.6",
|
||||||
"@types/crypto-js": "4.2.2",
|
"@types/crypto-js": "4.2.2",
|
||||||
"@types/node": "25.0.10",
|
"@types/node": "25.1.0",
|
||||||
"@types/react": "19.2.10",
|
"@types/react": "19.2.10",
|
||||||
"@types/react-dom": "19.2.3",
|
"@types/react-dom": "19.2.3",
|
||||||
"crypto-js": "4.2.0",
|
"crypto-js": "4.2.0",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "lncvrt-games-launcher"
|
name = "lncvrt-games-launcher"
|
||||||
version = "1.5.1"
|
version = "1.5.2"
|
||||||
authors = ["Lncvrt"]
|
authors = ["Lncvrt"]
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"$schema": "https://schema.tauri.app/config/2",
|
"$schema": "https://schema.tauri.app/config/2",
|
||||||
"productName": "Lncvrt Games Launcher",
|
"productName": "Lncvrt Games Launcher",
|
||||||
"version": "1.5.1",
|
"version": "1.5.2",
|
||||||
"identifier": "xyz.lncvrt.games-launcher",
|
"identifier": "xyz.lncvrt.games-launcher",
|
||||||
"build": {
|
"build": {
|
||||||
"beforeDevCommand": "next dev",
|
"beforeDevCommand": "next dev",
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"$schema": "https://schema.tauri.app/config/2",
|
"$schema": "https://schema.tauri.app/config/2",
|
||||||
"productName": "Lncvrt Games Launcher",
|
"productName": "Lncvrt Games Launcher",
|
||||||
"version": "1.5.1",
|
"version": "1.5.2",
|
||||||
"identifier": "xyz.lncvrt.games-launcher",
|
"identifier": "xyz.lncvrt.games-launcher",
|
||||||
"build": {
|
"build": {
|
||||||
"beforeDevCommand": "next dev",
|
"beforeDevCommand": "next dev",
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"$schema": "https://schema.tauri.app/config/2",
|
"$schema": "https://schema.tauri.app/config/2",
|
||||||
"productName": "Lncvrt Games Launcher",
|
"productName": "Lncvrt Games Launcher",
|
||||||
"version": "1.5.1",
|
"version": "1.5.2",
|
||||||
"identifier": "xyz.lncvrt.games-launcher",
|
"identifier": "xyz.lncvrt.games-launcher",
|
||||||
"build": {
|
"build": {
|
||||||
"beforeDevCommand": "next dev",
|
"beforeDevCommand": "next dev",
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"$schema": "https://schema.tauri.app/config/2",
|
"$schema": "https://schema.tauri.app/config/2",
|
||||||
"productName": "Lncvrt Games Launcher",
|
"productName": "Lncvrt Games Launcher",
|
||||||
"version": "1.5.1",
|
"version": "1.5.2",
|
||||||
"identifier": "xyz.lncvrt.games-launcher",
|
"identifier": "xyz.lncvrt.games-launcher",
|
||||||
"build": {
|
"build": {
|
||||||
"beforeDevCommand": "next dev",
|
"beforeDevCommand": "next dev",
|
||||||
|
|||||||
@@ -1,48 +0,0 @@
|
|||||||
import { useEffect, useRef } from 'react'
|
|
||||||
import BerryNoColor from '../assets/berries/BerryNoColor.png'
|
|
||||||
|
|
||||||
export default function RandomBerry () {
|
|
||||||
const canvasRef = useRef<HTMLCanvasElement>(null)
|
|
||||||
const imgRef = useRef<HTMLImageElement>(document.createElement('img'))
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
imgRef.current.src = BerryNoColor.src
|
|
||||||
const canvas = canvasRef.current
|
|
||||||
const ctx = canvas?.getContext('2d')
|
|
||||||
if (!canvas || !ctx) return
|
|
||||||
|
|
||||||
canvas.width = 24
|
|
||||||
canvas.height = 24
|
|
||||||
|
|
||||||
let frame: number
|
|
||||||
const frequency = 5
|
|
||||||
|
|
||||||
const update = () => {
|
|
||||||
const t = (performance.now() / 1000) * frequency
|
|
||||||
|
|
||||||
ctx.clearRect(0, 0, canvas.width, canvas.height)
|
|
||||||
ctx.drawImage(imgRef.current, 0, 0, canvas.width, canvas.height)
|
|
||||||
|
|
||||||
const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height)
|
|
||||||
const data = imageData.data
|
|
||||||
|
|
||||||
for (let i = 0; i < data.length; i += 4) {
|
|
||||||
const gray = data[i]
|
|
||||||
const r = (Math.sin(t) * 0.5 + 0.5) * 255 * (gray / 255)
|
|
||||||
const g = (Math.sin(t + 2) * 0.5 + 0.5) * 255 * (gray / 255)
|
|
||||||
const b = (Math.sin(t + 4) * 0.5 + 0.5) * 255 * (gray / 255)
|
|
||||||
data[i] = r
|
|
||||||
data[i + 1] = g
|
|
||||||
data[i + 2] = b
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx.putImageData(imageData, 0, 0)
|
|
||||||
frame = requestAnimationFrame(update)
|
|
||||||
}
|
|
||||||
|
|
||||||
imgRef.current.onload = () => update()
|
|
||||||
return () => cancelAnimationFrame(frame)
|
|
||||||
}, [])
|
|
||||||
|
|
||||||
return <canvas ref={canvasRef} style={{ width: 24, height: 24 }} />
|
|
||||||
}
|
|
||||||
@@ -3,16 +3,11 @@
|
|||||||
import { useGlobal } from '../GlobalProvider'
|
import { useGlobal } from '../GlobalProvider'
|
||||||
|
|
||||||
export default function VersionChangelog () {
|
export default function VersionChangelog () {
|
||||||
const {
|
const { getVersionInfo, managingVersion, downloadedVersionsConfig } =
|
||||||
getGameInfo,
|
useGlobal()
|
||||||
getVersionInfo,
|
|
||||||
managingVersion,
|
|
||||||
downloadedVersionsConfig
|
|
||||||
} = useGlobal()
|
|
||||||
if (!managingVersion || !downloadedVersionsConfig) return <></>
|
if (!managingVersion || !downloadedVersionsConfig) return <></>
|
||||||
|
|
||||||
const versionInfo = getVersionInfo(managingVersion)
|
const versionInfo = getVersionInfo(managingVersion)
|
||||||
const gameInfo = getGameInfo(versionInfo?.game)
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
|
|||||||
+58
-18
@@ -1,6 +1,6 @@
|
|||||||
'use client'
|
'use client'
|
||||||
|
|
||||||
import { useEffect, useState } from 'react'
|
import { useEffect, useRef, useState } from 'react'
|
||||||
import Sidebar from './componets/Sidebar'
|
import Sidebar from './componets/Sidebar'
|
||||||
import './Globals.css'
|
import './Globals.css'
|
||||||
import { DownloadProgress } from './types/DownloadProgress'
|
import { DownloadProgress } from './types/DownloadProgress'
|
||||||
@@ -82,6 +82,7 @@ export default function RootLayout ({
|
|||||||
const [selectedGame, setSelectedGame] = useState<number | null>(null)
|
const [selectedGame, setSelectedGame] = useState<number | null>(null)
|
||||||
|
|
||||||
const pathname = usePathname()
|
const pathname = usePathname()
|
||||||
|
const revisionCheck = useRef(false)
|
||||||
|
|
||||||
function getSpecialVersionsList (game?: number): GameVersion[] {
|
function getSpecialVersionsList (game?: number): GameVersion[] {
|
||||||
if (!normalConfig || !serverVersionList) return []
|
if (!normalConfig || !serverVersionList) return []
|
||||||
@@ -276,7 +277,6 @@ export default function RootLayout ({
|
|||||||
const versionsConfig = await readVersionsConfig()
|
const versionsConfig = await readVersionsConfig()
|
||||||
setDownloadedVersionsConfig(versionsConfig)
|
setDownloadedVersionsConfig(versionsConfig)
|
||||||
setNormalConfig(normalConfig)
|
setNormalConfig(normalConfig)
|
||||||
setLoadingText('Finishing...')
|
|
||||||
setLoading(false)
|
setLoading(false)
|
||||||
|
|
||||||
if (!(await isPermissionGranted())) {
|
if (!(await isPermissionGranted())) {
|
||||||
@@ -292,8 +292,11 @@ export default function RootLayout ({
|
|||||||
return () => document.removeEventListener('contextmenu', handler)
|
return () => document.removeEventListener('contextmenu', handler)
|
||||||
}, [])
|
}, [])
|
||||||
|
|
||||||
async function downloadVersions (): Promise<void> {
|
async function downloadVersions (
|
||||||
const list = selectedVersionList
|
list: string[],
|
||||||
|
currentConfig: VersionsConfig
|
||||||
|
): Promise<void> {
|
||||||
|
if (list.length === 0) return
|
||||||
setSelectedVersionList([])
|
setSelectedVersionList([])
|
||||||
|
|
||||||
const newDownloads = list.map(
|
const newDownloads = list.map(
|
||||||
@@ -309,41 +312,41 @@ export default function RootLayout ({
|
|||||||
setDownloadProgress(prev =>
|
setDownloadProgress(prev =>
|
||||||
prev.filter(d => d.version !== download.version)
|
prev.filter(d => d.version !== download.version)
|
||||||
)
|
)
|
||||||
return
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
const gameInfo = getGameInfo(info.game)
|
const gameInfo = getGameInfo(info.game)
|
||||||
if (!gameInfo) {
|
if (!gameInfo) {
|
||||||
setDownloadProgress(prev =>
|
setDownloadProgress(prev =>
|
||||||
prev.filter(d => d.version !== download.version)
|
prev.filter(d => d.version !== download.version)
|
||||||
)
|
)
|
||||||
return
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
setDownloadProgress(prev =>
|
setDownloadProgress(prev =>
|
||||||
prev.map(d =>
|
prev.map(d =>
|
||||||
d.version === download.version ? { ...d, queued: false } : d
|
d.version === download.version ? { ...d, queued: false } : d
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
const res = await invoke<string>('download', {
|
const res = await invoke<string>('download', {
|
||||||
url: info.downloadUrl,
|
url: info.downloadUrl,
|
||||||
name: info.id,
|
name: info.id,
|
||||||
executable: info.executable,
|
executable: info.executable,
|
||||||
hash: info.sha512sum
|
hash: info.sha512sum
|
||||||
})
|
})
|
||||||
if (res == '1') {
|
|
||||||
|
if (res === '1') {
|
||||||
setDownloadProgress(prev =>
|
setDownloadProgress(prev =>
|
||||||
prev.filter(d => d.version !== download.version)
|
prev.filter(d => d.version !== download.version)
|
||||||
)
|
)
|
||||||
let data = downloadedVersionsConfig
|
|
||||||
if (!data) {
|
|
||||||
setDownloadProgress(prev =>
|
|
||||||
prev.filter(d => d.version !== download.version)
|
|
||||||
)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
const date = Date.now()
|
const date = Date.now()
|
||||||
data.list = { ...data.list, [download.version]: date }
|
const newConfig = {
|
||||||
setDownloadedVersionsConfig(data)
|
...currentConfig,
|
||||||
writeVersionsConfig(data)
|
list: { ...currentConfig.list, [download.version]: date }
|
||||||
|
}
|
||||||
|
setDownloadedVersionsConfig(newConfig)
|
||||||
|
writeVersionsConfig(newConfig)
|
||||||
} else {
|
} else {
|
||||||
setDownloadProgress(prev =>
|
setDownloadProgress(prev =>
|
||||||
prev.map(d =>
|
prev.map(d =>
|
||||||
@@ -362,8 +365,41 @@ export default function RootLayout ({
|
|||||||
|
|
||||||
if (normalConfig?.settings.allowNotifications)
|
if (normalConfig?.settings.allowNotifications)
|
||||||
await notifyUser('Downloads Finished', 'All downloads have finished.')
|
await notifyUser('Downloads Finished', 'All downloads have finished.')
|
||||||
|
|
||||||
|
setFadeOut(true)
|
||||||
|
setTimeout(() => setShowPopup(false), 200)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (revisionCheck.current) return
|
||||||
|
if (!serverVersionList || !downloadedVersionsConfig) return
|
||||||
|
revisionCheck.current = true
|
||||||
|
;(async () => {
|
||||||
|
const newConfig = {
|
||||||
|
...downloadedVersionsConfig,
|
||||||
|
list: { ...downloadedVersionsConfig.list }
|
||||||
|
}
|
||||||
|
const versionsToSelect: string[] = []
|
||||||
|
|
||||||
|
for (const [key, value] of Object.entries(
|
||||||
|
downloadedVersionsConfig.list
|
||||||
|
)) {
|
||||||
|
const verInfo = serverVersionList.versions.find(item => item.id === key)
|
||||||
|
|
||||||
|
if (!verInfo || value / 1000 <= verInfo.lastRevision) {
|
||||||
|
delete newConfig.list[key]
|
||||||
|
versionsToSelect.push(key)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
setDownloadedVersionsConfig(newConfig)
|
||||||
|
writeVersionsConfig(newConfig)
|
||||||
|
setSelectedVersionList(prev => [...prev, ...versionsToSelect])
|
||||||
|
|
||||||
|
await downloadVersions(versionsToSelect, newConfig)
|
||||||
|
})()
|
||||||
|
}, [serverVersionList, downloadedVersionsConfig])
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<html lang='en' className={roboto.className}>
|
<html lang='en' className={roboto.className}>
|
||||||
@@ -801,7 +837,11 @@ export default function RootLayout ({
|
|||||||
onClick={() => {
|
onClick={() => {
|
||||||
setFadeOut(true)
|
setFadeOut(true)
|
||||||
setTimeout(() => setShowPopup(false), 200)
|
setTimeout(() => setShowPopup(false), 200)
|
||||||
downloadVersions()
|
if (downloadedVersionsConfig)
|
||||||
|
downloadVersions(
|
||||||
|
selectedVersionList,
|
||||||
|
downloadedVersionsConfig
|
||||||
|
)
|
||||||
}}
|
}}
|
||||||
disabled={downloadProgress.length != 0}
|
disabled={downloadProgress.length != 0}
|
||||||
title={
|
title={
|
||||||
|
|||||||
+2
-1
@@ -59,7 +59,8 @@ export default function Installs () {
|
|||||||
: 'h-[calc(100vh-84px)]'
|
: 'h-[calc(100vh-84px)]'
|
||||||
}`}
|
}`}
|
||||||
>
|
>
|
||||||
{downloadedVersionsConfig && downloadedVersionsConfig.list.length ? (
|
{downloadedVersionsConfig &&
|
||||||
|
Object.keys(downloadedVersionsConfig.list).length ? (
|
||||||
getListOfGames()
|
getListOfGames()
|
||||||
.sort((a, b) => {
|
.sort((a, b) => {
|
||||||
return a.id - b.id
|
return a.id - b.id
|
||||||
|
|||||||
Reference in new issue
Block a user