route handler for account/main

This commit is contained in:
2025-05-20 13:04:50 +03:00
parent a132c8a314
commit 73e206be5d
7 changed files with 408 additions and 16 deletions

View File

@@ -36,7 +36,7 @@ class UserDataView(ViewSet):
status=status.HTTP_404_NOT_FOUND
)
class AccountActions(ViewSet):
class AccountActionsView(ViewSet):
permission_classes = [IsAuthenticated]
@action(detail=False, methods=['patch'])

View File

@@ -8,7 +8,7 @@ LoginViewSet,
LogoutView,
RefreshTokenView)
from api.account.client.views import UserDataView
from api.account.client.views import UserDataView, AccountActionsView
urlpatterns = [
path("v1/faq/", FAQView.as_view(), name='faqMain'),
@@ -21,4 +21,6 @@ urlpatterns = [
path("v1/logout", LogoutView.as_view(), name="logout"),
path ("v1/user/", UserDataView.as_view({'get': 'user_data'}), name="user"),
path("v1/account/change_main_data/", AccountActionsView.as_view({'patch':'change_data_main_tab'}), name='change_data_main_tab')
]

View File

@@ -14,10 +14,12 @@ const validationRules = {
lastName: { required: false },
phone_number: { required: true },
email: { required: true },
country: { required: false },
city: { required: false },
}
const AccountPage = () => {
const { user } = useUserStore()
const { user, setUser } = useUserStore()
const { values, handleChange, handleSubmit } = useForm(
{
@@ -31,10 +33,30 @@ const AccountPage = () => {
validationRules,
async (values) => {
try {
// await updateMainTab(values)
const response = await fetch('/api/account/main', {
method: 'PATCH',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(values),
})
if (!response.ok) {
const error = await response.json()
throw new Error(error.error || 'Ошибка при обновлении данных')
}
const result = await response.json()
setUser(result.user)
showToast({ type: 'success', message: 'Данные успешно обновлены!' })
} catch {
showToast({ type: 'error', message: 'Ой, что то пошло не так..' })
} catch (error) {
showToast({
type: 'error',
message:
error instanceof Error
? error.message
: 'Ой, что то пошло не так..',
})
}
}
)

View File

@@ -0,0 +1,324 @@
import React from 'react'
const PublicOffer = () => {
return (
<div className="max-w-4xl mx-auto px-4 py-8">
<h1 className="text-3xl font-bold mb-8">Публичная оферта</h1>
<section className="mb-8">
<h2 className="text-2xl font-semibold mb-4">1. ОБЩИЕ ПОЛОЖЕНИЯ</h2>
<div className="space-y-4">
<p className="text-gray-700">
1.1. Настоящий Публичный договор (далее Оферта, договор)
представляет собой официальное предложение Интернет-сервиса
tripwb.com (далее Компания) на оказание Информационных услуг
дееспособным физическим лицам (далее Пользователь) по попутной
доставке посылок, либо совместной автомобильной поездке, через
вебсайт tripwb.com регулирует порядок использования Сайта и
взаимоотношения, возникающие при использовании Сайта и Сервисов
Пользователями. Компания не гарантирует доступность Сайта и Сервисов
круглосуточно. Компания имеет право в любой момент отказать любому
Пользователю, в использовании Сервисов при нарушении договора.
</p>
<p className="text-gray-700">
1.2. Принятие (акцепт) данной Оферты означает полное и
безоговорочное принятие Пользователем всех условий без каких-либо
исключений и/или ограничений и приравнивается в соответствии со
статьей 395 Гражданского Кодекса Республики Казахстан настоящее
Пользовательское соглашение признается офертой. Соглашение,
заключаемое в форме оферты, предусмотрено Гражданским Кодексом
Республики Казахстан, не требует двустороннего подписания и
действительно в электронном виде.
</p>
<p className="text-gray-700">
1.3. Данная Оферта считается заключенной (акцептированной) с момента
принятия Пользователем условий Сервиса путем заполнения учетной
записи на Сайте Компании.
</p>
<p className="text-gray-700">
1.4. Компания и Пользователь предоставляют взаимные гарантии своей
право и дееспособности, необходимые для заключения и исполнения
настоящей Оферты.
</p>
<p className="text-gray-700">
1.5. Пользователи не согласные с данной Офертой или с отдельными ее
пунктами, вправе отказаться от использования сайта
https://tripwb.com (далее — «Сайт»).
</p>
</div>
</section>
<section className="mb-8">
<h2 className="text-2xl font-semibold mb-4">2. Используемые Термины</h2>
<div className="space-y-4">
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
<div className="bg-gray-50 p-4 rounded-lg">
<p className="font-semibold">«Компания»</p>
<p className="text-gray-700">tripwb.com</p>
</div>
<div className="bg-gray-50 p-4 rounded-lg">
<p className="font-semibold">«Администрация Сайта»</p>
<p className="text-gray-700">
уполномоченные сотрудники Компании, а также иные лица,
уполномоченные на управление Сайтом и предоставление Сервисов
Пользователям при использовании Сайта в соответствии с настоящим
Соглашением
</p>
</div>
<div className="bg-gray-50 p-4 rounded-lg">
<p className="font-semibold">«Сайт»</p>
<p className="text-gray-700">
Интернет-Сервис по попутной доставке посылок, а также совместных
автомобильных поездок, доступный на вебсайте tripwb.com
</p>
</div>
<div className="bg-gray-50 p-4 rounded-lg">
<p className="font-semibold">«Аккаунт»</p>
<p className="text-gray-700">
учетная запись, создание которой является обязательным условием
регистрации на Сайте для получения доступа к использованию
Сервисов Сайта
</p>
</div>
</div>
</div>
</section>
<section className="mb-8">
<h2 className="text-2xl font-semibold mb-4">3. Основные положения</h2>
<div className="space-y-4">
<p className="text-gray-700">
3.1. Компанией разработана платформа для оказания информационных
услуг по попутной доставке посылок и совместных автомобильных
поездках, доступная на вебсайте по адресу tripwb.com. Целью данной
платформы является предоставление Перевозчиками, следующим в
определенном направлении, возможности установления связи с
Отправителем, которым необходимо передать посылку, груз, либо
осуществить поездку в том же направлении, для уменьшения собственных
расходов.
</p>
<p className="text-gray-700">
3.2. Нажимая «Войти через Google» или через «Логин» и «Пароль».
Пользователь соглашается, принимает, и обязуется безоговорочно
следовать всем его условиям, также, Пользователь вправе отказаться
от использования Сайта tripwb.com.
</p>
<p className="text-gray-700">
3.3. Компания оставляет за собой право изменять условия Соглашения и
всех его неотъемлемых частей без согласования с Пользователем с
уведомлением последнего посредством размещения на Сайте новой
редакции Соглашения.
</p>
</div>
</section>
<div className="mt-8 text-sm text-gray-500">
<p>Последнее обновление: 20.05.2025</p>
</div>
<div className="mt-16 border-t-2 pt-8">
<h1 className="text-3xl font-bold mb-8">Жария шарт (Оферта)</h1>
<section className="mb-8">
<h2 className="text-2xl font-semibold mb-4">1. ЖАЛПЫ ЕРЕЖЕЛЕР</h2>
<div className="space-y-4">
<p className="text-gray-700">
1.1. Осы Жария шарт (бұдан әрі Оферта, шарт) іс-әрекетке
қабілетті жеке тұлғаларға (бұдан әрі Пайдаланушы) сәлемдемелерді
ілеспе жеткізу не бірлескен автомобиль сапары бойынша ақпараттық
қызметтер көрсетуге tripwb.com Интернет сервистің (бұдан
әрі-Компания) ресми ұсынысын білдіреді, tripwb.com веб-сайт арқылы
Сайтты пайдалану тәртібін және Пайдаланушылар Сайтты және
Сервистерді пайдаланған кезде туындайтын қатынастарды реттейді.
Компания Сайт пен Сервистердің тәулік бойы қолжетімділігіне
кепілдік бермейді. Компания кез келген уақытта кез келген
Пайдаланушыға https://tripwb.com/ru/info_page/publichnaya-oferta/
Шартты бұзған кезде Сервистерді пайдаланудан бас тартуға құқылы.
</p>
<p className="text-gray-700">
1.2. Осы Офертаны қабылдау (акцепт) Пайдаланушының қандай да бір
ерекшеліктерсіз және/немесе шектеулерсіз барлық шарттарды толық
және сөзсіз қабылдауын білдіреді және Қазақстан Республикасы
Азаматтық Кодексінің 395-бабына сәйкес теңестіріледі осы
Пайдаланушы келісімі оферта деп танылады. Оферта нысанында
жасалатын Келісім Қазақстан Республикасының Азаматтық кодексінде
көзделген, екіжақты қол қоюды талап етпейді және электрондық түрде
жарамды.
</p>
<p className="text-gray-700">
1.3. Бұл Оферта Пайдаланушы Компания Сайтындағы тіркеу жазбасын
толтыру арқылы Сервис шарттарын қабылдаған сәттен бастап жасалған
(акцептелген) болып есептеледі.
</p>
<p className="text-gray-700">
1.4. Компания мен Пайдаланушы осы Офертаны жасасу және орындау
үшін қажетті өз құқығы мен әрекет қабілеттілігіне өзара
кепілдіктер береді.
</p>
<p className="text-gray-700">
1.5. Осы Офертамен немесе оның жекелеген тармақтарымен келіспеген
пайдаланушылар https://tripwb.com (бұдан әрі - "Сайт") Сайтты
пайдаланудан бас тартуға құқылы.
</p>
</div>
</section>
<section className="mb-8">
<h2 className="text-2xl font-semibold mb-4">
2. Қолданылатын Терминдер
</h2>
<div className="space-y-4">
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
<div className="bg-gray-50 p-4 rounded-lg">
<p className="font-semibold">«Компания»</p>
<p className="text-gray-700">tripwb.com</p>
</div>
<div className="bg-gray-50 p-4 rounded-lg">
<p className="font-semibold">«Сайт Әкімшілігі»</p>
<p className="text-gray-700">
Компанияның уәкілетті қызметкерлері, сондай-ақ осы Келісімге
сәйкес Сайтты пайдалану кезінде Пайдаланушыларға Сайтты
басқаруға және Сервистерді ұсынуға уәкілеттік берілген өзге де
тұлғалар, сондай-ақ Сайтқа барлық тиісті айрықша мүліктік
құқықтары, оның ішінде Сайттың домендік атауына және оны
әкімшілендіруді жүзеге асыратын құқығы бар тұлғалар.
</p>
</div>
<div className="bg-gray-50 p-4 rounded-lg">
<p className="font-semibold">«Сайт»</p>
<p className="text-gray-700">
Сәлемдемелерді, сондай-ақ tripwb.com вебсайтта қолжетімді
бірлескен автомобиль сапарларын ілеспе жеткізу жөніндегі
Интернет-Сервис.
</p>
</div>
<div className="bg-gray-50 p-4 rounded-lg">
<p className="font-semibold">«Аккаунт»</p>
<p className="text-gray-700">
тіркеу жазбасы, оны құру Сайттың Сервистерін пайдалануға қол
жеткізу үшін Сайтта тіркелудің міндетті шарты болып табылады.
</p>
</div>
</div>
</div>
</section>
<section className="mb-8">
<h2 className="text-2xl font-semibold mb-4">3. Негізгі ережелер</h2>
<div className="space-y-4">
<p className="text-gray-700">
3.1. Компания сәлемдемелерді ілеспе жеткізу және бірлескен
автомобиль сапарлары бойынша ақпараттық қызметтер көрсету үшін
tripwb.com вебсайтта қолжетімді платформа әзірледі. Бұл
платформаның мақсаты белгілі бір бағытта жүретін
Тасымалдаушылардың сілтемені, жүкті беруі немесе өз шығындарын
азайту үшін сол бағытта жүруді жүзеге асыруы қажет Жөнелтушімен
байланыс орнату мүмкіндігін ұсынуы болып табылады.
</p>
</div>
</section>
<section className="mb-8">
<h2 className="text-2xl font-semibold mb-4">
4. Пайдаланушыны тіркеу
</h2>
<div className="space-y-4">
<p className="text-gray-700">
4.1. Сайтты 18 жасқа толған жеке тұлғалар пайдалана алады.
Кәмелетке толмағандарға Сайтта тіркелуге қатаң тыйым салынады.
Платформаға қол жеткізе отырып, оның Сервистерін қолдана отырып
және Аккаунтты тіркей отырып, Пайдаланушылар кәмелетке толған және
толық қабілетті адамдар екендігін растайды және кепілдік береді.
</p>
</div>
</section>
<section className="mb-8">
<h2 className="text-2xl font-semibold mb-4">
5. Сайт Сервистері бойынша жалпы ережелер
</h2>
<div className="space-y-4">
<p className="text-gray-700">
5.1. Әкімшілік кез-келген Пайдаланушы Сайтта орналастырмас бұрын
кез-келген түрдегі контентті қарауға міндетті емес.
</p>
</div>
</section>
<section className="mb-8">
<h2 className="text-2xl font-semibold mb-4">
6. Сервистерді пайдалану
</h2>
<div className="space-y-4">
<p className="text-gray-700">
6.1. Хабарландыруларды жариялау. Төмендегі шарттар орындалған
жағдайда, Сіз Пайдаланушы ретінде Тасымалдаушы (Тасымалдау) және
Жөнелтуші (Тапсырыс) ретінде хабарландырулар жасай және жариялай
аласыз.
</p>
</div>
</section>
<section className="mb-8">
<h2 className="text-2xl font-semibold mb-4">
7. Дауларды қарау ережелері
</h2>
<div className="space-y-4">
<p className="text-gray-700">
Осы дауларды қарау қағидалары (бұдан әрі - Қағидалар) "TWB" онлайн
сервисін пайдалану туралы келісімнің (бұдан әрі - Келісім)
ажырамас бөлігі болып табылады және Пайдаланушылар арасындағы
дауларды шешу тәртібін белгілейді.
</p>
</div>
</section>
<section className="mb-8">
<h2 className="text-2xl font-semibold mb-4">
8. Хабарландыруларды жою себептері
</h2>
<div className="space-y-4">
<p className="text-gray-700">
Пайдаланушының хабарландыруын Компания Пайдаланушының осы
Келісімнің талаптарын бұзуы себебінен, сондай-ақ мынадай себептер
бойынша жоюы мүмкін.
</p>
</div>
</section>
<section className="mb-8">
<h2 className="text-2xl font-semibold mb-4">
9. Компанияның жауапкершілігін шектеу
</h2>
<div className="space-y-4">
<p className="text-gray-700">
Сайттың Сервистерін пайдалана отырып, Пайдаланушы Сайтты және оның
Сервистерді өз тәуекелімен және "сол қалпында" пайдаланатындығына
келісімін растайды.
</p>
</div>
</section>
<section className="mb-8">
<h2 className="text-2xl font-semibold mb-4">
10. Хабарламалар Сервисі
</h2>
<div className="space-y-4">
<p className="text-gray-700">
Мәміле жасалғаннан кейін Пайдаланушыға Пайдаланушылар арасында
мәміле бойынша міндеттемелерді орындау үшін қажетті қосымша
ақпаратпен алмасуға мүмкіндік беретін хабар алмасу қызметіне қол
жетімділік беріледі.
</p>
</div>
</section>
<div className="mt-8 text-sm text-gray-500">
<p>Соңғы жаңарту: 20.05.2025</p>
</div>
</div>
</div>
)
}
export default PublicOffer

View File

@@ -1,5 +1,49 @@
import { NextRequest } from 'next/server'
import { getServerSession } from 'next-auth'
import { authOptions } from '@/app/api/auth/[...nextauth]/route'
export async function PUT(req: NextRequest) {
// обновляем данные в аккаунте
export async function PATCH(req: NextRequest) {
try {
const session = await getServerSession(authOptions)
if (!session) {
return new Response(JSON.stringify({ error: 'Unauthorized' }), {
status: 401,
})
}
const data = await req.json()
const { firstName, lastName, email, phone_number, country, city } = data
const response = await fetch(
`${process.env.NEXT_PUBLIC_API_URL}/account/change_main_data/`,
{
method: 'PATCH',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${session.accessToken}`,
},
body: JSON.stringify({
firstName,
lastName,
email,
phone_number,
country,
city,
}),
}
)
if (!response.ok) {
const error = await response.json()
return new Response(JSON.stringify(error), { status: response.status })
}
const result = await response.json()
return new Response(JSON.stringify(result), { status: 200 })
} catch (error) {
return new Response(JSON.stringify({ error: 'Internal Server Error' }), {
status: 500,
})
}
}

View File

@@ -42,7 +42,7 @@ interface GoogleToken extends JWT {
error?: string
}
const authOptions: NextAuthOptions = {
export const authOptions: NextAuthOptions = {
providers: [
//google login flow
// GoogleProvider({

View File

@@ -31,7 +31,7 @@ const Footer = () => {
<EmailHandler />
<div className="flex gap-4 justify-center md:justify-start">
<a
href="https://instagram.com"
href="https://instagram.com/tripwb_com"
target="_blank"
rel="noopener noreferrer"
>
@@ -41,7 +41,7 @@ const Footer = () => {
/>
</a>
<a
href="https://telegram.com"
href="https://t.me/tripWB"
target="_blank"
rel="noopener noreferrer"
>
@@ -51,7 +51,7 @@ const Footer = () => {
/>
</a>
<a
href="https://vk.com"
href="https://vk.com/club226251027"
target="_blank"
rel="noopener noreferrer"
>
@@ -61,7 +61,7 @@ const Footer = () => {
/>
</a>
<a
href="https://facebook.com"
href="https://www.facebook.com/share/p/tckdLFiyXm9r2925/?mibextid=WC7FNe"
target="_blank"
rel="noopener noreferrer"
>
@@ -71,7 +71,7 @@ const Footer = () => {
/>
</a>
<a
href="https://tiktok.com"
href="https://www.tiktok.com/@tripwithbonus?_t=8qHingfQWNq"
target="_blank"
rel="noopener noreferrer"
>
@@ -81,7 +81,7 @@ const Footer = () => {
/>
</a>
<a
href="https://youtube.com"
href="https://youtube.com/@tripwb?si=oiNZrtiOqx6OePJv"
target="_blank"
rel="noopener noreferrer"
>
@@ -236,7 +236,7 @@ const Footer = () => {
<div className="flex flex-col justify-between md:flex-row px-6 py-4 md:py-8 w-[95%] mx-auto text-center md:text-left">
<div>Copyright © {new Date().getFullYear()}. Все права защищены.</div>
<div className="flex flex-col md:flex-row py-4 md:py-0 md:space-x-5 items-center md:items-start">
<Link href="/" className="hover:text-orange">
<Link href="/publichnaya-oferta" className="hover:text-orange">
Публичная оферта
</Link>
<Link href="/" className="hover:text-orange">