generated from mauriciobraz/next.js-telegram-webapp
-
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
5b2db4c
commit 1613fc9
Showing
13 changed files
with
419 additions
and
109 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
{ | ||
"recommendations": [ | ||
"Сегодня первый день твоих месячных, дорогая. Побалуй себя горячей ванной и шоколадом! 🍫", | ||
"Сегодня комфортный день: надень уютную одежду, смотри сериалы и расслабься", | ||
"Сегодня день йоги и смузи! Легкая растяжка и вкусный напиток со шпинатом 🧘♀️", | ||
"Сегодня день фильма! Укутайся в одеяло, смотри кино и ешь попкорн 🍿", | ||
"Последний день! Сделай маникюр, маску для лица и порадуй себя уходом 💅", | ||
"Сегодня активный день! Прогулка в парке или танцевальный класс для энергии 🌳", | ||
"Сегодня начни хобби или проект, ешь овощи и белок для энергии", | ||
"Сегодня побалуй себя десертом и любимым занятием, расслабься и наслаждайся 🍰", | ||
"Сегодня спа-день! Увлажняющая маска и сияющая кожа, наслаждайся ✨", | ||
"Сегодня день красоты! Нарядись, даже если для себя, планируй свидание 💃", | ||
"Сегодня тренировка! Чувствуй себя сильной и ешь антиоксиданты 🏋️♀️", | ||
"Сегодня творчество! Пиши, рисуй, занимайся чем-то вдохновляющим 🎨", | ||
"Сегодня расслабься! Массаж или ванна со свечами перед овуляцией 🛀", | ||
"Сегодня овуляция! Наслаждайся романтикой или сольным удовольствием ❤️", | ||
"Сегодня йога! Сохрани спокойствие и балансируй свои эмоции 🧘♀️", | ||
"Сегодня чай и клетчатка! Пей травяной чай и ешь пищу для снятия вздутия ☕", | ||
"Сегодня уход за кожей! Увлажняющая маска и много воды для сияния 💧", | ||
"Сегодня медитация! Практикуй медитацию или глубокое дыхание для спокойствия 🧘", | ||
"Сегодня ужин! Встречайся с друзьями или семьей для поднятия настроения 🍽️", | ||
"Сегодня творчество! Займись рукоделием или декором для креативности ✂️", | ||
"Сегодня отдых! Слушай тело, отдохни с хорошей книгой или фильмом 📚", | ||
"Сегодня суп! Ешь сытный суп или рагу для утешения и питательной ценности 🍲", | ||
"Сегодня ванна! Расслабляющая ванна с лавандой для спокойствия 🛀", | ||
"Сегодня дневник! Ведение дневника или прогулка на природе для гармонии 🌿", | ||
"Сегодня подготовка! Запасись любимыми менструальными продуктами", | ||
"Сегодня легкая йога! Упражнения и гидратация для снятия предменструальных болей 🧘♀️", | ||
"Сегодня уют! Расслабься дома с теплым напитком и любимым шоу ☕", | ||
"Сегодня уход за собой! Размышляй и ставь цели на следующий месяц 🌟" | ||
] | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
import React from 'react'; | ||
|
||
interface LoaderProps { | ||
text?: string; | ||
} | ||
|
||
const Loader: React.FC<LoaderProps> = ({ text = 'Loading...' }) => { | ||
return ( | ||
<div className="flex h-screen items-center justify-center bg-white"> | ||
<div className="flex flex-col items-center"> | ||
<img src="/logo.png" alt="Loading" className="size-24 animate-spin" /> | ||
<p className="mt-4 text-blue-500">{text}</p> | ||
</div> | ||
</div> | ||
); | ||
}; | ||
|
||
export default Loader; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,90 @@ | ||
import React from 'react'; | ||
|
||
type MiniCalendarProps = { | ||
lastMenstruationDate: Date; | ||
cycleLength: number; | ||
}; | ||
|
||
const MiniCalendar: React.FC<MiniCalendarProps> = ({ lastMenstruationDate, cycleLength }) => { | ||
const today = new Date(); | ||
const daysSinceLastPeriod = Math.floor( | ||
(today.getTime() - new Date(lastMenstruationDate).getTime()) / (1000 * 60 * 60 * 24) | ||
); | ||
|
||
const generateNext7Days = () => { | ||
const dates = []; | ||
for (let i = 0; i < 7; i++) { | ||
const date = new Date(today); | ||
date.setDate(today.getDate() + i); | ||
dates.push(date); | ||
} | ||
return dates; | ||
}; | ||
|
||
const dates = generateNext7Days(); | ||
|
||
const dayNames = ['П', 'Вт', 'Ср', 'Че', 'П', 'Сб', 'Во']; | ||
|
||
const getOrderedDayNames = () => { | ||
const startIndex = (today.getDay() + 6) % 7; // getDay() returns 0 for Sunday, so adjust | ||
const orderedDays = [...dayNames.slice(startIndex), ...dayNames.slice(0, startIndex)]; | ||
return orderedDays; | ||
}; | ||
|
||
const orderedDayNames = getOrderedDayNames(); | ||
|
||
return ( | ||
<div className="mt-4 flex flex-col items-center gap-4"> | ||
<div className="flex w-full justify-between px-4"> | ||
{orderedDayNames.map((day, index) => { | ||
const daysFromStartOfCycle = (daysSinceLastPeriod + index) % cycleLength; | ||
const isPeriod = daysFromStartOfCycle >= 0 && daysFromStartOfCycle < 5; | ||
const isToday = index === 0; // First element corresponds to today | ||
|
||
return ( | ||
<span | ||
key={index} | ||
className={`w-10 text-center text-sm ${ | ||
isPeriod | ||
? isToday | ||
? 'text-[#F76F45]' | ||
: 'text-[#F76F45]' | ||
: isToday | ||
? 'text-[#007AFF]' | ||
: 'text-[#65C7FF]' | ||
}`}> | ||
{isToday ? 'СЕГОДНЯ' : day} | ||
</span> | ||
); | ||
})} | ||
</div> | ||
<div className="grid w-full grid-cols-7 gap-6 px-4"> | ||
{dates.map((date, index) => { | ||
const daysFromStartOfCycle = (daysSinceLastPeriod + index) % cycleLength; | ||
const isPeriod = daysFromStartOfCycle >= 0 && daysFromStartOfCycle < 5; | ||
const isOvulation = daysFromStartOfCycle >= 12 && daysFromStartOfCycle < 17; | ||
const isToday = date.toDateString() === today.toDateString(); | ||
|
||
return ( | ||
<div key={index} className="flex flex-col items-center"> | ||
<div | ||
className={`flex size-10 items-center justify-center rounded-full ${ | ||
isPeriod | ||
? 'bg-[#FFD3C6]' | ||
: isOvulation | ||
? 'bg-gradient-to-b from-[#A3CFFF] to-[#3290F8]' | ||
: isToday | ||
? 'bg-[#DCF2FF] font-bold text-[#007AFF]' | ||
: 'bg-transparent' | ||
} ${!isPeriod && !isOvulation && !isToday ? 'text-[#65C7FF]' : 'text-black'}`}> | ||
{date.getDate()} | ||
</div> | ||
</div> | ||
); | ||
})} | ||
</div> | ||
</div> | ||
); | ||
}; | ||
|
||
export default MiniCalendar; |
Oops, something went wrong.