Skip to content

Commit 18b1dc0

Browse files
committed
feat: test auth
1 parent 73a81f4 commit 18b1dc0

18 files changed

+1761
-398
lines changed

docs/astro.config.mjs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import starlight from '@astrojs/starlight';
22
import { defineConfig } from 'astro/config';
33
import svelte from '@astrojs/svelte';
4+
import vercel from '@astrojs/vercel/serverless';
45

56
export const locales = {
67
root: {
@@ -66,7 +67,7 @@ export default defineConfig({
6667
// ru: 'Leaderboard'
6768
// }
6869
// },
69-
{
70+
{
7071
label: 'Challenges',
7172
autogenerate: {
7273
directory: 'challenges'
@@ -109,5 +110,7 @@ export default defineConfig({
109110
},
110111
defaultLocale: 'root',
111112
locales
112-
}), svelte()]
113+
}), svelte()],
114+
output: "hybrid",
115+
adapter: vercel()
113116
});

docs/package-lock.json

Lines changed: 1335 additions & 248 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

docs/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
"dependencies": {
1313
"@astrojs/starlight": "^0.15.1",
1414
"@astrojs/svelte": "^5.2.0",
15+
"@astrojs/vercel": "^7.5.0",
1516
"@fontsource/ibm-plex-serif": "^5.0.8",
1617
"astro": "^4.0.0",
1718
"sharp": "^0.32.5",

docs/src/components/ActionButtonFooter.astro

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { getEntry } from 'astro:content';
66
77
const { lang } = Astro.props;
88
const { data } = await getEntry('i18n', lang);
9+
910
---
1011

1112
<div class="action-footer">
@@ -37,7 +38,6 @@ const { data } = await getEntry('i18n', lang);
3738
text-decoration: none;
3839
font-size: var(--sl-text-sm) !important;
3940
border: 1px solid;
40-
font-size: var(--sl-text-base);
4141
padding: 0.4rem 0.8rem;
4242
}
4343

docs/src/components/GitHubStats.svelte

Lines changed: 0 additions & 67 deletions
This file was deleted.
Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,20 @@
11
---
22
import Default from '@astrojs/starlight/components/SiteTitle.astro';
3-
import GitHubStats from './GitHubStats.svelte';
43
import MyIcon from './MyIcon.astro';
54
import SignUp from './github/SignUp.svelte';
5+
import { Icon } from '@astrojs/starlight/components';
66
---
77

88
<Default {...Astro.props}>
99
<slot />
1010
</Default>
1111

12-
<SignUp client:load />
1312

14-
<!--<GitHubStats client:load >-->
15-
<!-- <MyIcon name="star" slot="star" />-->
16-
<!-- <MyIcon name="fork" viewBox="0 0 16 16" slot="fork"/>-->
17-
<!--</GitHubStats>-->
13+
<SignUp client:only="svelte" >
14+
<Icon name="github" slot="github" />
15+
<MyIcon name="fullStar" slot="fullStar" viewBox="0 0 16 16" fill="#e3b341"/>
16+
<MyIcon name="star" slot="star" viewBox="0 0 16 16"/>
17+
<MyIcon name="fork" viewBox="0 0 16 16" slot="fork"/>
18+
</SignUp>
1819

1920

