|
1 | | -import React, { createContext, useContext, useEffect, useState } from 'react'; |
2 | | -import { getFile, putFile } from './github'; |
3 | | -import { parseFrontmatter, stringifyFrontmatter } from './utils'; |
4 | | - |
5 | | -export interface AdminSettings { |
6 | | - maintenanceMode: boolean; |
7 | | - allowSignups: boolean; |
8 | | - adminNotice: string; |
9 | | - showDaysSinceFirstPost: boolean; |
10 | | -} |
11 | | - |
12 | | -export const adminSettingsFile = 'admin-settings.md'; |
13 | | - |
14 | | -export const defaultAdminSettings: AdminSettings = { |
15 | | - maintenanceMode: false, |
16 | | - allowSignups: true, |
17 | | - adminNotice: 'Добро пожаловать в админ-панель.', |
18 | | - showDaysSinceFirstPost: false |
19 | | -}; |
20 | | - |
21 | | -export async function loadAdminSettings(): Promise<AdminSettings> { |
22 | | - const file = await getFile(adminSettingsFile); |
23 | | - if (!file) { |
24 | | - return defaultAdminSettings; |
25 | | - } |
26 | | - |
27 | | - const { data } = parseFrontmatter<AdminSettings>(file.content); |
28 | | - return { ...defaultAdminSettings, ...data }; |
29 | | -} |
30 | | - |
31 | | -export async function saveAdminSettings(settings: AdminSettings): Promise<void> { |
32 | | - const content = stringifyFrontmatter(settings, ''); |
33 | | - await putFile(adminSettingsFile, content, 'Update admin settings'); |
34 | | -} |
35 | | - |
36 | | -interface AdminSettingsContextType { |
37 | | - settings: AdminSettings; |
38 | | - setSettings: React.Dispatch<React.SetStateAction<AdminSettings>>; |
39 | | - saveSettings: (settings: AdminSettings) => Promise<void>; |
40 | | - isLoading: boolean; |
41 | | -} |
42 | | - |
43 | | -const AdminSettingsContext = createContext<AdminSettingsContextType | null>(null); |
44 | | - |
45 | | -export function AdminSettingsProvider({ children }: { children: React.ReactNode }) { |
46 | | - const [settings, setSettings] = useState<AdminSettings>(defaultAdminSettings); |
47 | | - const [isLoading, setIsLoading] = useState(true); |
48 | | - |
49 | | - useEffect(() => { |
50 | | - loadAdminSettings() |
51 | | - .then((loadedSettings) => { |
52 | | - setSettings(loadedSettings); |
53 | | - }) |
54 | | - .catch((error) => { |
55 | | - console.error('Failed to load admin settings:', error); |
56 | | - }) |
57 | | - .finally(() => { |
58 | | - setIsLoading(false); |
59 | | - }); |
60 | | - }, []); |
61 | | - |
62 | | - const saveSettings = async (updatedSettings: AdminSettings) => { |
63 | | - await saveAdminSettings(updatedSettings); |
64 | | - setSettings(updatedSettings); |
65 | | - }; |
66 | | - |
67 | | - return ( |
68 | | - <AdminSettingsContext.Provider |
69 | | - value={{ settings, setSettings, saveSettings, isLoading }}> |
70 | | - {children} |
71 | | - </AdminSettingsContext.Provider> |
72 | | - ); |
73 | | -} |
74 | | - |
75 | | -export function useAdminSettings() { |
76 | | - const context = useContext(AdminSettingsContext); |
77 | | - if (!context) { |
78 | | - throw new Error('useAdminSettings must be used within AdminSettingsProvider'); |
79 | | - } |
80 | | - return context; |
81 | | -} |
| 1 | +export { AdminSettingsProvider, loadAdminSettings, saveAdminSettings, useAdminSettings, defaultAdminSettings, adminSettingsFile } from './admin.tsx'; |
| 2 | +export type { AdminSettings } from './admin.tsx'; |
0 commit comments