Skip to content

Commit 9da3980

Browse files
authored
Merge pull request #8773 from Couchers-org/na/add-myhome-reminder
Add complete my home reminder
2 parents 2cf9e44 + 8ea2813 commit 9da3980

7 files changed

Lines changed: 113 additions & 34 deletions

File tree

app/backend/src/couchers/servicers/account.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
AccountDeletionToken,
4444
ContributeOption,
4545
ContributorForm,
46+
HostingStatus,
4647
HostRequest,
4748
HostRequestStatus,
4849
InviteCode,
@@ -789,6 +790,9 @@ def GetReminders(
789790
if not has_completed_profile(session, user):
790791
reminders.append(account_pb2.Reminder(complete_profile_reminder=account_pb2.CompleteProfileReminder()))
791792

793+
if user.hosting_status in (HostingStatus.can_host, HostingStatus.maybe) and not user.has_completed_my_home:
794+
reminders.append(account_pb2.Reminder(complete_my_home_reminder=account_pb2.CompleteMyHomeReminder()))
795+
792796
return account_pb2.GetRemindersRes(reminders=reminders)
793797

794798
def GetMyVolunteerInfo(

app/backend/src/tests/test_account.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,10 @@
1515
AccountDeletionReason,
1616
AccountDeletionToken,
1717
BackgroundJob,
18+
HostingStatus,
1819
InviteCode,
1920
PhotoGalleryItem,
21+
SleepingArrangement,
2022
Upload,
2123
User,
2224
)
@@ -1135,6 +1137,38 @@ def test_reminders(db, moderator):
11351137
assert reminders[0].respond_to_host_request_reminder.surfer_user.user_id == req_user1.id
11361138

11371139

1140+
def test_my_home_reminder(db):
1141+
# can_host with incomplete my home (max_guests not set) → reminder shown
1142+
can_host_incomplete, token1 = generate_user(hosting_status=HostingStatus.can_host)
1143+
# maybe with incomplete my home → reminder shown
1144+
maybe_incomplete, token2 = generate_user(hosting_status=HostingStatus.maybe)
1145+
# cant_host → no reminder regardless of my home completion
1146+
cant_host, token3 = generate_user(hosting_status=HostingStatus.cant_host)
1147+
# can_host with fully completed my home → no reminder
1148+
can_host_complete, token4 = generate_user(
1149+
hosting_status=HostingStatus.can_host,
1150+
max_guests=2,
1151+
sleeping_arrangement=SleepingArrangement.private,
1152+
# about_place is set by default in make_user
1153+
)
1154+
1155+
with account_session(token1) as account:
1156+
assert [reminder.WhichOneof("reminder") for reminder in account.GetReminders(empty_pb2.Empty()).reminders] == [
1157+
"complete_my_home_reminder",
1158+
]
1159+
1160+
with account_session(token2) as account:
1161+
assert [reminder.WhichOneof("reminder") for reminder in account.GetReminders(empty_pb2.Empty()).reminders] == [
1162+
"complete_my_home_reminder",
1163+
]
1164+
1165+
with account_session(token3) as account:
1166+
assert [reminder.WhichOneof("reminder") for reminder in account.GetReminders(empty_pb2.Empty()).reminders] == []
1167+
1168+
with account_session(token4) as account:
1169+
assert [reminder.WhichOneof("reminder") for reminder in account.GetReminders(empty_pb2.Empty()).reminders] == []
1170+
1171+
11381172
def test_volunteer_stuff(db):
11391173
# taken from couchers/app/backend/resources/badges.json
11401174
board_member_id = 8347

app/proto/account.proto

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,8 @@ message ListInviteCodesRes {
309309

310310
message CompleteProfileReminder {}
311311

312+
message CompleteMyHomeReminder {}
313+
312314
message CompleteVerificationReminder {}
313315

314316
message RespondToHostRequestReminder {
@@ -328,6 +330,7 @@ message Reminder {
328330
CompleteVerificationReminder complete_verification_reminder = 2;
329331
RespondToHostRequestReminder respond_to_host_request_reminder = 3;
330332
WriteReferenceReminder write_reference_reminder = 4;
333+
CompleteMyHomeReminder complete_my_home_reminder = 5;
331334
}
332335
}
333336

app/web/features/dashboard/ReminderCarousel.tsx

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import { remindersKey } from "../queryKeys";
1717
import ReminderItem from "./ReminderItem";
1818

1919
const CARD_WIDTH_DESKTOP = 280;
20-
const CARD_WIDTH_MOBILE = 240;
20+
const CARD_WIDTH_MOBILE = 200;
2121
const CARD_GAP = 16;
2222

2323
const ONE_WEEK_MS = 7 * 24 * 60 * 60 * 1000;
@@ -37,6 +37,9 @@ function getReminderId(reminder: Reminder.AsObject): string | null {
3737
if (reminder.completeProfileReminder) {
3838
return "complete_profile";
3939
}
40+
if (reminder.completeMyHomeReminder) {
41+
return "complete_my_home";
42+
}
4043
if (reminder.completeVerificationReminder) {
4144
return "complete_verification";
4245
}
@@ -174,7 +177,15 @@ export default function ReminderCarousel() {
174177
<ChevronLeftIcon />
175178
</StyledArrow>
176179

177-
<StyledScroller ref={scrollerRef} onScroll={updateScrollState}>
180+
<StyledScroller
181+
ref={scrollerRef}
182+
onScroll={updateScrollState}
183+
sx={
184+
isMobile && visibleReminders.length === 1
185+
? { justifyContent: "center" }
186+
: undefined
187+
}
188+
>
178189
{visibleReminders.map(({ id, reminder }) => (
179190
<StyledCardSlot key={id}>
180191
<ReminderItem

app/web/features/dashboard/ReminderItem.test.tsx

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,24 @@ describe("ReminderItem", () => {
8080
);
8181
});
8282

83+
it("renders a 'complete my home' card with a link to the home edit tab", () => {
84+
render(<ReminderItem reminder={{ completeMyHomeReminder: {} }} />, {
85+
wrapper,
86+
});
87+
88+
expect(
89+
screen.getByText(t("dashboard:reminder.complete_my_home.title")),
90+
).toBeVisible();
91+
expect(
92+
screen.getByText(t("dashboard:reminder.complete_my_home.description")),
93+
).toBeVisible();
94+
expect(
95+
screen.getByRole("link", {
96+
name: t("dashboard:reminder.complete_my_home.button"),
97+
}),
98+
).toHaveAttribute("href", "/profile/edit/home");
99+
});
100+
83101
it("renders a 'complete profile' card with a link to edit the profile", () => {
84102
render(<ReminderItem reminder={{ completeProfileReminder: {} }} />, {
85103
wrapper,

app/web/features/dashboard/ReminderItem.tsx

Lines changed: 36 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,11 @@ export default function ReminderItem({
5757
otherUser.userId,
5858
hostRequestId,
5959
);
60+
} else if (reminder.completeMyHomeReminder) {
61+
title = t("reminder.complete_my_home.title");
62+
description = t("reminder.complete_my_home.description");
63+
buttonText = t("reminder.complete_my_home.button");
64+
href = routeToEditProfile("home");
6065
} else if (reminder.completeProfileReminder) {
6166
title = t("reminder.complete_profile.title");
6267
description = t("reminder.complete_profile.description");
@@ -74,50 +79,49 @@ export default function ReminderItem({
7479
return (
7580
<Box
7681
sx={(theme) => ({
77-
position: "relative",
7882
backgroundColor: alpha(theme.palette.secondary.main, 0.08),
79-
padding: isMobile ? "20px" : "24px",
83+
padding: isMobile ? "14px" : "24px",
8084
display: "flex",
8185
flexDirection: "column",
8286
height: "100%",
8387
})}
8488
>
85-
{onDismiss && (
86-
<IconButton
87-
aria-label={t("reminder.carousel_dismiss_button_a11y")}
88-
onClick={onDismiss}
89-
size="small"
90-
sx={(theme) => ({
91-
position: "absolute",
92-
top: theme.spacing(1),
93-
right: theme.spacing(1),
94-
})}
95-
>
96-
<CloseIcon />
97-
</IconButton>
98-
)}
99-
100-
<Box sx={{ flexGrow: 1 }}>
89+
<Box
90+
sx={{
91+
display: "flex",
92+
justifyContent: "space-between",
93+
alignItems: "flex-start",
94+
marginBottom: isMobile ? "8px" : "16px",
95+
}}
96+
>
10197
<Typography
102-
variant="h3"
103-
sx={{
104-
fontWeight: 800,
105-
marginBottom: isMobile ? "12px" : "16px",
106-
}}
98+
variant={isMobile ? "h4" : "h3"}
99+
sx={{ fontWeight: 800, flexGrow: 1 }}
107100
>
108101
{title}
109102
</Typography>
110-
111-
<Typography
112-
sx={{
113-
marginBottom: isMobile ? "14px" : "18px",
114-
fontSize: ".85rem",
115-
}}
116-
>
117-
{description}
118-
</Typography>
103+
{onDismiss && (
104+
<IconButton
105+
aria-label={t("reminder.carousel_dismiss_button_a11y")}
106+
onClick={onDismiss}
107+
size="small"
108+
sx={{ marginTop: "-4px", marginRight: "-4px", flexShrink: 0 }}
109+
>
110+
<CloseIcon />
111+
</IconButton>
112+
)}
119113
</Box>
120114

115+
<Typography
116+
sx={{
117+
flexGrow: 1,
118+
marginBottom: isMobile ? "10px" : "18px",
119+
fontSize: isMobile ? ".75rem" : ".85rem",
120+
}}
121+
>
122+
{description}
123+
</Typography>
124+
121125
<Button
122126
component={Link}
123127
href={href}

app/web/features/dashboard/locales/en.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,11 @@
8585
"description_hosted": "Leave a reference for {{name}}'s stay",
8686
"button": "Write reference"
8787
},
88+
"complete_my_home": {
89+
"title": "Complete your profile \"My Home\" section",
90+
"description": "Fill in your sleeping arrangements, house rules, and a description of your place",
91+
"button": "Edit your home"
92+
},
8893
"complete_profile": {
8994
"title": "Complete your profile",
9095
"description": "Fill in your \"Who I Am\" section and upload a profile photo",

0 commit comments

Comments
 (0)