docs/src/components/github/AnsweredUser.svelte

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,27 @@
11
<script>
2-
import { onMount } from 'svelte';
32
import { data, error, isLoaded, isLoading, token, totalCount } from './github-store';
43
54
export let challengeNumber;
65
76
let page = 1;
87
8+
token.subscribe(token => {
9+
if (token) {
10+
fetchTotalCount();
11+
}
12+
})
13+
914
async function fetchTotalCount() {
1015
isLoading.set(true);
1116
try {
1217
while (true) {
13-
const response = await fetch(`https://api.github.com/search/issues?q=repo:tomalaforge/angular-challenges+is:pr+label:"${challengeNumber}"+label:"answer"&per_page=100&page=${page}`);
18+
const response = await fetch(`https://api.github.com/search/issues?q=repo:tomalaforge/angular-challenges+is:pr+label:"${challengeNumber}"+label:"answer"&per_page=100&page=${page}`, {
19+
headers: {
20+
Authorization: `Bearer ${$token}`,
21+
},
22+
});
1423
if (!response.ok) {
15-
throw new Error('Network response was not ok');
24+
throw new Error('Failed to fetch data');
1625
}
1726
const { items: new_items, total_count } = await response.json();
1827
if (!new_items || new_items.length === 0) break;
@@ -30,13 +39,8 @@
3039
}
3140
}
3241
33-
onMount(() => {
34-
fetchTotalCount();
35-
});
36-
3742
</script>
3843

39-
token: {$token}
4044
{#if $isLoaded}
4145
<div class="solution-container" id="answers">
4246
<div>Answered by</div>
Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
<script>
2+
import { token } from './github-store';
3+
4+
let error = false;
5+
let loading = true;
6+
let loadingStar = true;
7+
let stargazersCount = 0;
8+
let forksCount = 0;
9+
let isStarByUser = false;
10+
11+
token.subscribe(token => {
12+
if (token) {
13+
fetchStats();
14+
isStar();
15+
}
16+
});
17+
18+
async function starRepo() {
19+
try {
20+
const response = await fetch(`https://api.github.com/user/starred/tomalaforge/angular-challenges`, {
21+
method: 'PUT',
22+
headers: {
23+
Authorization: `token ${$token}`
24+
}
25+
});
26+
if (response.ok) {
27+
isStarByUser = !isStarByUser;
28+
console.log('Starred', isStarByUser);
29+
}
30+
} catch (e) {
31+
console.error(e);
32+
}
33+
}
34+
35+
async function isStar() {
36+
try {
37+
const response = await fetch(`https://api.github.com/user/starred/tomalaforge/angular-challenges`, {
38+
method: 'GET',
39+
headers: {
40+
Authorization: `token ${$token}`
41+
}
42+
});
43+
if (response.ok && response.status === 204) {
44+
isStarByUser = true;
45+
}
46+
} catch (e) {
47+
console.error(e);
48+
} finally {
49+
loadingStar = false;
50+
}
51+
}
52+
53+
54+
async function fetchStats() {
55+
try {
56+
const response = await fetch(`https://api.github.com/repos/tomalaforge/angular-challenges`);
57+
if (!response.ok) {
58+
if (response.status === 401) {
59+
const refresh = await fetch('/auth/refresh');
60+
if (refresh.ok) {
61+
const data = await refresh.json();
62+
token.set(data.token);
63+
return;
64+
}
65+
} else {
66+
throw new Error('Failed to fetch data');
67+
}
68+
}
69+
const { stargazers_count, forks } = await response.json();
70+
stargazersCount = stargazers_count;
71+
forksCount = forks;
72+
73+
} catch (e) {
74+
error = true;
75+
} finally {
76+
loading = false;
77+
}
78+
}
79+
</script>
80+
81+
{#if !error && !loading && !loadingStar}
82+
<div class="github">
83+
{#if isStarByUser}
84+
<div class="category starred">
85+
<slot name="fullStar" />
86+
<span>{stargazersCount}</span>
87+
</div>
88+
{:else}
89+
<button class="button-star link" on:click={starRepo}>
90+
<slot name="star" />
91+
<span>{stargazersCount}</span>
92+
</button>
93+
{/if}
94+
95+
<a class="category link" href="https://github.com/tomalaforge/angular-challenges/fork" target="_blank">
96+
<slot name="fork" />
97+
<div>{forksCount}</div>
98+
</a>
99+
</div>
100+
{/if}
101+
102+
<style>
103+
104+
.github {
105+
display: flex;
106+
flex-direction: column;
107+
align-items: flex-start;
108+
margin-left: var(--sl-nav-gap);
109+
}
110+
111+
.button-star {
112+
display: flex !important;
113+
justify-content: center;
114+
gap: 0.5em;
115+
align-items: center;
116+
border-radius: 999rem;
117+
color: var(--sl-color-white) !important;
118+
background-color: transparent;
119+
line-height: 1.1875;
120+
text-decoration: none;
121+
font-size: var(--sl-text-xs);
122+
border: 1px solid;
123+
padding: 0.2rem 0.4rem;
124+
margin-left: -6px
125+
}
126+
127+
.category {
128+
display: flex;
129+
align-items: center;
130+
font-size: 12px;
131+
gap: 0.25rem;
132+
color: var(--sl-color-text);
133+
text-decoration: none;
134+
}
135+
136+
.link:hover {
137+
color: var(--sl-color-accent-high);
138+
}
139+
140+
.starred {
141+
color: #e3b341;
142+
}
143+
144+
</style>

0 commit comments

Comments
 (0)