Skip to content

Commit 4fe4f76

Browse files
committed
Fully implemented sharing
1 parent c03f7cb commit 4fe4f76

File tree

5 files changed

+90
-11
lines changed

5 files changed

+90
-11
lines changed

src/lib/comp/CopyField.svelte

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
.copy-field {
1313
display: flex;
1414
padding: 5px;
15+
width: 100%;
1516
max-width: 95vw;
1617
border: 1px solid var(--panel-outline);
1718
background-color: var(--panel-dark);

src/lib/layout/StatsView.svelte

Lines changed: 49 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,30 @@
99
import type { ProcessedStats } from "$lib/stats";
1010
import { STATS_INTROS, STATS_OUTROS } from "$lib/strings";
1111
import { randChoice } from "$lib/util/array";
12-
import { removeUrlParams } from "$lib/util/string";
12+
import { capitalize, removeUrlParams } from "$lib/util/string";
1313
1414
export let stats: ProcessedStats;
1515
export let api: SongAPI;
16+
export let receivedShareName: string | null = null;
1617
1718
export let onClose: () => any = () => console.warn("onClose not set")
1819
1920
const introText = randChoice(STATS_INTROS);
2021
const outroText = randChoice(STATS_OUTROS);
21-
const shareURL = removeUrlParams(window.location.href) + "?s=" + stats.toBase64();
22+
const defaultName = "someone";
2223
24+
let shareName: string | undefined;
25+
let pronoun1 = "you";
26+
let pronoun2 = "your";
27+
2328
let currentPage = 0;
2429
const pageCount = 5;
2530
31+
if(receivedShareName) {
32+
pronoun1 = "they";
33+
pronoun2 = "their";
34+
}
35+
2636
function prev() {
2737
if(currentPage > 0) {
2838
currentPage -= 1;
@@ -67,11 +77,17 @@
6777
<div id="stats-view-main">
6878
<div id="stats-view-content">
6979
{#snippet pageIntro()}
70-
<h1>{introText}</h1>
80+
<h1>
81+
{#if receivedShareName}
82+
{receivedShareName} wants to show you their music taste!
83+
{:else}
84+
{introText}
85+
{/if}
86+
</h1>
7187
{/snippet}
7288

7389
{#snippet numStats()}
74-
<h1>You listened to</h1>
90+
<h1>{capitalize(pronoun1)} listened to</h1>
7591

7692
<div class="flex">
7793
<Counter
@@ -87,21 +103,45 @@
87103
{/snippet}
88104

89105
{#snippet pageFavSongsAllTime()}
90-
<h1>These are your favorite songs</h1>
106+
<h1>These are {pronoun2} favorite songs</h1>
91107
<SongList songs={stats.getTopSongs()} api={api} />
92108
{/snippet}
93109

94110
{#snippet pageFavArtistsAllTime()}
95-
<h1>And these are your favorite artists</h1>
111+
<h1>And these are {pronoun2} favorite artists</h1>
96112
<ArtistList artists={stats.getTopArtists()} />
97113
{/snippet}
98114

99115
{#snippet pageEnd()}
100116
<h1>{outroText}</h1>
101-
117+
102118
<div style="text-align: center; margin: 0 auto; max-width: 500px">
103-
<p>Share your stats!</p>
104-
<CopyField value={shareURL} />
119+
{#if !receivedShareName}
120+
<h2>Share your stats!</h2>
121+
<label for="name-inp">Your name: (optional)</label>
122+
123+
<input
124+
type="text"
125+
maxlength="28"
126+
bind:value={shareName}
127+
placeholder={defaultName}
128+
id="name-inp"
129+
/>
130+
131+
<CopyField value={
132+
(() => {
133+
let nameParam = "";
134+
const statsParam = `s=${stats.toBase64()}`;
135+
136+
if(shareName && shareName.length != 0 && shareName != defaultName) {
137+
nameParam = `name=${shareName}&`;
138+
}
139+
140+
return `${removeUrlParams(window.location.href)}?${nameParam}${statsParam}`
141+
})()
142+
} />
143+
{/if}
144+
105145
<LinkButton text="Home page" onClick={onClose} highlight />
106146
</div>
107147
{/snippet}

src/lib/styles/global.svelte

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,25 @@
3232
height: 95%;
3333
}
3434
35+
input[type="text"] {
36+
display: block;
37+
color: white;
38+
padding: 5px;
39+
margin: 10px auto;
40+
width: 100%;
41+
max-width: 95vw;
42+
border: 2px solid var(--panel-outline);
43+
background-color: var(--panel-dark);
44+
border-radius: 5px;
45+
transition: 0.2s;
46+
}
47+
48+
input[type="text"]:focus {
49+
outline: none;
50+
51+
background-color: var(--panel);
52+
}
53+
3554
button {
3655
background: var(--panel);
3756
min-width: 100px;

src/lib/util/string.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,13 @@
1+
export function capitalize(text: string): string {
2+
if(text.length == 0) {
3+
return text;
4+
}
5+
6+
const split = text.split("");
7+
split[0] = split[0].toUpperCase();
8+
9+
return split.join("");
10+
}
111

212
export function removeUrlParams(url: string): string {
313
const split = url.split("?");

src/routes/+page.svelte

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
let statsProcessed = false;
1818
let progress = 0;
1919
let progressMax = 0;
20+
let shareName: string | null = null;
2021
2122
async function setStats(stats: ProcessedStats | null) {
2223
statsProcessed = false;
@@ -86,12 +87,19 @@
8687
const params = new URLSearchParams(window.location.search);
8788
const base64 = params.get("s");
8889
const offline = params.get("offline");
89-
90+
const paramShareName = params.get("name");
91+
9092
if(offline) {
9193
offlineFlag = true;
9294
}
9395
9496
if(base64) {
97+
if(paramShareName) {
98+
shareName = paramShareName;
99+
} else {
100+
shareName = "Someone";
101+
}
102+
95103
setTimeout(() => {
96104
setStats(ProcessedStats.fromBase64(base64));
97105
});
@@ -133,7 +141,8 @@
133141
<StatsView
134142
stats={currentStats}
135143
api={api}
136-
onClose={reset}
144+
onClose={reset}
145+
receivedShareName={shareName}
137146
/>
138147
{:else if currentStats && !statsProcessed}
139148
<div id="loading">

0 commit comments

Comments
 (0)