Expose browsing daily target range
This commit is contained in:
1 parent
e890f74478
commit
a71ad56f3c
4 files changed
+83
-2
No files matched your search
@@ -178,12 +178,27 @@ function BrowsingSimulationSection({ account }: { account: GrowthAccountDetail }
|
||||
const runNow = useRunBrowsingSimulationMutation(account.accountId);
|
||||
const { settings, stats, todayTarget, recentDecisions } = account.browsing;
|
||||
const selected = recentDecisions.filter((decision) => decision.decision === 'simulated-upvote');
|
||||
const [dailyMinimum, setDailyMinimum] = useState(String(settings.dailyTargetMin));
|
||||
const [dailyMaximum, setDailyMaximum] = useState(String(settings.dailyTargetMax));
|
||||
const [gapMinutes, setGapMinutes] = useState(String(settings.minimumGapMs / 60_000));
|
||||
const [selectionsPerSession, setSelectionsPerSession] = useState(String(settings.selectionsPerSession));
|
||||
|
||||
useEffect(() => setDailyMinimum(String(settings.dailyTargetMin)), [settings.dailyTargetMin]);
|
||||
useEffect(() => setDailyMaximum(String(settings.dailyTargetMax)), [settings.dailyTargetMax]);
|
||||
useEffect(() => setGapMinutes(String(settings.minimumGapMs / 60_000)), [settings.minimumGapMs]);
|
||||
useEffect(() => setSelectionsPerSession(String(settings.selectionsPerSession)), [settings.selectionsPerSession]);
|
||||
|
||||
const parsedDailyMinimum = Number.parseInt(dailyMinimum, 10);
|
||||
const parsedDailyMaximum = Number.parseInt(dailyMaximum, 10);
|
||||
const dailyRangeValid = Number.isInteger(parsedDailyMinimum)
|
||||
&& Number.isInteger(parsedDailyMaximum)
|
||||
&& parsedDailyMinimum >= 1
|
||||
&& parsedDailyMaximum <= 12
|
||||
&& parsedDailyMinimum <= parsedDailyMaximum;
|
||||
const dailyRangeError = dailyMinimum !== '' && dailyMaximum !== '' && !dailyRangeValid
|
||||
? 'Use a range from 1 to 12, with the minimum no greater than the maximum.'
|
||||
: undefined;
|
||||
|
||||
return (
|
||||
<section aria-labelledby="browsing-simulation-heading" className="panel settings-card">
|
||||
<div className="settings-card-heading">
|
||||
@@ -212,6 +227,40 @@ function BrowsingSimulationSection({ account }: { account: GrowthAccountDetail }
|
||||
label="Submit selected upvotes"
|
||||
onChange={(autoVoteEnabled) => update.mutate({ autoVoteEnabled })}
|
||||
/>
|
||||
<div className="growth-pacing">
|
||||
<NumberField
|
||||
error={dailyRangeError}
|
||||
hint="The system chooses one stable target inside this range for each account and local day."
|
||||
label="Daily minimum"
|
||||
min={1}
|
||||
max={12}
|
||||
name="browsing-daily-minimum"
|
||||
onChange={setDailyMinimum}
|
||||
suffix="/day"
|
||||
value={dailyMinimum}
|
||||
/>
|
||||
<NumberField
|
||||
error={dailyRangeError}
|
||||
label="Daily maximum"
|
||||
min={1}
|
||||
max={12}
|
||||
name="browsing-daily-maximum"
|
||||
onChange={setDailyMaximum}
|
||||
suffix="/day"
|
||||
value={dailyMaximum}
|
||||
/>
|
||||
<button
|
||||
className="button secondary"
|
||||
disabled={update.isPending || !dailyRangeValid}
|
||||
onClick={() => update.mutate({
|
||||
dailyTargetMin: parsedDailyMinimum,
|
||||
dailyTargetMax: parsedDailyMaximum,
|
||||
})}
|
||||
type="button"
|
||||
>
|
||||
Save daily range
|
||||
</button>
|
||||
</div>
|
||||
<div className="growth-pacing">
|
||||
<NumberField
|
||||
hint={`Shortest gap between sessions. The system adds a random 0–${minutes(settings.jitterMs)} on top.`}
|
||||
|
||||
Reference in new issue
Block a user