Update theme toggle functionality and UI components

Implemented a new ModeToggle feature for theme switching in personal account dropdown. The changes also made adjustments to several UI components, such as transforming Dialog to AlertDialog in transfer-ownership-dialog, and introducing invitation-submit-button in team-accounts. Some minor amendments include text changes and styling modifications.
This commit is contained in:
giancarlo
2024-03-28 20:29:54 +08:00
parent caca7c12f6
commit f6d1b500da
30 changed files with 1318 additions and 810 deletions

View File

@@ -1,14 +1,17 @@
'use server';
import { revalidatePath } from 'next/cache';
import { redirect } from 'next/navigation';
import { SupabaseClient } from '@supabase/supabase-js';
import { z } from 'zod';
import { Database } from '@kit/supabase/database';
import { requireAuth } from '@kit/supabase/require-auth';
import { getSupabaseServerActionClient } from '@kit/supabase/server-actions-client';
import { AcceptInvitationSchema } from '../../schema/accept-invitation.schema';
import { DeleteInvitationSchema } from '../../schema/delete-invitation.schema';
import { InviteMembersSchema } from '../../schema/invite-members.schema';
import { UpdateInvitationSchema } from '../../schema/update-invitation-schema';
@@ -80,10 +83,32 @@ export async function updateInvitationAction(
return { success: true };
}
async function assertSession(client: SupabaseClient<Database>) {
const { data, error } = await client.auth.getUser();
export async function acceptInvitationAction(data: FormData) {
const client = getSupabaseServerActionClient();
if (error ?? !data.user) {
const { inviteToken, nextPath } = AcceptInvitationSchema.parse(
Object.fromEntries(data),
);
const { user } = await assertSession(client);
const service = new AccountInvitationsService(client);
await service.acceptInvitationToTeam({
adminClient: getSupabaseServerActionClient({ admin: true }),
inviteToken,
userId: user.id,
});
return redirect(nextPath);
}
async function assertSession(client: SupabaseClient<Database>) {
const { error, data } = await requireAuth(client);
if (error) {
throw new Error(`Authentication required`);
}
return data;
}

View File

@@ -6,6 +6,7 @@ import { z } from 'zod';
import { Mailer } from '@kit/mailers';
import { Logger } from '@kit/shared/logger';
import { Database } from '@kit/supabase/database';
import { requireAuth } from '@kit/supabase/require-auth';
import { DeleteInvitationSchema } from '../../schema/delete-invitation.schema';
import { InviteMembersSchema } from '../../schema/invite-members.schema';
@@ -206,8 +207,28 @@ export class AccountInvitationsService {
);
}
/**
* Accepts an invitation to join a team.
*/
async acceptInvitationToTeam(params: {
userId: string;
inviteToken: string;
adminClient: SupabaseClient<Database>;
}) {
const { error, data } = await params.adminClient.rpc('accept_invitation', {
token: params.inviteToken,
user_id: params.userId,
});
if (error) {
throw error;
}
return data;
}
private async getUser() {
const { data, error } = await this.client.auth.getUser();
const { data, error } = await requireAuth(this.client);
if (error ?? !data) {
throw new Error('Authentication required');
@@ -217,6 +238,6 @@ export class AccountInvitationsService {
}
private getInvitationLink(token: string) {
return new URL(env.invitePath, env.siteURL).href + `?token=${token}`;
return new URL(env.siteURL, env.siteURL).href + `?invite_token=${token}`;
}
}