Polish dating profile link, likes title, and offline RSVP calendar export.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
parent
377db2284f
commit
f9ab758926
@ -8,6 +8,14 @@ export const metadata: Metadata = {
|
||||
};
|
||||
|
||||
const LOGS = [
|
||||
{
|
||||
date: "2026-09-04",
|
||||
tag: "匹配资料 · 报名日历",
|
||||
items: [
|
||||
"匹配卡片可「查看资料」;喜欢页标题改为中性「喜欢」",
|
||||
"线下报名成功自动下载日历;个人中心每场 RSVP 可加入日历",
|
||||
],
|
||||
},
|
||||
{
|
||||
date: "2026-09-04",
|
||||
tag: "导航精简",
|
||||
|
||||
@ -10601,6 +10601,21 @@ a.profile-stat-link:hover {
|
||||
margin: 16px 0;
|
||||
}
|
||||
|
||||
.dating-view-profile {
|
||||
display: inline-block;
|
||||
margin-top: 4px;
|
||||
font-size: 0.85rem;
|
||||
color: var(--accent, #e8a87c);
|
||||
text-decoration: none;
|
||||
pointer-events: auto;
|
||||
position: relative;
|
||||
z-index: 2;
|
||||
}
|
||||
|
||||
.dating-view-profile:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.dating-actions {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
@ -11567,6 +11582,18 @@ a.weather-card:hover {
|
||||
margin-left: auto;
|
||||
}
|
||||
|
||||
.profile-rsvp-actions {
|
||||
margin-left: auto;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 0.4rem;
|
||||
justify-content: flex-end;
|
||||
}
|
||||
|
||||
.profile-rsvp-actions .btn {
|
||||
margin-left: 0;
|
||||
}
|
||||
|
||||
.compare-history {
|
||||
margin: 0 0 1.5rem;
|
||||
padding: 1rem 1.15rem;
|
||||
|
||||
@ -237,7 +237,7 @@ export default function ProfilePage() {
|
||||
<strong>{connect.likes}</strong>
|
||||
<span>{t.profile.statLikes}</span>
|
||||
</Link>
|
||||
<Link href="/dating" className="profile-stat-card profile-stat-link">
|
||||
<Link href="/dating/likes" className="profile-stat-card profile-stat-link">
|
||||
<span className="stat-emoji">✨</span>
|
||||
<strong>{connect.matches}</strong>
|
||||
<span>{t.profile.statMatches}</span>
|
||||
@ -410,11 +410,28 @@ export default function ProfilePage() {
|
||||
{m.city} · {m.date} {m.time}
|
||||
</p>
|
||||
</div>
|
||||
{(m.mode === "online" || m.mode === "hybrid") && (
|
||||
<Link href={`/meetups/${m.id}/live`} className="btn btn-sm btn-primary">
|
||||
{t.profile.openLive}
|
||||
</Link>
|
||||
)}
|
||||
<div className="profile-rsvp-actions">
|
||||
{(m.mode === "online" || m.mode === "hybrid") && (
|
||||
<Link href={`/meetups/${m.id}/live`} className="btn btn-sm btn-primary">
|
||||
{t.profile.openLive}
|
||||
</Link>
|
||||
)}
|
||||
<button
|
||||
type="button"
|
||||
className="btn btn-sm btn-ghost"
|
||||
onClick={() => {
|
||||
const ics = buildMeetupIcs([m], m.title);
|
||||
if (!ics) {
|
||||
toast(t.meetups.exportCalFail, "info");
|
||||
return;
|
||||
}
|
||||
downloadMeetupIcs(`nomadro-${m.id}.ics`, ics);
|
||||
toast(t.meetups.exportCalDone);
|
||||
}}
|
||||
>
|
||||
{t.meetups.addToCal}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
|
||||
@ -337,6 +337,14 @@ export default function DatingClient() {
|
||||
</span>
|
||||
))}
|
||||
</div>
|
||||
<Link
|
||||
href={`/members/${top.userId || top.id}`}
|
||||
className="dating-view-profile"
|
||||
onPointerDown={(e) => e.stopPropagation()}
|
||||
onClick={(e) => e.stopPropagation()}
|
||||
>
|
||||
{t.dating.viewProfile} →
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
<div className="dating-actions reveal">
|
||||
|
||||
@ -129,10 +129,26 @@ export default function MeetupsClient({ meetups }: Props) {
|
||||
const res = await api.rsvpMeetup(meetup.id, undefined, token);
|
||||
setRsvpIds(new Set(rsvpIds).add(meetup.id));
|
||||
const live = meetup.mode === "online" || meetup.mode === "hybrid";
|
||||
toast(res.message || t.meetups.rsvpOk, "success", {
|
||||
href: live ? meetupEventHref(meetup) : "/profile",
|
||||
label: live ? t.meetups.liveBtn : t.meetups.rsvpCalCta,
|
||||
});
|
||||
if (live) {
|
||||
toast(res.message || t.meetups.rsvpOk, "success", {
|
||||
href: meetupEventHref(meetup),
|
||||
label: t.meetups.liveBtn,
|
||||
});
|
||||
} else {
|
||||
const ics = buildMeetupIcs([meetup], meetup.title);
|
||||
if (ics) {
|
||||
downloadMeetupIcs(`nomadro-${meetup.id}.ics`, ics);
|
||||
toast(res.message || t.meetups.rsvpOk, "success", {
|
||||
href: "/profile",
|
||||
label: t.meetups.viewRsvps,
|
||||
});
|
||||
} else {
|
||||
toast(res.message || t.meetups.rsvpOk, "success", {
|
||||
href: "/profile",
|
||||
label: t.meetups.viewRsvps,
|
||||
});
|
||||
}
|
||||
}
|
||||
void loadPeers(meetup.id);
|
||||
} catch {
|
||||
toast(t.meetups.rsvpFail, "error");
|
||||
|
||||
@ -422,7 +422,7 @@ export const zh = {
|
||||
matched: "你和",
|
||||
keepSwiping: "继续滑",
|
||||
chatNow: "去聊天",
|
||||
likesTitle: "我喜欢的",
|
||||
likesTitle: "喜欢",
|
||||
likesSubtitle: "你右滑喜欢的游民会出现在这里",
|
||||
likesEmpty: "还没有喜欢任何人,去滑一张卡片吧",
|
||||
backSwipe: "返回匹配",
|
||||
@ -686,6 +686,7 @@ export const zh = {
|
||||
meetPeers: "同城可能认识的人",
|
||||
goDating: "去匹配",
|
||||
rsvpCalCta: "导出日历",
|
||||
viewRsvps: "查看报名",
|
||||
viewProfile: "查看资料",
|
||||
},
|
||||
community: {
|
||||
@ -1696,7 +1697,7 @@ export const en: { [K in keyof typeof zh]: typeof zh[K] extends string ? string
|
||||
matched: "You matched with",
|
||||
keepSwiping: "Keep swiping",
|
||||
chatNow: "Open chat",
|
||||
likesTitle: "People you liked",
|
||||
likesTitle: "Likes",
|
||||
likesSubtitle: "Profiles you swiped right on",
|
||||
likesEmpty: "No likes yet — go swipe some cards",
|
||||
backSwipe: "Back to match",
|
||||
@ -1960,6 +1961,7 @@ export const en: { [K in keyof typeof zh]: typeof zh[K] extends string ? string
|
||||
meetPeers: "People you may meet nearby",
|
||||
goDating: "Go match",
|
||||
rsvpCalCta: "Export calendar",
|
||||
viewRsvps: "View RSVPs",
|
||||
viewProfile: "View profile",
|
||||
},
|
||||
community: {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user