Skip to content

Commit 343f26c

Browse files
committed
fix: token
1 parent e7a0836 commit 343f26c

4 files changed

Lines changed: 80 additions & 20 deletions

File tree

public/sw.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,13 @@ async function handleGitHubWriteRequest(request) {
9090
try {
9191
const token = await getStoredToken();
9292
if (!token) {
93-
throw new Error('No authentication token');
93+
return new Response(JSON.stringify({
94+
error: true,
95+
message: 'Authentication required. Please set VITE_API_KEY.'
96+
}), {
97+
status: 401,
98+
headers: { 'Content-Type': 'application/json' }
99+
});
94100
}
95101

96102
// Clone the request to add authorization headers

src/lib/auth.ts

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,11 @@ export function AuthProvider({ children }: {children: React.ReactNode;}) {
6363
lang: 'en',
6464
theme: 'light'
6565
};
66-
const content = stringifyFrontmatter(userData, '');
67-
await putFile(path, content, `Create user ${username}`);
66+
// Only create file if token is available
67+
if (config.github.token) {
68+
const content = stringifyFrontmatter(userData, '');
69+
await putFile(path, content, `Create user ${username}`);
70+
}
6871
}
6972

7073
// Create default settings file if it doesn't exist
@@ -76,12 +79,25 @@ export function AuthProvider({ children }: {children: React.ReactNode;}) {
7679
accentColor: DEFAULT_ACCENT_COLOR,
7780
updatedAt: new Date().toISOString()
7881
};
79-
const settingsContent = stringifyFrontmatter(defaultSettings, '');
80-
await putFile(settingsPath, settingsContent, `Create settings for ${username}`);
82+
// Only create if token is available
83+
if (config.github.token) {
84+
const settingsContent = stringifyFrontmatter(defaultSettings, '');
85+
await putFile(settingsPath, settingsContent, `Create settings for ${username}`);
86+
}
8187
}
8288

8389
setUser(userData);
8490
localStorage.setItem('user', JSON.stringify(userData));
91+
92+
// Apply user settings
93+
localStorage.setItem('theme', userData.theme);
94+
localStorage.setItem('lang', userData.lang);
95+
// Apply theme class
96+
if (userData.theme === 'dark') {
97+
document.documentElement.classList.add('dark');
98+
} else {
99+
document.documentElement.classList.remove('dark');
100+
}
85101
} finally {
86102
setIsLoading(false);
87103
}

src/pages/AuthPage.tsx

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -65,22 +65,14 @@ export function AuthPage() {
6565
}
6666

6767
const normalizedUsername = username.trim().toLowerCase();
68-
if (settings.maintenanceMode && normalizedUsername !== 'admin') {
68+
if (settings.maintenanceMode) {
6969
setError(t('maintenanceMessage'));
7070
return;
7171
}
7272

7373
setIsSubmitting(true);
7474
setError('');
7575
try {
76-
const path = `users/${normalizedUsername}.md`;
77-
const userFile = await getFile(path);
78-
79-
if (!settings.allowSignups && !userFile && normalizedUsername !== 'admin') {
80-
setError(t('signupsDisabled'));
81-
return;
82-
}
83-
8476
await login(normalizedUsername);
8577
navigate('/');
8678
} catch (err: any) {

src/pages/ProfilePage.tsx

Lines changed: 52 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
import React, { useState, useRef } from 'react';
22
import { useNavigate } from 'react-router-dom';
33
import { ArrowLeft, Camera, Save, User as UserIcon, Calendar, Globe } from 'lucide-react';
4-
import { useAuth } from '../lib/auth';
4+
import { useTheme } from '../lib/theme';
55
import { useTranslation } from '../lib/i18n';
66
import { putFile, getFile } from '../lib/github';
77
import { stringifyFrontmatter, generateGravatarUrl, safeLogError } from '../lib/utils';
88
import { ColorPicker } from '../components/ColorPicker';
99

1010
export function ProfilePage() {
1111
const { user, logout } = useAuth();
12+
const { theme, setTheme } = useTheme();
1213
const { t } = useTranslation();
1314
const navigate = useNavigate();
1415
const fileInputRef = useRef<HTMLInputElement>(null);
@@ -281,17 +282,62 @@ export function ProfilePage() {
281282
<label className="block text-sm font-medium mb-2">
282283
{t('language')}
283284
</label>
284-
<div className="flex items-center gap-2">
285-
<Globe className="w-4 h-4 text-gray-400" />
286-
<span className="text-gray-600 dark:text-gray-400 capitalize">{user.lang}</span>
287-
</div>
285+
<select
286+
value={user?.lang || 'en'}
287+
onChange={async (e) => {
288+
const newLang = e.target.value;
289+
setIsSaving(true);
290+
try {
291+
const updatedUser = { ...user!, lang: newLang };
292+
const content = stringifyFrontmatter(updatedUser, '');
293+
const existingFile = await getFile(`users/${user!.username}.md`);
294+
await putFile(`users/${user!.username}.md`, content, `Update language for ${user!.username}`, false, existingFile?.sha);
295+
localStorage.setItem('user', JSON.stringify(updatedUser));
296+
localStorage.setItem('lang', newLang);
297+
window.location.reload(); // Reload to apply language
298+
} catch (error) {
299+
safeLogError('Error saving language:', error);
300+
alert('Failed to save language. Please try again.');
301+
} finally {
302+
setIsSaving(false);
303+
}
304+
}}
305+
className="px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md bg-white dark:bg-gray-700"
306+
>
307+
<option value="en">English</option>
308+
<option value="ru">Русский</option>
309+
</select>
288310
</div>
289311

290312
<div>
291313
<label className="block text-sm font-medium mb-2">
292314
{t('theme')}
293315
</label>
294-
<span className="text-gray-600 dark:text-gray-400 capitalize">{user.theme}</span>
316+
<select
317+
value={theme}
318+
onChange={(e) => {
319+
const newTheme = e.target.value as 'light' | 'dark';
320+
setTheme(newTheme);
321+
// Update user file
322+
const updateUserTheme = async () => {
323+
try {
324+
const updatedUser = { ...user!, theme: newTheme };
325+
const content = stringifyFrontmatter(updatedUser, '');
326+
const existingFile = await getFile(`users/${user!.username}.md`);
327+
await putFile(`users/${user!.username}.md`, content, `Update theme for ${user!.username}`, false, existingFile?.sha);
328+
localStorage.setItem('user', JSON.stringify(updatedUser));
329+
} catch (error) {
330+
safeLogError('Error saving theme:', error);
331+
alert('Failed to save theme. Please try again.');
332+
}
333+
};
334+
updateUserTheme();
335+
}}
336+
className="px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md bg-white dark:bg-gray-700"
337+
>
338+
<option value="light">Light</option>
339+
<option value="dark">Dark</option>
340+
</select>
295341
</div>
296342
</div>
297343

0 commit comments

Comments
 (0)