Compare commits
8 Commits
1293331c50
...
v1.1.0
| Author | SHA1 | Date | |
|---|---|---|---|
| 7d1e19d881 | |||
| 6c6da941d5 | |||
| 6c46a31fe9 | |||
| 0b1bd727e6 | |||
| 59244e2b54 | |||
| ebed6c078c | |||
| 7d49209c0b | |||
| e47e722e27 |
@@ -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:
|
||||||
|
|||||||
@@ -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',
|
||||||
|
|||||||
@@ -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',
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user