Skip to content

Commit f147848

Browse files
committed
Add setting fields to popup page
1 parent b30f9e1 commit f147848

File tree

8 files changed

+165
-47
lines changed

8 files changed

+165
-47
lines changed

src/core/BeatSaberCore.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ export class BeatSaberCore {
3636
logStateButton: false,
3737
logTrackPage: false,
3838
logWatchers: false,
39-
backendHostname: "localhost:23287",
40-
backendAuth: "YWRtaW46bmltZGE=",
39+
backendHostname: null,
40+
backendAuth: null,
4141
bsaberLogin: null,
4242
bsaberPassword: null,
4343
bsaberUsername: null,
@@ -88,6 +88,10 @@ export class BeatSaberCore {
8888
}
8989

9090
public async syncMaps() {
91+
if (!BeatSaber.Settings.backendHostname) {
92+
return
93+
}
94+
9195
const now = new Date().getTime()
9296
if (now - BeatSaber.Settings.lastSyncTime < 2 * 24 * 60 * 60 * 1000) {
9397
return

src/core/queue/requests/BookmarkRequest.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,9 @@ export class BookmarkRequest extends MapQueueRequest {
1414
}
1515

1616
async run() {
17-
const category = MapCategory.BOOKMARKED
18-
console.log("Bookmark", this.type, "by key", this.key)
17+
if (!BeatSaber.Settings.backendHostname) {
18+
throw new QueueError("Backend is not configured")
19+
}
1920

2021
if (
2122
!BeatSaber.Settings.bsaberLogin ||
@@ -24,6 +25,7 @@ export class BookmarkRequest extends MapQueueRequest {
2425
throw new QueueError("BeastSaber login data missing")
2526
}
2627

28+
const category = MapCategory.BOOKMARKED
2729
let map: Map
2830
switch (this.type) {
2931
case MapQueueRequestType.ADD:

src/core/queue/requests/DownloadRequest.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { Level } from "../../models/Level"
22
import { MapCategory } from "../../storage/MapStorage"
33
import { MapQueueRequest, MapQueueRequestType } from "../base/MapQueueRequest"
4+
import { QueueError } from "../base/QueueError"
45

56
export class DownloadRequest extends MapQueueRequest {
67
hash: string
@@ -13,9 +14,11 @@ export class DownloadRequest extends MapQueueRequest {
1314
}
1415

1516
async run() {
16-
const category = MapCategory.DOWNLOADED
17-
console.log("Download", this.type, "by hash", this.hash)
17+
if (!BeatSaber.Settings.backendHostname) {
18+
throw new QueueError("Backend is not configured")
19+
}
1820

21+
const category = MapCategory.DOWNLOADED
1922
let level: Level
2023
switch (this.type) {
2124
case MapQueueRequestType.ADD:

src/scss/popup-page.scss

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
.bs-queue-button {
2+
position: relative;
3+
4+
& > button {
5+
--button-size: 32px;
6+
width: unset;
7+
8+
small {
9+
vertical-align: middle;
10+
padding: 0 4px;
11+
}
12+
13+
&::before {
14+
vertical-align: middle;
15+
}
16+
}
17+
18+
.ConnectPopup {
19+
&__button {
20+
margin: 10px 0;
21+
}
22+
23+
&__content {
24+
padding: 0 20px;
25+
26+
.GlueSectionDivider {
27+
padding: 10px 0;
28+
}
29+
30+
.GlueToggle {
31+
display: inline-block;
32+
margin: 0 10px 0 0;
33+
}
34+
35+
span.bs-setting {
36+
vertical-align: top;
37+
}
38+
}
39+
40+
ul {
41+
margin: 0 -20px;
42+
}
43+
44+
.form-group input {
45+
padding: 5px;
46+
border: 0;
47+
background-color: #333;
48+
display: inline-block;
49+
width: 100%;
50+
color: #fff;
51+
52+
&::placeholder {
53+
color: #949494;
54+
}
55+
56+
&:focus {
57+
border-color: #404040;
58+
background-color: #404040;
59+
color: #fff;
60+
outline: 0;
61+
}
62+
}
63+
}
64+
}

src/scss/queue-button.scss

Lines changed: 0 additions & 34 deletions
This file was deleted.

src/scss/style.scss

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
@use "map-list";
88
@use "modal";
99
@use "now-playing";
10-
@use "queue-button";
10+
@use "popup-page";
1111
@use "search-field";
1212
@use "spinner";
1313
@use "track-header";

src/ui/pages/PopupPage.tsx

Lines changed: 77 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { ChangeEvent } from "react"
12
import { Subscription } from "rxjs"
23
import { TrackQueueRequest } from "../../core/queue/base/TrackQueueRequest"
34
import { QueueState } from "../../core/queue/TrackQueue"
@@ -67,19 +68,41 @@ export class PopupPage extends Spicetify.React.Component<
6768
return true
6869
}
6970

71+
handleInputChange(
72+
key: string,
73+
event: ChangeEvent<HTMLInputElement>
74+
): boolean {
75+
BeatSaber.Settings[key] = event.target.value
76+
BeatSaber.saveSettings()
77+
this.forceUpdate()
78+
return true
79+
}
80+
7081
handleItemClick(request: TrackQueueRequest) {
7182
const track = BeatSaber.TrackQueue.getTrack(request.slug)
7283
if (!track) return
7384
TrackPage.showAsModal(track)
7485
}
7586

7687
render() {
77-
const settings = {
88+
const toggles = {
7889
blockQueue: "Block queue",
79-
logQueue: "Enable TrackQueue logging",
80-
logStateButton: "Enable StateButton logging",
81-
logTrackPage: "Enable TrackPage logging",
82-
logWatchers: "Enable UI watchers logging",
90+
logQueue: "Debug TrackQueue",
91+
logMapQueue: "Debug MapQueue",
92+
logStateButton: "Debug StateButton",
93+
logTrackPage: "Debug TrackPage",
94+
logWatchers: "Debug UI watchers",
95+
}
96+
97+
const inputsBsaber = {
98+
bsaberUsername: "Username (profile name)",
99+
bsaberLogin: "Login (e-mail or login username)",
100+
bsaberPassword: "Password",
101+
}
102+
103+
const inputsBackend = {
104+
backendHostname: "Hostname (domain:port)",
105+
backendAuth: "Authentication",
83106
}
84107

85108
let requests = this.state.enqueued
@@ -119,7 +142,53 @@ export class PopupPage extends Spicetify.React.Component<
119142
</div>
120143

121144
<div className="ConnectPopup__content">
122-
{Object.entries(settings).flatMap(([key, value]) => [
145+
<GlueSectionDivider
146+
title="Settings"
147+
description="BeastSaber login"
148+
/>
149+
{Object.entries(inputsBsaber).map(([key, value]) => (
150+
<div className="form-group">
151+
<label htmlFor={key}>{value}</label>
152+
<br />
153+
<input
154+
placeholder={value}
155+
className="form-control"
156+
type={
157+
key.toLowerCase().includes("password")
158+
? "password"
159+
: "text"
160+
}
161+
name={key}
162+
value={BeatSaber.Settings[key]}
163+
onChange={this.handleInputChange.bind(
164+
this,
165+
key
166+
)}
167+
/>
168+
</div>
169+
))}
170+
171+
<GlueSectionDivider description="Backend config" />
172+
{Object.entries(inputsBackend).map(([key, value]) => (
173+
<div className="form-group">
174+
<label htmlFor={key}>{value}</label>
175+
<br />
176+
<input
177+
placeholder={value}
178+
className="form-control"
179+
type="text"
180+
name={key}
181+
value={BeatSaber.Settings[key]}
182+
onChange={this.handleInputChange.bind(
183+
this,
184+
key
185+
)}
186+
/>
187+
</div>
188+
))}
189+
190+
<GlueSectionDivider description="Debugging" />
191+
{Object.entries(toggles).flatMap(([key, value]) => [
123192
<GlueToggle
124193
onChange={this.handleSettingChange.bind(
125194
this,
@@ -131,6 +200,8 @@ export class PopupPage extends Spicetify.React.Component<
131200
<br />,
132201
])}
133202

203+
<GlueSectionDivider title="Queue" />
204+
134205
{requests.length == 0 && (
135206
<div className="ConnectPopup__info">
136207
<p>The queue is currenty empty.</p>

types/spicetify-react-component.d.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ declare class Button extends Spicetify.ReactComponent.Button {}
44
declare class Card extends Spicetify.ReactComponent.Card {}
55
declare class CardWithoutLink extends Spicetify.ReactComponent.CardWithoutLink {}
66
declare class CircularLoader extends Spicetify.ReactComponent.CircularLoader {}
7+
declare class GlueSectionDivider extends Spicetify.ReactComponent.GlueSectionDivider {}
78
declare class GlueToggle extends Spicetify.ReactComponent.GlueToggle {}
89
declare class HeaderBackgroundImage extends Spicetify.ReactComponent.HeaderBackgroundImage {}
910
declare class HeaderData extends Spicetify.ReactComponent.HeaderData {}
@@ -85,6 +86,13 @@ declare namespace Spicetify {
8586
}
8687
class CircularLoader extends React.PureComponent<CircularLoaderProps> {}
8788

89+
type GlueSectionDividerProps = {
90+
children?: React.ReactNode[]
91+
description?: string
92+
title?: React.ReactNode
93+
}
94+
class GlueSectionDivider extends React.PureComponent<GlueSectionDividerProps> {}
95+
8896
type GlueToggleProps = {
8997
isActive?: boolean
9098
isDisabled?: boolean

0 commit comments

Comments
 (0)