8 Commits

5 changed files with 55 additions and 11 deletions

View File

@@ -41,6 +41,12 @@ jobs:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
ELECTRON_BUILDER_ALLOW_EMPTY_REPOSITORY: true ELECTRON_BUILDER_ALLOW_EMPTY_REPOSITORY: true
- name: Extract Version
id: get_version
run: |
VERSION=$(node -p "require('./frontend/package.json').version")
echo "VERSION=$VERSION" >> $GITHUB_OUTPUT
- name: Upload Release Artifacts - name: Upload Release Artifacts
uses: softprops/action-gh-release@v2 uses: softprops/action-gh-release@v2
if: startsWith(github.ref, 'refs/tags/') || github.ref == 'refs/heads/main' if: startsWith(github.ref, 'refs/tags/') || github.ref == 'refs/heads/main'
@@ -49,8 +55,8 @@ jobs:
frontend/release/*.AppImage frontend/release/*.AppImage
frontend/release/*.deb frontend/release/*.deb
frontend/release/*.exe frontend/release/*.exe
tag_name: v${{ github.run_number }} tag_name: v${{ steps.get_version.outputs.VERSION }}
name: Release v${{ github.run_number }} name: Release v${{ steps.get_version.outputs.VERSION }}
draft: false draft: false
prerelease: false prerelease: false
env: env:

View File

@@ -508,7 +508,7 @@ electron_1.ipcMain.handle('switch-account', async (event, loginName) => await ha
electron_1.ipcMain.handle('open-external', (event, url) => electron_1.shell.openExternal(url)); electron_1.ipcMain.handle('open-external', (event, url) => electron_1.shell.openExternal(url));
electron_1.ipcMain.handle('open-steam-login', async (event, expectedSteamId) => { electron_1.ipcMain.handle('open-steam-login', async (event, expectedSteamId) => {
const loginSession = electron_1.session.fromPartition('persist:steam-login'); const loginSession = electron_1.session.fromPartition('persist:steam-login');
await loginSession.clearStorageData({ storages: ['cookies', 'localstorage', 'indexdb'] }); // Removed: automatic clearStorageData to allow cookie persistence
return new Promise((resolve) => { return new Promise((resolve) => {
const loginWindow = new electron_1.BrowserWindow({ const loginWindow = new electron_1.BrowserWindow({
width: 800, height: 700, parent: mainWindow || undefined, modal: true, title: 'Login to Steam', width: 800, height: 700, parent: mainWindow || undefined, modal: true, title: 'Login to Steam',

View File

@@ -495,7 +495,8 @@ ipcMain.handle('open-external', (event, url: string) => shell.openExternal(url))
ipcMain.handle('open-steam-login', async (event, expectedSteamId: string) => { ipcMain.handle('open-steam-login', async (event, expectedSteamId: string) => {
const loginSession = session.fromPartition('persist:steam-login'); const loginSession = session.fromPartition('persist:steam-login');
await loginSession.clearStorageData({ storages: ['cookies', 'localstorage', 'indexdb'] }); // Removed: automatic clearStorageData to allow cookie persistence
return new Promise<boolean>((resolve) => { return new Promise<boolean>((resolve) => {
const loginWindow = new BrowserWindow({ const loginWindow = new BrowserWindow({
width: 800, height: 700, parent: mainWindow || undefined, modal: true, title: 'Login to Steam', width: 800, height: 700, parent: mainWindow || undefined, modal: true, title: 'Login to Steam',

View File

@@ -1,7 +1,7 @@
{ {
"name": "ultimate-ban-tracker-desktop", "name": "ultimate-ban-tracker-desktop",
"description": "Professional Steam Account Manager & Ban Tracker", "description": "Professional Steam Account Manager & Ban Tracker",
"version": "1.0.0", "version": "1.1.0",
"author": "Nils Pukropp <nils@narl.io>", "author": "Nils Pukropp <nils@narl.io>",
"homepage": "https://narl.io", "homepage": "https://narl.io",
"license": "SEE LICENSE IN LICENSE", "license": "SEE LICENSE IN LICENSE",

View File

@@ -24,6 +24,7 @@ import PublicIcon from '@mui/icons-material/Public';
import ShieldIcon from '@mui/icons-material/Shield'; import ShieldIcon from '@mui/icons-material/Shield';
import GppBadIcon from '@mui/icons-material/GppBad'; import GppBadIcon from '@mui/icons-material/GppBad';
import PeopleIcon from '@mui/icons-material/People'; import PeopleIcon from '@mui/icons-material/People';
import VerifiedUserIcon from '@mui/icons-material/VerifiedUser';
import { useAccounts, type Account } from '../hooks/useAccounts'; import { useAccounts, type Account } from '../hooks/useAccounts';
import { useAppTheme } from '../theme/ThemeContext'; import { useAppTheme } from '../theme/ThemeContext';
import type { ThemeType } from '../theme/SteamTheme'; import type { ThemeType } from '../theme/SteamTheme';
@@ -490,17 +491,53 @@ const AccountRow: React.FC<{
)} )}
</TableCell> </TableCell>
<TableCell align="right"> <TableCell align="right">
<Box sx={{ display: 'flex', justifyContent: 'flex-end', gap: 0.5 }}> <Box sx={{ display: 'flex', justifyContent: 'flex-end', gap: 0.5, alignItems: 'center' }}>
{account?.steamLoginSecure ? ( {/* Fast Switcher Button - Always available if we have a login name */}
{account.loginName && (
<Button <Button
variant="contained" size="small" onClick={() => onSwitch(account.loginName || '')} variant="contained"
sx={{ height: 28, fontSize: '0.7rem', bgcolor: 'secondary.main', '&:hover': { opacity: 0.9 } }} size="small"
onClick={() => onSwitch(account.loginName || '')}
sx={{
height: 28,
fontSize: '0.7rem',
bgcolor: 'secondary.main',
'&:hover': { opacity: 0.9 },
minWidth: 60
}}
> >
LOGIN LOGIN
</Button> </Button>
) : (
<Button variant="outlined" size="small" onClick={onAuth} sx={{ height: 28, fontSize: '0.7rem' }}>AUTH</Button>
)} )}
{/* Scraper Auth Button - Controls the optional cooldown tracking */}
<Tooltip title={account.steamLoginSecure && !account.authError ? "Session valid - Tracking active" : (account.steamLoginSecure ? "Refresh scraper session" : "Authenticate for cooldown tracking")}>
<Box sx={{ display: 'flex', alignItems: 'center', gap: 0.5 }}>
<IconButton
size="small"
onClick={onAuth}
disabled={!!(account.steamLoginSecure && !account.authError)}
sx={{
color: account.steamLoginSecure && !account.authError ? 'success.main' : (account.authError ? 'error.main' : 'warning.main'),
border: '1px solid',
borderColor: account.steamLoginSecure && !account.authError ? 'success.main' : 'divider',
borderRadius: 1,
opacity: account.steamLoginSecure && !account.authError ? 1 : 1,
background: account.steamLoginSecure && !account.authError ? 'rgba(163, 207, 6, 0.1)' : 'transparent'
}}
>
{account.steamLoginSecure && !account.authError ? <VerifiedUserIcon fontSize="inherit" /> : (account.authError ? <LockResetIcon fontSize="inherit" /> : <BoltIcon fontSize="inherit" />)}
</IconButton>
{account.steamLoginSecure && !account.authError && (
<Typography variant="caption" sx={{ color: 'success.main', fontWeight: 'bold', fontSize: '0.6rem', letterSpacing: '0.5px' }}>
TRACKING
</Typography>
)}
</Box>
</Tooltip>
<Divider orientation="vertical" flexItem sx={{ mx: 0.5, my: 0.5 }} />
<IconButton size="small" onClick={handleOpenShare} disabled={!serverConfig?.token}><ShareIcon fontSize="inherit" sx={{ color: 'primary.main' }}/></IconButton> <IconButton size="small" onClick={handleOpenShare} disabled={!serverConfig?.token}><ShareIcon fontSize="inherit" sx={{ color: 'primary.main' }}/></IconButton>
<IconButton size="small" sx={{ color: 'text.secondary' }} onClick={() => (window as any).electronAPI.openExternal(account?.profileUrl || '')}><OpenInNewIcon fontSize="inherit"/></IconButton> <IconButton size="small" sx={{ color: 'text.secondary' }} onClick={() => (window as any).electronAPI.openExternal(account?.profileUrl || '')}><OpenInNewIcon fontSize="inherit"/></IconButton>
<IconButton size="small" sx={{ color: 'error.main' }} onClick={() => onDelete(account?._id || '')}><DeleteIcon fontSize="inherit"/></IconButton> <IconButton size="small" sx={{ color: 'error.main' }} onClick={() => onDelete(account?._id || '')}><DeleteIcon fontSize="inherit"/></IconButton>