feat(MED-111): update navigation links and adjust invitation handling
This commit is contained in:
@@ -22,10 +22,6 @@ const links = {
|
||||
label: 'marketing:documentation',
|
||||
path: '/docs',
|
||||
},
|
||||
Pricing: {
|
||||
label: 'marketing:pricing',
|
||||
path: '/pricing',
|
||||
},
|
||||
FAQ: {
|
||||
label: 'marketing:faq',
|
||||
path: '/faq',
|
||||
|
||||
@@ -25,7 +25,7 @@ const MembershipConfirmationNotification: React.FC<{
|
||||
descriptionKey="account:membershipConfirmation:successDescription"
|
||||
buttonProps={{
|
||||
buttonTitleKey: 'account:membershipConfirmation:successButton',
|
||||
href: pathsConfig.app.selectPackage,
|
||||
href: pathsConfig.app.home,
|
||||
}}
|
||||
/>
|
||||
);
|
||||
|
||||
@@ -8,7 +8,7 @@ import { withI18n } from '~/lib/i18n/with-i18n';
|
||||
|
||||
import MembershipConfirmationNotification from './_components/membership-confirmation-notification';
|
||||
|
||||
async function UpdateAccountSuccess() {
|
||||
async function MembershipConfirmation() {
|
||||
const client = getSupabaseServerClient();
|
||||
|
||||
const {
|
||||
@@ -22,4 +22,4 @@ async function UpdateAccountSuccess() {
|
||||
return <MembershipConfirmationNotification userId={user.id} />;
|
||||
}
|
||||
|
||||
export default withI18n(UpdateAccountSuccess);
|
||||
export default withI18n(MembershipConfirmation);
|
||||
|
||||
@@ -108,7 +108,7 @@ async function JoinTeamAccountPage(props: JoinTeamAccountPageProps) {
|
||||
const signOutNext = `${pathsConfig.auth.signIn}?invite_token=${token}`;
|
||||
|
||||
// once the user accepts the invitation, we redirect them to the account home page
|
||||
const accountHome = pathsConfig.app.home;
|
||||
const membershipConfirmation = pathsConfig.auth.membershipConfirmation;
|
||||
|
||||
const email = auth.data.email ?? '';
|
||||
|
||||
@@ -120,7 +120,7 @@ async function JoinTeamAccountPage(props: JoinTeamAccountPageProps) {
|
||||
invitation={invitation}
|
||||
paths={{
|
||||
signOutNext,
|
||||
accountHome,
|
||||
membershipConfirmation,
|
||||
}}
|
||||
/>
|
||||
</AuthLayoutShell>
|
||||
|
||||
@@ -30,7 +30,6 @@ function getPaths() {
|
||||
'/faq',
|
||||
'/blog',
|
||||
'/docs',
|
||||
'/pricing',
|
||||
'/contact',
|
||||
'/cookie-policy',
|
||||
'/terms-of-service',
|
||||
|
||||
@@ -222,12 +222,13 @@ export function NotificationsPopover(params: {
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className={'py-2'}>
|
||||
<div className="py-2">
|
||||
<Button
|
||||
className={'max-h-6 max-w-6'}
|
||||
size={'icon'}
|
||||
variant={'ghost'}
|
||||
className="max-h-6 max-w-6"
|
||||
size="icon"
|
||||
variant="ghost"
|
||||
onClick={() => {
|
||||
console.log('test');
|
||||
setNotifications((existing) => {
|
||||
return existing.filter(
|
||||
(existingNotification) =>
|
||||
@@ -238,7 +239,7 @@ export function NotificationsPopover(params: {
|
||||
return dismissNotification(notification.id);
|
||||
}}
|
||||
>
|
||||
<XIcon className={'h-3'} />
|
||||
<XIcon className="h-3" />
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import Image from 'next/image';
|
||||
|
||||
import { useDismissNotification } from '@kit/notifications/hooks';
|
||||
import { Heading } from '@kit/ui/heading';
|
||||
import { If } from '@kit/ui/if';
|
||||
import { Separator } from '@kit/ui/separator';
|
||||
@@ -25,7 +26,7 @@ export function AcceptInvitationContainer(props: {
|
||||
|
||||
paths: {
|
||||
signOutNext: string;
|
||||
accountHome: string;
|
||||
membershipConfirmation: string;
|
||||
};
|
||||
}) {
|
||||
return (
|
||||
@@ -42,36 +43,36 @@ export function AcceptInvitationContainer(props: {
|
||||
<If condition={props.invitation.account.picture_url}>
|
||||
{(url) => (
|
||||
<Image
|
||||
alt={`Logo`}
|
||||
alt="Logo"
|
||||
src={url}
|
||||
width={64}
|
||||
height={64}
|
||||
className={'object-cover'}
|
||||
className="object-cover"
|
||||
/>
|
||||
)}
|
||||
</If>
|
||||
|
||||
<div className={'text-muted-foreground text-center text-sm'}>
|
||||
<div className="text-muted-foreground text-center text-sm">
|
||||
<Trans
|
||||
i18nKey={'teams:acceptInvitationDescription'}
|
||||
i18nKey="teams:acceptInvitationDescription"
|
||||
values={{
|
||||
accountName: props.invitation.account.name,
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className={'flex flex-col space-y-4'}>
|
||||
<div className="flex flex-col space-y-4">
|
||||
<form
|
||||
data-test={'join-team-form'}
|
||||
className={'w-full'}
|
||||
data-test="join-team-form"
|
||||
className="w-full"
|
||||
action={acceptInvitationAction}
|
||||
>
|
||||
<input type="hidden" name={'inviteToken'} value={props.inviteToken} />
|
||||
<input type="hidden" name="inviteToken" value={props.inviteToken} />
|
||||
|
||||
<input
|
||||
type={'hidden'}
|
||||
name={'nextPath'}
|
||||
value={props.paths.accountHome}
|
||||
type="hidden"
|
||||
name="nextPath"
|
||||
value={props.paths.membershipConfirmation}
|
||||
/>
|
||||
|
||||
<InvitationSubmitButton
|
||||
@@ -84,8 +85,8 @@ export function AcceptInvitationContainer(props: {
|
||||
|
||||
<SignOutInvitationButton nextPath={props.paths.signOutNext} />
|
||||
|
||||
<span className={'text-muted-foreground text-center text-xs'}>
|
||||
<Trans i18nKey={'teams:signInWithDifferentAccountDescription'} />
|
||||
<span className="text-muted-foreground text-center text-xs">
|
||||
<Trans i18nKey="teams:signInWithDifferentAccountDescription" />
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
drop function if exists medreport.add_invitations_to_account(text, medreport.invitation[]);
|
||||
drop function if exists medreport.add_invitations_to_account(text, invitation[]);
|
||||
|
||||
drop type if exists medreport.invitation;
|
||||
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
grant
|
||||
execute on function medreport.accept_invitation (text, uuid) to service_role;
|
||||
|
||||
|
||||
CREATE OR REPLACE FUNCTION medreport.accept_invitation(token text, user_id uuid)
|
||||
RETURNS uuid
|
||||
LANGUAGE plpgsql
|
||||
SET search_path TO ''
|
||||
AS $function$declare
|
||||
target_account_id uuid;
|
||||
target_role varchar(50);
|
||||
begin
|
||||
select
|
||||
account_id,
|
||||
role into target_account_id,
|
||||
target_role
|
||||
from
|
||||
medreport.invitations
|
||||
where
|
||||
invite_token = token
|
||||
and expires_at > now();
|
||||
|
||||
if not found then
|
||||
raise exception 'Invalid or expired invitation token';
|
||||
end if;
|
||||
|
||||
insert into medreport.accounts_memberships(
|
||||
user_id,
|
||||
account_id,
|
||||
account_role)
|
||||
values (
|
||||
accept_invitation.user_id,
|
||||
target_account_id,
|
||||
target_role);
|
||||
|
||||
delete from medreport.invitations
|
||||
where invite_token = token;
|
||||
|
||||
update medreport.notifications
|
||||
set dismissed = true
|
||||
where link ilike '%' || token || '%';
|
||||
|
||||
return target_account_id;
|
||||
end;$function$
|
||||
;
|
||||
@@ -1,4 +1,4 @@
|
||||
-- Create analysis for /home/analysis-results
|
||||
-- CREATE NEW ANALYSIS START
|
||||
INSERT INTO medreport.analysis_groups (
|
||||
id,
|
||||
original_id,
|
||||
@@ -68,10 +68,10 @@ VALUES (
|
||||
1 -- parent_analysis_element_id
|
||||
);
|
||||
|
||||
-- CREATE NEW ANALYSIS END
|
||||
|
||||
|
||||
|
||||
|
||||
-- CREATE NEW ANALYSIS RESPONSE START
|
||||
|
||||
INSERT INTO medreport.analysis_orders (
|
||||
analysis_element_ids,
|
||||
@@ -101,12 +101,6 @@ VALUES (
|
||||
'COMPLETED',
|
||||
'8dcb4354-77be-4915-a2cd-8fc573e675d6'
|
||||
)
|
||||
ON CONFLICT (order_number)
|
||||
DO UPDATE SET
|
||||
analysis_order_id = EXCLUDED.analysis_order_id,
|
||||
order_status = EXCLUDED.order_status,
|
||||
user_id = EXCLUDED.user_id
|
||||
RETURNING id;
|
||||
|
||||
INSERT INTO medreport.analysis_response_elements (
|
||||
id,
|
||||
@@ -144,3 +138,5 @@ VALUES
|
||||
NOW(),
|
||||
'Hematokrit'
|
||||
);
|
||||
|
||||
-- CREATE NEW ANALYSIS RESPONSE END
|
||||
Reference in New Issue
Block a user