diff --git a/src/app/(main)/websites/[websiteId]/realtime/RealtimeLog.tsx b/src/app/(main)/websites/[websiteId]/realtime/RealtimeLog.tsx index 21da2c54..bb0225cc 100644 --- a/src/app/(main)/websites/[websiteId]/realtime/RealtimeLog.tsx +++ b/src/app/(main)/websites/[websiteId]/realtime/RealtimeLog.tsx @@ -52,7 +52,7 @@ export function RealtimeLog({ data }: { data: RealtimeData }) { }, ]; - const getTime = ({ createdAt, firstAt }) => formatTimezoneDate(firstAt || createdAt, 'h:mm:ss'); + const getTime = ({ createdAt, firstAt }) => formatTimezoneDate(firstAt || createdAt, 'pp'); const getColor = ({ id, sessionId }) => stringToColor(sessionId || id); diff --git a/src/app/(main)/websites/[websiteId]/sessions/SessionsWeekly.tsx b/src/app/(main)/websites/[websiteId]/sessions/SessionsWeekly.tsx index 6082f0e2..6663a563 100644 --- a/src/app/(main)/websites/[websiteId]/sessions/SessionsWeekly.tsx +++ b/src/app/(main)/websites/[websiteId]/sessions/SessionsWeekly.tsx @@ -10,6 +10,10 @@ export function SessionsWeekly({ websiteId }: { websiteId: string }) { const { data, ...props } = useWebsiteSessionsWeekly(websiteId); const { dateLocale } = useLocale(); const { labels, formatMessage } = useMessages(); + const { weekStartsOn } = dateLocale.options; + const daysOfWeek = Array(7) + .fill(weekStartsOn) + .map((d, i) => (d + i) % 7); const [, max] = data ? data.reduce((arr: number[], hours: number[], index: number) => { @@ -40,7 +44,9 @@ export function SessionsWeekly({ websiteId }: { websiteId: string }) { {Array(24) .fill(null) .map((_, i) => { - const label = format(addHours(startOfDay(new Date()), i), 'haaa'); + const label = format(addHours(startOfDay(new Date()), i), 'p', { locale: dateLocale }) + .replace(/\D00 ?/, '') + .toLowerCase(); return (
{label} @@ -48,33 +54,35 @@ export function SessionsWeekly({ websiteId }: { websiteId: string }) { ); })}
- {data?.map((day: number[], index: number) => { - return ( -
-
- {format(getDayOfWeekAsDate(index), 'EEE', { locale: dateLocale })} + {data && + daysOfWeek.map((index: number) => { + const day = data[index]; + return ( +
+
+ {format(getDayOfWeekAsDate(index), 'EEE', { locale: dateLocale })} +
+ {day?.map((hour: number) => { + const pct = hour / max; + return ( +
+ {hour > 0 && ( + +
+ + )} +
+ ); + })}
- {day?.map((hour: number, n) => { - const pct = hour / max; - return ( -
- {hour > 0 && ( - -
- - )} -
- ); - })} -
- ); - })} + ); + })}
); diff --git a/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionActivity.tsx b/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionActivity.tsx index 0a020d5c..a59d3a92 100644 --- a/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionActivity.tsx +++ b/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionActivity.tsx @@ -34,7 +34,7 @@ export function SessionActivity({ return ( {showHeader && ( -
{formatTimezoneDate(createdAt, 'EEEE, PPP')}
+
{formatTimezoneDate(createdAt, 'PPPP')}
)}
diff --git a/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionInfo.tsx b/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionInfo.tsx index 889eb972..3ce78d48 100644 --- a/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionInfo.tsx +++ b/src/app/(main)/websites/[websiteId]/sessions/[sessionId]/SessionInfo.tsx @@ -20,10 +20,10 @@ export default function SessionInfo({ data }) {
{formatMessage(labels.lastSeen)}
-
{formatTimezoneDate(data?.lastAt, 'EEEE, PPPpp')}
+
{formatTimezoneDate(data?.lastAt, 'PPPPpp')}
{formatMessage(labels.firstSeen)}
-
{formatTimezoneDate(data?.firstAt, 'EEEE, PPPpp')}
+
{formatTimezoneDate(data?.firstAt, 'PPPPpp')}
{formatMessage(labels.country)}
diff --git a/src/app/api/teams/[teamId]/users/route.ts b/src/app/api/teams/[teamId]/users/route.ts index 19cd6153..57460b89 100644 --- a/src/app/api/teams/[teamId]/users/route.ts +++ b/src/app/api/teams/[teamId]/users/route.ts @@ -45,12 +45,9 @@ export async function GET(request: Request, { params }: { params: Promise<{ team return json(users); } -export async function POST( - request: Request, - { params }: { params: Promise<{ teamId: string; userId: string }> }, -) { +export async function POST(request: Request, { params }: { params: Promise<{ teamId: string }> }) { const schema = z.object({ - userId: z.string(), + userId: z.string().uuid(), role: roleParam, }); diff --git a/src/components/hooks/useApi.ts b/src/components/hooks/useApi.ts index d8a05d92..dfa48e2f 100644 --- a/src/components/hooks/useApi.ts +++ b/src/components/hooks/useApi.ts @@ -9,7 +9,7 @@ const selector = (state: { shareToken: { token?: string } }) => state.shareToken async function handleResponse(res: FetchResponse): Promise { if (!res.ok) { - return Promise.reject(new Error(res.error)); + return Promise.reject(new Error(res.error?.error || res.error || 'Unexpectd error.')); } return Promise.resolve(res.data); } diff --git a/src/components/hooks/useTimezone.ts b/src/components/hooks/useTimezone.ts index 5f01c2ab..99c1f115 100644 --- a/src/components/hooks/useTimezone.ts +++ b/src/components/hooks/useTimezone.ts @@ -2,11 +2,13 @@ import { setItem } from '@/lib/storage'; import { TIMEZONE_CONFIG } from '@/lib/constants'; import { formatInTimeZone, zonedTimeToUtc, utcToZonedTime } from 'date-fns-tz'; import useStore, { setTimezone } from '@/store/app'; +import useLocale from './useLocale'; const selector = (state: { timezone: string }) => state.timezone; export function useTimezone() { const timezone = useStore(selector); + const { dateLocale } = useLocale(); const saveTimezone = (value: string) => { setItem(TIMEZONE_CONFIG, value); @@ -20,6 +22,7 @@ export function useTimezone() { : date.split(' ').join('T') + 'Z', timezone, pattern, + { locale: dateLocale }, ); }; diff --git a/src/lang/mn-MN.json b/src/lang/mn-MN.json index 769c58a5..60797aef 100644 --- a/src/lang/mn-MN.json +++ b/src/lang/mn-MN.json @@ -4,14 +4,14 @@ "label.activity": "Үйл ажиллагааны бүртгэл", "label.add": "Нэмэх", "label.add-description": "Тайлбар нэмэх", - "label.add-member": "Add member", - "label.add-step": "Add step", + "label.add-member": "Гишүүн нэмэх", + "label.add-step": "Алхам нэмэх", "label.add-website": "Веб нэмэх", "label.admin": "Админ", "label.after": "Хойно", "label.all": "Бүх", "label.all-time": "Бүх цаг үеийн", - "label.analytics": "Analytics", + "label.analytics": "Аналитик", "label.average": "Дундаж", "label.back": "Буцах", "label.before": "Өмнө", @@ -24,12 +24,12 @@ "label.cities": "Хотууд", "label.city": "Хот", "label.clear-all": "Бүгдийг арилгах", - "label.compare": "Compare", + "label.compare": "Харьцуулах", "label.confirm": "Батлах", "label.confirm-password": "Шинэ нууц үгээ давтах", "label.contains": "Агуулах", "label.continue": "Үргэлжлүүлэх", - "label.count": "Count", + "label.count": "Тоо", "label.countries": "Улс", "label.country": "Улс", "label.create": "Үүсгэх", @@ -37,8 +37,8 @@ "label.create-team": "Баг үүсгэх", "label.create-user": "Хэрэглэгч үүсгэх", "label.created": "Үүсгэсэн", - "label.created-by": "Created By", - "label.current": "Current", + "label.created-by": "Үүсгэсэн", + "label.current": "Одоогийн", "label.current-password": "Ашиглаж буй нууц үг", "label.custom-range": "Дурын хугацаа", "label.dashboard": "Хянах самбар", @@ -48,7 +48,7 @@ "label.day": "Өдөр", "label.default-date-range": "Өгөгдмөл хугацааны муж", "label.delete": "Устгах", - "label.delete-report": "Delete report", + "label.delete-report": "Тайлан устгах", "label.delete-team": "Баг устгах", "label.delete-user": "Хэрэглэгч устгах", "label.delete-website": "Веб устгах", @@ -63,14 +63,14 @@ "label.dropoff": "Уналт", "label.edit": "Засах", "label.edit-dashboard": "Хянах самбар засах", - "label.edit-member": "Edit member", + "label.edit-member": "Гишүүн засах", "label.enable-share-url": "Хуваалцах холбоос идэвхжүүлэх", - "label.end-step": "End Step", - "label.entry": "Entry URL", + "label.end-step": "Төгсгөлийн алхам", + "label.entry": "Орох зам", "label.event": "Үйлдэл", "label.event-data": "Үйлдлийн өгөгдөл", "label.events": "Үйлдэл", - "label.exit": "Exit URL", + "label.exit": "Гарах зам", "label.false": "Худал", "label.field": "Талбар", "label.fields": "Талбар", @@ -78,16 +78,16 @@ "label.filter-combined": "Нэгтгэсэн", "label.filter-raw": "Түүхий", "label.filters": "Шүүлтүүр", - "label.first-seen": "First seen", + "label.first-seen": "Анх харсан", "label.funnel": "Цутгал", "label.funnel-description": "Хэрэглэгчдийн шилжилт, уналтын хэмжээг шинжлэх.", - "label.goal": "Goal", - "label.goals": "Goals", - "label.goals-description": "Track your goals for pageviews and events.", + "label.goal": "Зорилго", + "label.goals": "Зорилго", + "label.goals-description": "Хуудас үзсэн болон үйлдлийн зорилгыг мөрдөх.", "label.greater-than": "Их", "label.greater-than-equals": "Их буюу тэнцүү", - "label.host": "Host", - "label.hosts": "Hosts", + "label.host": "Хост", + "label.hosts": "Хост", "label.insights": "Шинжлэх", "label.insights-description": "Өгөгдлөө хэсэгчлэн хуваах, шүүх байдлаар задлан шинжлэх.", "label.is": "Бол", @@ -96,36 +96,36 @@ "label.is-set": "Утга оноосон", "label.join": "Нэгдэх", "label.join-team": "Багт нэгдэх", - "label.journey": "Journey", - "label.journey-description": "Understand how users navigate through your website.", + "label.journey": "Аялал", + "label.journey-description": "Хэрэглэгчид таны цахим хуудсаар хэрхэн шилжиж явсныг шинжлэх.", "label.language": "Хэл", "label.languages": "Хэл", "label.laptop": "Зөөврийн компьютер", "label.last-days": "Сүүлийн {x} хоног", "label.last-hours": "Сүүлийн {x} цаг", - "label.last-months": "Last {x} months", - "label.last-seen": "Last seen", + "label.last-months": "Сүүлийн {x} сар", + "label.last-seen": "Сүүлд харагдсан", "label.leave": "Гарах", "label.leave-team": "Багаас гарах", "label.less-than": "Бага", "label.less-than-equals": "Бага буюу тэнцүү", "label.login": "Нэвтрэх", "label.logout": "Гарах", - "label.manage": "Manage", - "label.manager": "Manager", + "label.manage": "Удирдах", + "label.manager": "Удирдагч", "label.max": "Max", - "label.member": "Member", + "label.member": "Гишүүн", "label.members": "Гишүүд", "label.min": "Min", "label.mobile": "Утас", "label.more": "Цааш", - "label.my-account": "My account", + "label.my-account": "Миний бүртгэл", "label.my-websites": "Миний вебүүд", "label.name": "Нэр", "label.new-password": "Шинэ нууц үг", "label.none": "Байхгүй", - "label.number-of-records": "{x} {x, plural, one {record} other {records}}", - "label.ok": "OK", + "label.number-of-records": "{x} {x, plural, one {бичлэг} other {бичлэг}}", + "label.ok": "ЗА", "label.os": "OS", "label.overview": "Тойм", "label.owner": "Эзэмшигч", @@ -134,15 +134,15 @@ "label.pageTitle": "Хуудасны гарчиг", "label.pages": "Хуудас", "label.password": "Нууц үг", - "label.path": "Path", - "label.paths": "Paths", + "label.path": "Зам", + "label.paths": "Зам", "label.powered-by": "{name} дээр суурилсан", - "label.previous": "Previous", - "label.previous-period": "Previous period", - "label.previous-year": "Previous year", + "label.previous": "Өмнөх", + "label.previous-period": "Өмнөх үе", + "label.previous-year": "Өмнөх жил", "label.profile": "Бүртгэл", - "label.properties": "Properties", - "label.property": "Property", + "label.properties": "Шинж чанар", + "label.property": "Шинж чанар", "label.queries": "Query-нүүд", "label.query": "Query", "label.query-parameters": "Query параметр", @@ -154,22 +154,22 @@ "label.region": "Бүс", "label.regions": "Бүсүүд", "label.remove": "Устгах", - "label.remove-member": "Remove member", + "label.remove-member": "Гишүүн хасах", "label.reports": "Тайлан", "label.required": "Шаардлагатай", "label.reset": "Дахин эхлүүлэх", "label.reset-website": "Тоон үзүүлэлтийг дахин эхлүүлэх", "label.retention": "Барилт", "label.retention-description": "Хэрэглэгчид таны веб рүү дахин хандах буюу хэрэглэгчдээ хэр тогтоож буйг хэмжих.", - "label.revenue": "Revenue", - "label.revenue-description": "Look into your revenue across time.", - "label.revenue-property": "Revenue Property", + "label.revenue": "Орлого", + "label.revenue-description": "Цаг хугацааны туршид орлогын өөрчлөлтийг харах.", + "label.revenue-property": "Орлогын шинж чанар", "label.role": "Эрх", "label.run-query": "Query ажиллуулах", "label.save": "Хадгалах", "label.screens": "Дэлгэц", "label.search": "Хайх", - "label.select": "Select", + "label.select": "Сонгох", "label.select-date": "Огноо сонгох", "label.select-role": "Select role", "label.select-website": "Веб сонгох", @@ -178,13 +178,13 @@ "label.settings": "Тохиргоо", "label.share-url": "Хуваалцах холбоос", "label.single-day": "Нэг өдөр", - "label.start-step": "Start Step", - "label.steps": "Steps", + "label.start-step": "Эхлэх алхам", + "label.steps": "Алхам", "label.sum": "Нийлбэр", "label.tablet": "Таблет", "label.team": "Баг", "label.team-id": "Багийн ID", - "label.team-manager": "Team manager", + "label.team-manager": "Багийн удирдагч", "label.team-member": "Багийн гишүүн", "label.team-name": "Багийн нэр", "label.team-owner": "Багийн эзэмшигч", @@ -203,46 +203,46 @@ "label.total-records": "Нийт мөрийн тоо", "label.tracking-code": "Мөрдөх код", "label.transactions": "Transactions", - "label.transfer": "Transfer", - "label.transfer-website": "Transfer website", + "label.transfer": "Шилжүүлэх", + "label.transfer-website": "Вебийг шилжүүлэх", "label.true": "Үнэн", "label.type": "Төрөл", "label.unique": "Давхардаагүй", "label.unique-visitors": "Зочин", - "label.uniqueCustomers": "Unique Customers", + "label.uniqueCustomers": "Давтагдаагүй зочин", "label.unknown": "Тодорхойгүй", "label.untitled": "Гарчиггүй", - "label.update": "Update", + "label.update": "Шинэчлэх", "label.url": "URL", - "label.urls": "URLs", + "label.urls": "URL-ууд", "label.user": "Хэрэглэгч", - "label.user-property": "User Property", + "label.user-property": "Хэрэглэгчийн шинж", "label.username": "Хэрэглэгчийн нэр", "label.users": "Хэрэглэгчид", "label.utm": "UTM", - "label.utm-description": "Track your campaigns through UTM parameters.", + "label.utm-description": "UTM параметраар кампанит ажлаа мөрдөх.", "label.value": "Утга", "label.view": "Харах", "label.view-details": "Дэлгэрүүлж харах", "label.view-only": "Зөвхөн үзэх", "label.views": "Үзсэн", - "label.views-per-visit": "Views per visit", + "label.views-per-visit": "Зочдын хуудас үзсэн тоо", "label.visit-duration": "Зочилсон дундаж хугацаа", "label.visitors": "Зочин", - "label.visits": "Visits", + "label.visits": "Зочилсон", "label.website": "Веб", "label.website-id": "Вебийн ID", "label.websites": "Вебүүд", "label.window": "Цонх", "label.yesterday": "Өчигдөр", - "message.action-confirmation": "Type {confirmation} in the box below to confirm.", + "message.action-confirmation": "Доорх хэсэгт {confirmation} гэж бичин баталгаажуулна уу.", "message.active-users": "одоо {x} {x, plural, one {зочин} other {зочин}} байна", - "message.collected-data": "Collected data", + "message.collected-data": "Цуглуулсан өгөгдөл", "message.confirm-delete": "Та {target}-г устгахдаа итгэлтэй байна уу?", "message.confirm-leave": "Та {target}-с гарахдаа итгэлтэй байна уу?", - "message.confirm-remove": "Are you sure you want to remove {target}?", + "message.confirm-remove": "Та {target}-г устгахдаа итгэлтэй байна уу?", "message.confirm-reset": "Та {target}-н тоон үзүүлэлтүүдийг устгахдаа итгэлтэй байна уу?", - "message.delete-team-warning": "Deleting a team will also delete all team websites.", + "message.delete-team-warning": "Баг устгах нь мөн түүнд харъяалагдах вебүүдийг устгах болно.", "message.delete-website-warning": "Энэ вебтэй холбоотой бүх өгөгдөл устах болно.", "message.error": "Ямар нэг зүйл буруу боллоо.", "message.event-log": "{url}-д {event}", @@ -268,12 +268,12 @@ "message.team-not-found": "Баг олдсонгүй.", "message.team-websites-info": "Вебийг багийн бүх гишүүд үзэж болно.", "message.tracking-code": "Энэ вебийн хандалтуудыг мөрдөхийн тулд доорх кодыг HTML-нхээ ... хэсэгт байрлуулна уу.", - "message.transfer-team-website-to-user": "Transfer this website to your account?", - "message.transfer-user-website-to-team": "Select the team to transfer this website to.", - "message.transfer-website": "Transfer website ownership to your account or another team.", - "message.triggered-event": "Triggered event", + "message.transfer-team-website-to-user": "Энэ вебийг өөрийн бүртгэл рүү шилжүүлэх үү?", + "message.transfer-user-website-to-team": "Энэ вебийг шилжүүлж авах багийг сонгоно уу.", + "message.transfer-website": "Энэ вебийг өөрийн бүртгэл рүү эсвэл багт шилжүүлж авах.", + "message.triggered-event": "Өдөөсөн үйлдэл", "message.user-deleted": "Хэрэглэгч устсан.", - "message.viewed-page": "Viewed page", + "message.viewed-page": "Үзсэн хуудас", "message.visitor-log": "{country} улсаас {os} {device} дээр {browser} хөтөч ашиглан орсон", - "message.visitors-dropped-off": "Visitors dropped off" + "message.visitors-dropped-off": "Зочдын уналт" }