|
|
@ -1,4 +1,8 @@ |
|
|
|
|
|
|
|
"use client"; |
|
|
|
|
|
|
|
|
|
|
|
import React, { useState, useEffect } from 'react'; |
|
|
|
import React, { useState, useEffect } from 'react'; |
|
|
|
|
|
|
|
// These styles apply to every route in the application
|
|
|
|
|
|
|
|
import '../app/globals.css' |
|
|
|
|
|
|
|
|
|
|
|
type LogData = { |
|
|
|
type LogData = { |
|
|
|
fileName: string; |
|
|
|
fileName: string; |
|
|
@ -8,8 +12,39 @@ type LogData = { |
|
|
|
const LogTable: React.FC = () => { |
|
|
|
const LogTable: React.FC = () => { |
|
|
|
const [logData, setLogData] = useState<LogData[]>([]); |
|
|
|
const [logData, setLogData] = useState<LogData[]>([]); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const translationDict = { |
|
|
|
|
|
|
|
'to_africa_for_gold.mp3': 'В Африку за золотом', |
|
|
|
|
|
|
|
'event_industry_in_action.mp3': 'Event - индустрия в действии. Как стоить империю в этой сфере и сколько можно заработать', |
|
|
|
|
|
|
|
'i_live_the_way_I_want_I_also_earn.mp3':'Живу как хочу, ещё и зарабатываю. Как стать ведущим', |
|
|
|
|
|
|
|
'Your-opportunities-today.mp3':'Твои возможности сегодня', |
|
|
|
|
|
|
|
'Taurida_What-can-you-learn-on-the-Black-Sea-coast.mp3':'Таврида. Чему можно научиться на берегу Черного моря', |
|
|
|
|
|
|
|
'Digital_communications_and_youth.mp3':'Цифровые коммуникации и молодежь', |
|
|
|
|
|
|
|
'Special-issue-How-%D1%81loser-the-grant.mp3':'Спецвыпуск «Как выиграть грант»', |
|
|
|
|
|
|
|
'Pass_exam_without_fear.mp3':'Как сдать экзамен без страха', |
|
|
|
|
|
|
|
'where-to-go-this-summer.mp3':'Дайджест: куда поехать этим летом?', |
|
|
|
|
|
|
|
'Fears_and_living_with_them.mp3':'Страхи и жизнь с ними', |
|
|
|
|
|
|
|
'Страхи и жизнь с ними':'Спецвыпуск подкаста в Дубраве', |
|
|
|
|
|
|
|
'what_to_watch.mp3':'Что посмотреть?', |
|
|
|
|
|
|
|
'FoodWhatHowAndWhereDoWeEat.mp3':'Еда. Что, как и где мы едим?', |
|
|
|
|
|
|
|
'WhatGearDoYouWearAndWhereToBuyIt.mp3':'Какой шмот ты носишь и где его покупать?', |
|
|
|
|
|
|
|
'Lets_go_Why_Argentina.mp3':'Почему Аргентина?', |
|
|
|
|
|
|
|
'Money_cards_and_black_dollar_exchange_rat.mp3':'Аргентина: деньги, карты и чёрный курс доллара', |
|
|
|
|
|
|
|
'Argentina-What-for-what.mp3':'Аргентина: Что почем?', |
|
|
|
|
|
|
|
'Make_money_on_a_childhood_dream_Aeromodelling_centers.mp3':'Заработать на мечте детства? Центры авиамоделирования', |
|
|
|
|
|
|
|
'is_it_possible_to_make_money_on_tricks.mp3':'Можно ли заработать на фокусах?', |
|
|
|
|
|
|
|
'Like_to_listen_in_Dubrava.mp3':'Спецвыпуск подкаста в Дубраве', |
|
|
|
|
|
|
|
// Добавьте другие пары английское/русское название при необходимости
|
|
|
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const englishFileNameToFind = 'event_industry_in_action.mp3'; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const russianTranslation = translationDict[englishFileNameToFind]; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
console.log(russianTranslation); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
useEffect(() => { |
|
|
|
useEffect(() => { |
|
|
|
fetch('/api/log') // Обращаемся к REST API
|
|
|
|
fetch('/api/log') |
|
|
|
.then((response) => response.json()) |
|
|
|
.then((response) => response.json()) |
|
|
|
.then((data: string[]) => { |
|
|
|
.then((data: string[]) => { |
|
|
|
const parsedData: LogData[] = data.map((item: string) => { |
|
|
|
const parsedData: LogData[] = data.map((item: string) => { |
|
|
@ -21,10 +56,15 @@ const LogTable: React.FC = () => { |
|
|
|
}); |
|
|
|
}); |
|
|
|
}, []); |
|
|
|
}, []); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Добавляем useEffect для обновления данных при изменении logData
|
|
|
|
|
|
|
|
useEffect(() => { |
|
|
|
|
|
|
|
// Можете добавить здесь дополнительную логику, если необходимо
|
|
|
|
|
|
|
|
}, [logData]); |
|
|
|
|
|
|
|
|
|
|
|
return ( |
|
|
|
return ( |
|
|
|
<div className="m-3 card lg:card-side bg-base-100 shadow-xl"> |
|
|
|
<div className="m-3 card lg:card-side bg-base-100 shadow-xl"> |
|
|
|
<div className="flex flex-col items-center bg-white border border-gray-200 rounded-lg shadow md:flex-row "> |
|
|
|
<div className="flex flex-col items-center bg-white border border-gray-200 rounded-lg shadow md:flex-row "> |
|
|
|
<div className="mb-3 object-cover rounded-t-lg md:w-auto md:min-w-64 md:max-w-64 md:rounded-s-lg md:m-3"> |
|
|
|
<div className="mb-3 object-cover rounded-t-lg md:w-auto md:min-w-64 md:max-w-96 md:rounded-s-lg md:m-3"> |
|
|
|
<div> |
|
|
|
<div> |
|
|
|
<h2>Статистика доступа к mp3 файлам</h2> |
|
|
|
<h2>Статистика доступа к mp3 файлам</h2> |
|
|
|
<div className="container mx-auto p-6"> |
|
|
|
<div className="container mx-auto p-6"> |
|
|
@ -33,6 +73,7 @@ const LogTable: React.FC = () => { |
|
|
|
<tr> |
|
|
|
<tr> |
|
|
|
<th className="py-2 px-4 border-b">№</th> |
|
|
|
<th className="py-2 px-4 border-b">№</th> |
|
|
|
<th className="py-2 px-4 border-b">Имя файла</th> |
|
|
|
<th className="py-2 px-4 border-b">Имя файла</th> |
|
|
|
|
|
|
|
<th className="py-2 px-4 border-b">Подкаст</th> |
|
|
|
<th className="py-2 px-4 border-b">Количество доступов</th> |
|
|
|
<th className="py-2 px-4 border-b">Количество доступов</th> |
|
|
|
</tr> |
|
|
|
</tr> |
|
|
|
</thead> |
|
|
|
</thead> |
|
|
@ -41,6 +82,7 @@ const LogTable: React.FC = () => { |
|
|
|
<tr key={index}> |
|
|
|
<tr key={index}> |
|
|
|
<td className="py-2 px-4 border-b">{index + 1}</td> |
|
|
|
<td className="py-2 px-4 border-b">{index + 1}</td> |
|
|
|
<td className="py-2 px-4 border-b">{item.fileName}</td> |
|
|
|
<td className="py-2 px-4 border-b">{item.fileName}</td> |
|
|
|
|
|
|
|
<td className="py-2 px-4 border-b">{translationDict[item.fileName]}</td> |
|
|
|
<td className="py-2 px-4 border-b">{item.accessCount}</td> |
|
|
|
<td className="py-2 px-4 border-b">{item.accessCount}</td> |
|
|
|
</tr> |
|
|
|
</tr> |
|
|
|
))} |
|
|
|
))} |
|
|
|