Skip to content

Commit cc1f630

Browse files
committed
Set current aggregator in url in explorer
And save it to the local storage if it's not known.
1 parent cc69af1 commit cc1f630

File tree

3 files changed

+49
-18
lines changed

3 files changed

+49
-18
lines changed

mithril-explorer/components/AggregatorSetter/AddAggregatorModal.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ export default function AddAggregatorModal(props) {
88
function handleClose() {
99
props.onAskClose();
1010
setIsInvalid(false);
11+
setValue("");
1112
}
1213

1314
function handleSave(event) {

mithril-explorer/components/AggregatorSetter/index.js

Lines changed: 34 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import React, {useEffect, useState} from 'react';
2-
import {Button, Col, Form, InputGroup, OverlayTrigger, Tooltip} from "react-bootstrap";
1+
import React, { useEffect, useState } from 'react';
2+
import { Button, Col, Form, InputGroup, OverlayTrigger, Tooltip } from "react-bootstrap";
33
import AddAggregatorModal from "./AddAggregatorModal";
44

55
export default function AggregatorSetter(props) {
@@ -9,27 +9,38 @@ export default function AggregatorSetter(props) {
99
const [canRemoveSelected, setCanRemoveSelected] = useState(false);
1010

1111
useEffect(() => {
12-
let aggregators = props.defaultAvailableAggregators;
13-
14-
const storedAggregators = JSON.parse(localStorage.getItem(CUSTOM_AGGREGATORS_KEY));
15-
if (storedAggregators) {
16-
aggregators = aggregators.concat(storedAggregators);
17-
}
18-
19-
setAvailableAggregators(aggregators);
12+
setAvailableAggregators(getAggregatorsList());
2013
}, [props.defaultAvailableAggregators]);
2114

2215
useEffect(() => {
2316
setCanRemoveSelected(!props.defaultAvailableAggregators.includes(props.aggregator));
17+
18+
let aggregators = getAggregatorsList();
19+
if (!aggregators.includes(props.aggregator)) {
20+
aggregators.push(props.aggregator);
21+
saveCustomAggregatorSources(aggregators);
22+
setAvailableAggregators(aggregators);
23+
}
2424
}, [props.aggregator]);
2525

26+
function getAggregatorsList() {
27+
let aggregators = [...props.defaultAvailableAggregators];
28+
29+
const storedAggregators = JSON.parse(localStorage.getItem(CUSTOM_AGGREGATORS_KEY));
30+
if (storedAggregators) {
31+
aggregators = aggregators.concat(storedAggregators);
32+
}
33+
34+
return aggregators;
35+
}
36+
2637
function handleChange(aggregator) {
2738
props.onAggregatorChange(aggregator);
2839
}
2940

3041
function copySelected() {
3142
if (window.isSecureContext && props.aggregator) {
32-
navigator.clipboard.writeText(props.aggregator).then(() => {});
43+
navigator.clipboard.writeText(props.aggregator).then(() => { });
3344
}
3445
}
3546

@@ -62,10 +73,9 @@ export default function AggregatorSetter(props) {
6273
handleChange(availableAggregators.at(0));
6374
saveCustomAggregatorSources(aggregators);
6475
}
65-
76+
6677
function saveCustomAggregatorSources(aggregators) {
6778
const customAggregators = aggregators.filter(a => !props.defaultAvailableAggregators.includes(a));
68-
console.log("save", customAggregators, aggregators, props.defaultAvailableAggregators);
6979
localStorage.setItem(CUSTOM_AGGREGATORS_KEY, JSON.stringify(customAggregators));
7080
}
7181

@@ -74,7 +84,7 @@ export default function AggregatorSetter(props) {
7484
<AddAggregatorModal
7585
show={showAddModal}
7686
onAdd={addAggregatorSource}
77-
onAskClose={hideAddAggregatorSourceModal}/>
87+
onAskClose={hideAddAggregatorSourceModal} />
7888

7989
<Form.Group as={Col} className={props.className}>
8090
<Form.Label>Aggregator:</Form.Label>
@@ -83,9 +93,16 @@ export default function AggregatorSetter(props) {
8393
<i className="bi bi-plus-circle"></i>
8494
</Button>
8595
{canRemoveSelected &&
86-
<Button variant="outline-danger" onClick={deleteSelectedAggregatorSource}>
87-
<i className="bi bi-dash-circle"></i>
88-
</Button>
96+
<>
97+
<Button variant="outline-danger" onClick={deleteSelectedAggregatorSource}>
98+
<i className="bi bi-dash-circle"></i>
99+
</Button>
100+
<OverlayTrigger overlay={<Tooltip>Unofficial Aggregator</Tooltip>}>
101+
<Button variant="outline-warning" onClick={copySelected}>
102+
<i className="bi bi-exclamation-triangle"></i>
103+
</Button>
104+
</OverlayTrigger>
105+
</>
89106
}
90107
<Form.Select value={props.aggregator} onChange={e => handleChange(e.target.value)}>
91108
{availableAggregators.map((aggregator, index) =>

mithril-explorer/pages/index.js

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useState } from 'react';
1+
import React, {useEffect, useState} from 'react';
22
import PendingCertificate from '../components/PendingCertificate';
33
import SnapshotsList from '../components/SnapshotsList';
44
import Head from "next/head";
@@ -7,6 +7,7 @@ import { Form, Stack, Button, Row, Col, InputGroup } from "react-bootstrap";
77
import styles from "../styles/Home.module.css";
88
import AggregatorSetter from "../components/AggregatorSetter";
99
import available_aggregators from "../aggregators-list";
10+
import {useRouter} from "next/router";
1011

1112
function IntervalSetter(props) {
1213
function handleChange(event) {
@@ -35,12 +36,24 @@ function IntervalSetter(props) {
3536
}
3637

3738
export default function Explorer() {
39+
const router = useRouter();
3840
const [aggregator, setAggregator] = useState(available_aggregators[0]);
3941
const [interval, setInterval] = useState(10000);
4042
const [autoUpdate, setAutoUpdate] = useState(true);
43+
44+
useEffect(() => {
45+
if (router.query?.aggregator && router.query?.aggregator !== aggregator) {
46+
const autoUpdateState = autoUpdate;
47+
48+
setAutoUpdate(false);
49+
setAggregator(router.query.aggregator);
50+
setAutoUpdate(autoUpdateState);
51+
}
52+
}, [router.query]);
4153

4254
function handleApiChange(api) {
4355
setAggregator(api);
56+
router.push({query: {aggregator: api}}).then(() => {});
4457
}
4558

4659
function handleStartStopButtonPress(isPressed) {

0 commit comments

Comments
 (0)