Skip to content

Commit 3c1609f

Browse files
chore: ui tweaks, improve event filtering
Signed-off-by: Henry Gressmann <[email protected]>
1 parent fc4df94 commit 3c1609f

File tree

8 files changed

+92
-20
lines changed

8 files changed

+92
-20
lines changed

data/countries.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ Myanmar=MM
154154
Namibia=NA
155155
Nauru=NR
156156
Nepal=NP
157-
Netherlands, Kingdom of the=NL
157+
Netherlands=NL
158158
New Caledonia=NC
159159
New Zealand=NZ
160160
Nicaragua=NI
@@ -181,7 +181,7 @@ Puerto Rico=PR
181181
Qatar=QA
182182
Réunion=RE
183183
Romania=RO
184-
Russian Federation=RU
184+
Russia=RU
185185
Rwanda=RW
186186
Saint Barthélemy=BL
187187
Saint Helena=SH

src/utils/referrer.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,13 @@ pub fn process_referer(referer: Option<&str>) -> Referrer {
5151
match referer.map(poem::http::Uri::from_str) {
5252
// valid referer are stripped to the FQDN
5353
Some(Ok(referer_uri)) => {
54+
// ignore localhost / IP addresses
55+
if referer_uri.host().map_or(false, |host| {
56+
host == "localhost" || host.ends_with(".localhost") || host.parse::<std::net::IpAddr>().is_ok()
57+
}) {
58+
return Referrer::Unknown(None);
59+
}
60+
5461
let referer_fqn = referer_uri.host().unwrap_or_default();
5562
if is_spammer(referer_fqn) {
5663
return Referrer::Spammer;
@@ -83,6 +90,12 @@ mod test {
8390
"Should return an error for a referer identified as a spammer"
8491
);
8592

93+
assert_eq!(process_referer(Some("google.com")), Referrer::Fqdn("google.com".to_string()));
94+
assert_eq!(process_referer(Some("127.0.0.1")), Referrer::Unknown(None));
95+
assert_eq!(process_referer(Some("1.1.1.1")), Referrer::Unknown(None));
96+
assert_eq!(process_referer(Some("localhost")), Referrer::Unknown(None));
97+
assert_eq!(process_referer(Some("asdf.localhost")), Referrer::Unknown(None));
98+
8699
assert_eq!(
87100
process_referer(Some("invalid referrer")),
88101
Referrer::Unknown(Some("invalid referrer".to_string())),

src/utils/useragent.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ pub fn parse(header: &str) -> Client {
1616
}
1717

1818
pub fn is_bot(client: &Client) -> bool {
19-
client.device.family == "Spider"
19+
client.device.family == "Spider" || client.user_agent.family == "HeadlessChrome"
2020
}
2121

2222
static MOBILE_OS: [&str; 2] = ["iOS", "Android"]; // good enough for 99% of cases

src/web/routes/event.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,9 @@ impl EventApi {
4949
Referrer::Unknown(r) => r,
5050
Referrer::Spammer => return EmptyResponse::ok(),
5151
};
52-
let referrer = referrer.filter(|r| !r.is_empty());
52+
53+
let referrer = referrer.map(|r| r.trim_start_matches("www.").to_string()); // remove www. prefix
54+
let referrer = referrer.filter(|r| r.trim().len() > 3); // ignore empty or short referrers
5355

5456
if !EXISTING_ENTITIES.with(|cache| cache.borrow_mut().cache_get(&event.entity_id).is_some()) {
5557
if !app.entities.exists(&event.entity_id).http_status(StatusCode::INTERNAL_SERVER_ERROR)? {

web/src/components/project.module.css

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
align-items: center;
1111
gap: 1rem;
1212
width: 100%;
13-
padding-bottom: .5rem;
13+
padding-bottom: 0.5rem;
1414

1515
a {
1616
cursor: pointer;
@@ -24,8 +24,13 @@
2424
}
2525

2626
div.graph {
27-
height: 18rem;
28-
margin-bottom: 1rem;
27+
height: 20rem;
28+
29+
border-radius: var(--pico-border-radius);
30+
box-shadow: var(--pico-card-box-shadow);
31+
background-color: var(--card-background);
32+
padding: 2rem 0 1rem 0;
33+
margin: 0 -0.4rem;
2934
}
3035

3136
.tables {
@@ -60,7 +65,7 @@ div.graph {
6065
content: "";
6166
position: absolute;
6267
--direction: right;
63-
background: linear-gradient(
68+
background: linear-gradient(
6469
to var(--direction),
6570
hsla(var(--card-background-base) / 0) 0%,
6671
hsla(var(--card-background-base) / 0.018) 9.5%,
@@ -79,7 +84,7 @@ div.graph {
7984
hsla(var(--card-background-base) / 0.988) 92%,
8085
hsl(var(--card-background-base)) 100%
8186
);
82-
87+
8388
right: 0;
8489
top: 0;
8590
bottom: 0;

web/src/components/projects.module.css

Lines changed: 51 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,25 @@
4646
}
4747
}
4848

49+
.projectCard {
50+
border-radius: var(--pico-border-radius);
51+
box-shadow: var(--pico-card-box-shadow);
52+
background-color: var(--card-background);
53+
padding: 1rem;
54+
margin: 0 -0.4rem;
55+
margin-bottom: 1rem;
56+
57+
> div {
58+
--card-background: var(--pico-form-element-border-color);
59+
}
60+
61+
.projectsGraph {
62+
padding: 0;
63+
margin: 0;
64+
margin: 0 -1rem;
65+
}
66+
}
67+
4968
details.selectRange {
5069
width: 10rem;
5170

@@ -116,6 +135,9 @@ details.selectRange {
116135
.stats {
117136
align-items: center;
118137
> div {
138+
position: relative;
139+
z-index: 1;
140+
119141
display: flex;
120142
gap: 0.7rem;
121143
@media (max-width: 768px) {
@@ -157,11 +179,7 @@ details.selectRange {
157179
}
158180

159181
.graph {
160-
height: 12rem;
161-
margin-top: -0.5rem;
162-
margin-left: -1.9rem;
163-
margin-right: -2rem;
164-
margin-bottom: 3rem;
182+
height: 14rem;
165183
}
166184

167185
button.stat {
@@ -170,15 +188,34 @@ button.stat {
170188
margin: 0;
171189
font-size: 0.8rem;
172190
min-width: 7.5rem;
173-
padding: 0.4rem 0.6rem 0.3rem 0.6rem;
191+
padding: 0.5rem 0.6rem 0.3rem 0.6rem;
174192
margin-left: -0.5rem;
175193
transition: background-color 0.2s ease;
176194
border-radius: var(--pico-border-radius);
177195
user-select: none;
196+
position: relative;
178197

179-
&[data-active="true"] {
198+
&::before {
199+
content: "";
200+
position: absolute;
201+
z-index: -1;
202+
top: 0;
203+
left: 0;
204+
right: 0;
205+
bottom: 0;
206+
border-radius: var(--pico-border-radius);
180207
background-color: var(--card-background);
181-
box-shadow: var(--pico-card-box-shadow);
208+
opacity: 0;
209+
transform: scale(0.95);
210+
transition: opacity 0.2s ease, transform 0.2s ease;
211+
}
212+
213+
&[data-active="true"] {
214+
&::before {
215+
box-shadow: var(--pico-card-box-shadow);
216+
opacity: 1;
217+
transform: scale(1);
218+
}
182219

183220
h2,
184221
h2,
@@ -187,6 +224,12 @@ button.stat {
187224
}
188225
}
189226

227+
&:hover:not([data-active="true"]) {
228+
&::before {
229+
opacity: 0.5;
230+
}
231+
}
232+
190233
h3 {
191234
margin: 0;
192235
font-size: 1.2rem;

web/src/components/projects.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,8 @@ export const Projects = () => {
9595
metric={metric}
9696
setMetric={setMetric}
9797
rangeName={dateRange}
98+
className={styles.projectCard}
99+
graphClassName={styles.projectsGraph}
98100
detailsElement={() => (
99101
<a href={`/p/${project.id}`} aria-label="View project details">
100102
<ChevronRightIcon size={25} strokeWidth={4} color="var(--pico-h1-color)" />
@@ -139,6 +141,7 @@ export const ProjectOverview = ({
139141
setMetric,
140142
rangeName,
141143
detailsElement,
144+
className,
142145
graphClassName = "",
143146
renderHeader = defaultHeader,
144147
}: {
@@ -147,6 +150,7 @@ export const ProjectOverview = ({
147150
setMetric: (value: Metric) => void;
148151
rangeName: RangeName;
149152
detailsElement?: () => JSX.Element;
153+
className?: string;
150154
graphClassName?: string;
151155
renderHeader?: (props: { stats?: StatsResponse; project: ProjectResponse; className?: string }) => JSX.Element;
152156
}) => {
@@ -191,7 +195,10 @@ export const ProjectOverview = ({
191195
const chartData = graph?.data ? toDataPoints(graph.data, range, metric) : [];
192196

193197
return (
194-
<div className={styles.project} data-loading={isLoadingStats || isLoadingGraph || isErrorStats || isErrorGraph}>
198+
<div
199+
className={cls(styles.project, className)}
200+
data-loading={isLoadingStats || isLoadingGraph || isErrorStats || isErrorGraph}
201+
>
195202
{(isErrorStats || isErrorGraph) && <h1 className={styles.error}>Failed to load data</h1>}
196203
<div className={styles.statsContainer}>
197204
<div className={styles.stats}>

web/src/global.css

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,19 @@
66
--pico-background-color: #f7f8ff;
77
--card-background-base: 0deg 0% 100%;
88
--card-background: hsl(var(--card-background-base));
9+
--pico-card-box-shadow: 0px 0px 24px #15233610;
910
}
1011

1112
:root[data-theme="dark"] {
1213
--pico-background-color: #0a0c10;
13-
--card-background-base: 200deg 18.37% 9.6%;
14+
--card-background-base: 218.8 23.9% 13.9%;
15+
/* --pico-card-box-shadow: 0 0 0.5rem 0.1rem hsla(0, 0%, 0%, 0.1); */
1416
}
1517

1618
@media only screen and (prefers-color-scheme: dark) {
1719
:root:not([data-theme="light"]) {
1820
--pico-background-color: #0a0c10;
19-
--card-background-base: 200deg 18.37% 9.6%;
21+
--card-background-base: 218.8 23.9% 13.9%;
2022
}
2123
}
2224

0 commit comments

Comments
 (0)