Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
653 changes: 253 additions & 400 deletions packages/web/src/actions.ts

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion packages/web/src/app/[domain]/chat/[id]/page.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -104,7 +104,7 @@ export default async function Page(props: PageProps) {

const languageModels = await getConfiguredLanguageModelsInfo();
const repos = await getRepos();
const searchContexts = await getSearchContexts(params.domain);
const searchContexts = await getSearchContexts();
const chatInfo = await getChatInfo({ chatId: params.id });
const chatHistory = session ? await getUserChatHistory() : [];

Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/app/[domain]/chat/page.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -27,7 +27,7 @@ interface PageProps {
export default async function Page(props: PageProps) {
const params = await props.params;
const languageModels = await getConfiguredLanguageModelsInfo();
const searchContexts = await getSearchContexts(params.domain);
const searchContexts = await getSearchContexts();
const allRepos = await getRepos();
const session = await auth();
const chatHistory = session ? await getUserChatHistory() : [];
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -33,7 +33,7 @@ export const NavigationMenu = async ({
throw new ServiceErrorException(repoStats);
}

const role = isAuthenticated ? await getCurrentUserRole(domain) : null;
const role = isAuthenticated ? await getCurrentUserRole() : null;
if (isServiceError(role)) {
throw new ServiceErrorException(role);
}
Expand All@@ -43,7 +43,7 @@ export const NavigationMenu = async ({
return null;
}

const joinRequests = await getOrgAccountRequests(domain);
const joinRequests = await getOrgAccountRequests();
if (isServiceError(joinRequests)) {
throw new ServiceErrorException(joinRequests);
}
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -107,7 +107,7 @@ export const useSuggestionsData = ({

const { data: searchContextSuggestions, isLoading: _isLoadingSearchContexts } = useQuery({
queryKey: ["searchContexts", domain],
queryFn: () => getSearchContexts(domain),
queryFn: () => getSearchContexts(),
select: (data): Suggestion[] => {
if (isServiceError(data)) {
return [];
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/app/[domain]/repos/[id]/page.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -52,7 +52,7 @@ export default async function RepoDetailPage({ params }: { params: Promise<{ id:

const repoMetadata = repoMetadataSchema.parse(repo.metadata);

const userRole = await getCurrentUserRole(SINGLE_TENANT_ORG_DOMAIN);
const userRole = await getCurrentUserRole();
if (isServiceError(userRole)) {
throw new ServiceErrorException(userRole);
}
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/app/[domain]/repos/layout.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -24,7 +24,7 @@ export default async function Layout(
throw new ServiceErrorException(repoStats);
}

const userRoleInOrg = await getCurrentUserRole(domain);
const userRoleInOrg = await getCurrentUserRole();

return (
<div className="min-h-screen flex flex-col">
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,7 +7,6 @@ import { Input } from "@/components/ui/input";
import { isServiceError } from "@/lib/utils";
import { Copy, Check, AlertTriangle, Loader2, Plus } from "lucide-react";
import { useCallback, useEffect, useMemo, useState } from "react";
import { useDomain } from "@/hooks/useDomain";
import { useToast } from "@/components/hooks/use-toast";
import useCaptureEvent from "@/hooks/useCaptureEvent";
import { DataTable } from "@/components/ui/data-table";
Expand All@@ -16,7 +15,6 @@ import { Skeleton } from "@/components/ui/skeleton";
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip";

export function ApiKeysPage({ canCreateApiKey }: { canCreateApiKey: boolean }) {
const domain = useDomain();
const { toast } = useToast();
const captureEvent = useCaptureEvent();

Expand All@@ -33,7 +31,7 @@ export function ApiKeysPage({ canCreateApiKey }: { canCreateApiKey: boolean }) {
setIsLoading(true);
setError(null);
try {
const keys = await getUserApiKeys(domain);
const keys = await getUserApiKeys();
if (isServiceError(keys)) {
setError("Failed to load API keys");
toast({
Expand All@@ -55,7 +53,7 @@ export function ApiKeysPage({ canCreateApiKey }: { canCreateApiKey: boolean }) {
} finally {
setIsLoading(false);
}
}, [domain, toast]);
}, [toast]);

useEffect(() => {
loadApiKeys();
Expand All@@ -73,7 +71,7 @@ export function ApiKeysPage({ canCreateApiKey }: { canCreateApiKey: boolean }) {

setIsCreatingKey(true);
try {
const result = await createApiKey(newKeyName.trim(), domain);
const result = await createApiKey(newKeyName.trim());
if (isServiceError(result)) {
toast({
title: "Error",
Expand Down
4 changes: 1 addition & 3 deletions packages/web/src/app/[domain]/settings/apiKeys/columns.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,7 +4,6 @@ import { ColumnDef } from "@tanstack/react-table"
import { ArrowUpDown, Key, Trash2 } from "lucide-react"
import { Button } from "@/components/ui/button"
import { deleteApiKey } from "@/actions"
import { useParams } from "next/navigation"
import {
AlertDialog,
AlertDialogAction,
Expand All@@ -27,14 +26,13 @@ export type ApiKeyColumnInfo = {

// Component for the actions cell to properly use React hooks
function ApiKeyActions({ apiKey }: { apiKey: ApiKeyColumnInfo }) {
const params = useParams<{ domain: string }>()
const [isPending, setIsPending] = useState(false)
const { toast } = useToast()

const handleDelete = async () => {
setIsPending(true)
try {
await deleteApiKey(apiKey.name, params.domain)
await deleteApiKey(apiKey.name)
window.location.reload()
} catch (error) {
console.error("Failed to delete API key", error)
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/app/[domain]/settings/layout.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -70,7 +70,7 @@ export const getSidebarNavItems = async () =>
withAuthV2(async ({ role }) => {
let numJoinRequests: number | undefined;
if (role === OrgRole.OWNER) {
const requests = await getOrgAccountRequests(SINGLE_TENANT_ORG_DOMAIN);
const requests = await getOrgAccountRequests();
if (isServiceError(requests)) {
throw new ServiceErrorException(requests);
}
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/app/[domain]/settings/license/page.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -75,7 +75,7 @@ export default async function LicensePage(props: LicensePageProps) {
)
}

const members = await getOrgMembers(domain);
const members = await getOrgMembers();
if (isServiceError(members)) {
throw new ServiceErrorException(members);
}
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -12,7 +12,6 @@ import { PlusCircleIcon, Loader2, AlertCircle } from "lucide-react";
import { OrgRole } from "@prisma/client";
import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle } from "@/components/ui/alert-dialog";
import { createInvites } from "@/actions";
import { useDomain } from "@/hooks/useDomain";
import { isServiceError } from "@/lib/utils";
import { useToast } from "@/components/hooks/use-toast";
import { useRouter } from "next/navigation";
Expand All@@ -35,8 +34,7 @@ interface InviteMemberCardProps {
export const InviteMemberCard = ({ currentUserRole, seatsAvailable = true }: InviteMemberCardProps) => {
const [isInviteDialogOpen, setIsInviteDialogOpen] = useState(false);
const [isLoading, setIsLoading] = useState(false);
const domain = useDomain();
const { toast } = useToast();
const { toast } = useToast();
const router = useRouter();
const captureEvent = useCaptureEvent();

Expand All@@ -54,7 +52,7 @@ export const InviteMemberCard = ({ currentUserRole, seatsAvailable = true }: Inv

const onSubmit = useCallback((data: z.infer<typeof inviteMemberFormSchema>) => {
setIsLoading(true);
createInvites(data.emails.map(e => e.email), domain)
createInvites(data.emails.map(e => e.email))
.then((res) => {
if (isServiceError(res)) {
toast({
Expand All@@ -78,7 +76,7 @@ export const InviteMemberCard = ({ currentUserRole, seatsAvailable = true }: Inv
.finally(() => {
setIsLoading(false);
});
}, [domain, form, toast, router, captureEvent]);
}, [form, toast, router, captureEvent]);

const isDisabled = !seatsAvailable || currentUserRole !== OrgRole.OWNER || isLoading;

Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,7 +14,6 @@ import { Copy, MoreVertical, Search } from "lucide-react";
import { useCallback, useMemo, useState } from "react";
import { cancelInvite } from "@/actions";
import { useRouter } from "next/navigation";
import { useDomain } from "@/hooks/useDomain";
import useCaptureEvent from "@/hooks/useCaptureEvent";
interface Invite {
id: string;
Expand All@@ -34,7 +33,6 @@ export const InvitesList = ({ invites, currentUserRole }: InviteListProps) => {
const [inviteToCancel, setInviteToCancel] = useState<Invite | null>(null)
const { toast } = useToast();
const router = useRouter();
const domain = useDomain();
const captureEvent = useCaptureEvent();

const filteredInvites = useMemo(() => {
Expand All@@ -53,7 +51,7 @@ export const InvitesList = ({ invites, currentUserRole }: InviteListProps) => {
}, [invites, searchQuery, dateSort]);

const onCancelInvite = useCallback((inviteId: string) => {
cancelInvite(inviteId, domain)
cancelInvite(inviteId)
.then((response) => {
if (isServiceError(response)) {
toast({
Expand All@@ -70,7 +68,7 @@ export const InvitesList = ({ invites, currentUserRole }: InviteListProps) => {
router.refresh();
}
});
}, [domain, toast, router, captureEvent]);
}, [toast, router, captureEvent]);

return (
<div className="w-full mx-auto space-y-6">
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,7 +13,6 @@ import { CheckCircle, Search, XCircle } from "lucide-react";
import { useCallback, useMemo, useState } from "react";
import { approveAccountRequest, rejectAccountRequest } from "@/actions";
import { useRouter } from "next/navigation";
import { useDomain } from "@/hooks/useDomain";
import useCaptureEvent from "@/hooks/useCaptureEvent";

interface Request {
Expand All@@ -36,7 +35,6 @@ export const RequestsList = ({ requests, currentUserRole }: RequestsListProps) =
const [requestToAction, setRequestToAction] = useState<Request | null>(null)
const { toast } = useToast();
const router = useRouter();
const domain = useDomain();
const captureEvent = useCaptureEvent();

const filteredRequests = useMemo(() => {
Expand All@@ -56,7 +54,7 @@ export const RequestsList = ({ requests, currentUserRole }: RequestsListProps) =
}, [requests, searchQuery, dateSort]);

const onApproveRequest = useCallback((requestId: string) => {
approveAccountRequest(requestId, domain)
approveAccountRequest(requestId)
.then((response) => {
if (isServiceError(response)) {
toast({
Expand All@@ -73,10 +71,10 @@ export const RequestsList = ({ requests, currentUserRole }: RequestsListProps) =
router.refresh();
}
});
}, [domain, toast, router, captureEvent]);
}, [toast, router, captureEvent]);

const onRejectRequest = useCallback((requestId: string) => {
rejectAccountRequest(requestId, domain)
rejectAccountRequest(requestId)
.then((response) => {
if (isServiceError(response)) {
toast({
Expand All@@ -93,7 +91,7 @@ export const RequestsList = ({ requests, currentUserRole }: RequestsListProps) =
router.refresh();
}
});
}, [domain, toast, router, captureEvent]);
}, [toast, router, captureEvent]);

return (
<div className="w-full mx-auto space-y-6">
Expand Down
6 changes: 3 additions & 3 deletions packages/web/src/app/[domain]/settings/members/page.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -56,17 +56,17 @@ export default async function MembersSettingsPage(props: MembersSettingsPageProp
redirect(`/${domain}/settings`);
}

const members = await getOrgMembers(domain);
const members = await getOrgMembers();
if (isServiceError(members)) {
throw new ServiceErrorException(members);
}

const invites = await getOrgInvites(domain);
const invites = await getOrgInvites();
if (isServiceError(invites)) {
throw new ServiceErrorException(invites);
}

const requests = await getOrgAccountRequests(domain);
const requests = await getOrgAccountRequests();
if (isServiceError(requests)) {
throw new ServiceErrorException(requests);
}
Expand Down
3 changes: 1 addition & 2 deletions packages/web/src/app/components/anonymousAccessToggle.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,7 +3,6 @@
import { useState } from "react"
import { Switch } from "@/components/ui/switch"
import { setAnonymousAccessStatus } from "@/actions"
import { SINGLE_TENANT_ORG_DOMAIN } from "@/lib/constants"
import { isServiceError } from "@/lib/utils"
import { useToast } from "@/components/hooks/use-toast"

Expand All@@ -22,7 +21,7 @@ export function AnonymousAccessToggle({ hasAnonymousAccessEntitlement, anonymous
const handleToggle = async (checked: boolean) => {
setIsLoading(true)
try {
const result = await setAnonymousAccessStatus(SINGLE_TENANT_ORG_DOMAIN, checked)
const result = await setAnonymousAccessStatus(checked)

if (isServiceError(result)) {
toast({
Expand Down
3 changes: 1 addition & 2 deletions packages/web/src/app/components/inviteLinkToggle.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,7 +6,6 @@ import { Input } from "@/components/ui/input"
import { Switch } from "@/components/ui/switch"
import { Copy, Check } from "lucide-react"
import { useToast } from "@/components/hooks/use-toast"
import { SINGLE_TENANT_ORG_DOMAIN } from "@/lib/constants"
import { setInviteLinkEnabled } from "@/actions"
import { isServiceError } from "@/lib/utils"

Expand All@@ -25,7 +24,7 @@ export function InviteLinkToggle({ inviteLinkEnabled, inviteLink }: InviteLinkTo
const handleToggle = async (checked: boolean) => {
setIsLoading(true)
try {
const result = await setInviteLinkEnabled(SINGLE_TENANT_ORG_DOMAIN, checked)
const result = await setInviteLinkEnabled(checked)

if (isServiceError(result)) {
toast({
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,7 +3,6 @@
import { useState } from "react"
import { Switch } from "@/components/ui/switch"
import { setMemberApprovalRequired } from "@/actions"
import { SINGLE_TENANT_ORG_DOMAIN } from "@/lib/constants"
import { isServiceError } from "@/lib/utils"
import { useToast } from "@/components/hooks/use-toast"

Expand All@@ -21,7 +20,7 @@ export function MemberApprovalRequiredToggle({ memberApprovalRequired, onToggleC
const handleToggle = async (checked: boolean) => {
setIsLoading(true)
try {
const result = await setMemberApprovalRequired(SINGLE_TENANT_ORG_DOMAIN, checked)
const result = await setMemberApprovalRequired(checked)

if (isServiceError(result)) {
toast({
Expand Down
9 changes: 4 additions & 5 deletions packages/web/src/app/invite/actions.ts
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,21 @@
"use server";

import { withAuth } from "@/actions";
import { isServiceError } from "@/lib/utils";
import { orgNotFound, ServiceError } from "@/lib/serviceError";
import { sew } from "@/actions";
import { addUserToOrganization } from "@/lib/authUtils";
import { prisma } from "@/prisma";
import { withAuthV2_skipOrgMembershipCheck } from "@/withAuthV2";
import { StatusCodes } from "http-status-codes";
import { ErrorCode } from "@/lib/errorCodes";

export const joinOrganization = async (orgId: number, inviteLinkId?: string) => sew(async () =>
withAuth(async (userId) => {
withAuthV2_skipOrgMembershipCheck(async ({ user, prisma }) => {
const org = await prisma.org.findUnique({
where: {
id: orgId,
},
});
Comment thread
coderabbitai[bot] marked this conversation as resolved.

if (!org) {
return orgNotFound();
}
Expand All@@ -40,7 +39,7 @@ export const joinOrganization = async (orgId: number, inviteLinkId?: string) =>
}
}

const addUserToOrgRes = await addUserToOrganization(userId, org.id);
const addUserToOrgRes = await addUserToOrganization(user.id, org.id);
if (isServiceError(addUserToOrgRes)) {
return addUserToOrgRes;
}
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,7 +4,6 @@ import { useState } from "react"
import { useRouter } from "next/navigation"
import { Button } from "@/components/ui/button"
import { completeOnboarding } from "@/actions"
import { SINGLE_TENANT_ORG_DOMAIN } from "@/lib/constants"
import { isServiceError } from "@/lib/utils"
import { useToast } from "@/components/hooks/use-toast"

Expand All@@ -17,7 +16,7 @@ export function CompleteOnboardingButton() {
setIsLoading(true)

try {
const result = await completeOnboarding(SINGLE_TENANT_ORG_DOMAIN)
const result = await completeOnboarding()

if (isServiceError(result)) {
toast({
Expand Down
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
653 changes: 253 additions & 400 deletions packages/web/src/actions.ts

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion packages/web/src/app/[domain]/chat/[id]/page.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -104,7 +104,7 @@ export default async function Page(props: PageProps) {

const languageModels = await getConfiguredLanguageModelsInfo();
const repos = await getRepos();
const searchContexts = await getSearchContexts(params.domain);
const searchContexts = await getSearchContexts();
const chatInfo = await getChatInfo({ chatId: params.id });
const chatHistory = session ? await getUserChatHistory() : [];

Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/app/[domain]/chat/page.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -27,7 +27,7 @@ interface PageProps {
export default async function Page(props: PageProps) {
const params = await props.params;
const languageModels = await getConfiguredLanguageModelsInfo();
const searchContexts = await getSearchContexts(params.domain);
const searchContexts = await getSearchContexts();
const allRepos = await getRepos();
const session = await auth();
const chatHistory = session ? await getUserChatHistory() : [];
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -33,7 +33,7 @@ export const NavigationMenu = async ({
throw new ServiceErrorException(repoStats);
}

const role = isAuthenticated ? await getCurrentUserRole(domain) : null;
const role = isAuthenticated ? await getCurrentUserRole() : null;
if (isServiceError(role)) {
throw new ServiceErrorException(role);
}
Expand All@@ -43,7 +43,7 @@ export const NavigationMenu = async ({
return null;
}

const joinRequests = await getOrgAccountRequests(domain);
const joinRequests = await getOrgAccountRequests();
if (isServiceError(joinRequests)) {
throw new ServiceErrorException(joinRequests);
}
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -107,7 +107,7 @@ export const useSuggestionsData = ({

const { data: searchContextSuggestions, isLoading: _isLoadingSearchContexts } = useQuery({
queryKey: ["searchContexts", domain],
queryFn: () => getSearchContexts(domain),
queryFn: () => getSearchContexts(),
select: (data): Suggestion[] => {
if (isServiceError(data)) {
return [];
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/app/[domain]/repos/[id]/page.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -52,7 +52,7 @@ export default async function RepoDetailPage({ params }: { params: Promise<{ id:

const repoMetadata = repoMetadataSchema.parse(repo.metadata);

const userRole = await getCurrentUserRole(SINGLE_TENANT_ORG_DOMAIN);
const userRole = await getCurrentUserRole();
if (isServiceError(userRole)) {
throw new ServiceErrorException(userRole);
}
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/app/[domain]/repos/layout.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -24,7 +24,7 @@ export default async function Layout(
throw new ServiceErrorException(repoStats);
}

const userRoleInOrg = await getCurrentUserRole(domain);
const userRoleInOrg = await getCurrentUserRole();

return (
<div className="min-h-screen flex flex-col">
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,7 +7,6 @@ import { Input } from "@/components/ui/input";
import { isServiceError } from "@/lib/utils";
import { Copy, Check, AlertTriangle, Loader2, Plus } from "lucide-react";
import { useCallback, useEffect, useMemo, useState } from "react";
import { useDomain } from "@/hooks/useDomain";
import { useToast } from "@/components/hooks/use-toast";
import useCaptureEvent from "@/hooks/useCaptureEvent";
import { DataTable } from "@/components/ui/data-table";
Expand All@@ -16,7 +15,6 @@ import { Skeleton } from "@/components/ui/skeleton";
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip";

export function ApiKeysPage({ canCreateApiKey }: { canCreateApiKey: boolean }) {
const domain = useDomain();
const { toast } = useToast();
const captureEvent = useCaptureEvent();

Expand All@@ -33,7 +31,7 @@ export function ApiKeysPage({ canCreateApiKey }: { canCreateApiKey: boolean }) {
setIsLoading(true);
setError(null);
try {
const keys = await getUserApiKeys(domain);
const keys = await getUserApiKeys();
if (isServiceError(keys)) {
setError("Failed to load API keys");
toast({
Expand All@@ -55,7 +53,7 @@ export function ApiKeysPage({ canCreateApiKey }: { canCreateApiKey: boolean }) {
} finally {
setIsLoading(false);
}
}, [domain, toast]);
}, [toast]);

useEffect(() => {
loadApiKeys();
Expand All@@ -73,7 +71,7 @@ export function ApiKeysPage({ canCreateApiKey }: { canCreateApiKey: boolean }) {

setIsCreatingKey(true);
try {
const result = await createApiKey(newKeyName.trim(), domain);
const result = await createApiKey(newKeyName.trim());
if (isServiceError(result)) {
toast({
title: "Error",
Expand Down
4 changes: 1 addition & 3 deletions packages/web/src/app/[domain]/settings/apiKeys/columns.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,7 +4,6 @@ import { ColumnDef } from "@tanstack/react-table"
import { ArrowUpDown, Key, Trash2 } from "lucide-react"
import { Button } from "@/components/ui/button"
import { deleteApiKey } from "@/actions"
import { useParams } from "next/navigation"
import {
AlertDialog,
AlertDialogAction,
Expand All@@ -27,14 +26,13 @@ export type ApiKeyColumnInfo = {

// Component for the actions cell to properly use React hooks
function ApiKeyActions({ apiKey }: { apiKey: ApiKeyColumnInfo }) {
const params = useParams<{ domain: string }>()
const [isPending, setIsPending] = useState(false)
const { toast } = useToast()

const handleDelete = async () => {
setIsPending(true)
try {
await deleteApiKey(apiKey.name, params.domain)
await deleteApiKey(apiKey.name)
window.location.reload()
} catch (error) {
console.error("Failed to delete API key", error)
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/app/[domain]/settings/layout.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -70,7 +70,7 @@ export const getSidebarNavItems = async () =>
withAuthV2(async ({ role }) => {
let numJoinRequests: number | undefined;
if (role === OrgRole.OWNER) {
const requests = await getOrgAccountRequests(SINGLE_TENANT_ORG_DOMAIN);
const requests = await getOrgAccountRequests();
if (isServiceError(requests)) {
throw new ServiceErrorException(requests);
}
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/app/[domain]/settings/license/page.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -75,7 +75,7 @@ export default async function LicensePage(props: LicensePageProps) {
)
}

const members = await getOrgMembers(domain);
const members = await getOrgMembers();
if (isServiceError(members)) {
throw new ServiceErrorException(members);
}
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -12,7 +12,6 @@ import { PlusCircleIcon, Loader2, AlertCircle } from "lucide-react";
import { OrgRole } from "@prisma/client";
import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle } from "@/components/ui/alert-dialog";
import { createInvites } from "@/actions";
import { useDomain } from "@/hooks/useDomain";
import { isServiceError } from "@/lib/utils";
import { useToast } from "@/components/hooks/use-toast";
import { useRouter } from "next/navigation";
Expand All@@ -35,8 +34,7 @@ interface InviteMemberCardProps {
export const InviteMemberCard = ({ currentUserRole, seatsAvailable = true }: InviteMemberCardProps) => {
const [isInviteDialogOpen, setIsInviteDialogOpen] = useState(false);
const [isLoading, setIsLoading] = useState(false);
const domain = useDomain();
const { toast } = useToast();
const { toast } = useToast();
const router = useRouter();
const captureEvent = useCaptureEvent();

Expand All@@ -54,7 +52,7 @@ export const InviteMemberCard = ({ currentUserRole, seatsAvailable = true }: Inv

const onSubmit = useCallback((data: z.infer<typeof inviteMemberFormSchema>) => {
setIsLoading(true);
createInvites(data.emails.map(e => e.email), domain)
createInvites(data.emails.map(e => e.email))
.then((res) => {
if (isServiceError(res)) {
toast({
Expand All@@ -78,7 +76,7 @@ export const InviteMemberCard = ({ currentUserRole, seatsAvailable = true }: Inv
.finally(() => {
setIsLoading(false);
});
}, [domain, form, toast, router, captureEvent]);
}, [form, toast, router, captureEvent]);

const isDisabled = !seatsAvailable || currentUserRole !== OrgRole.OWNER || isLoading;

Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,7 +14,6 @@ import { Copy, MoreVertical, Search } from "lucide-react";
import { useCallback, useMemo, useState } from "react";
import { cancelInvite } from "@/actions";
import { useRouter } from "next/navigation";
import { useDomain } from "@/hooks/useDomain";
import useCaptureEvent from "@/hooks/useCaptureEvent";
interface Invite {
id: string;
Expand All@@ -34,7 +33,6 @@ export const InvitesList = ({ invites, currentUserRole }: InviteListProps) => {
const [inviteToCancel, setInviteToCancel] = useState<Invite | null>(null)
const { toast } = useToast();
const router = useRouter();
const domain = useDomain();
const captureEvent = useCaptureEvent();

const filteredInvites = useMemo(() => {
Expand All@@ -53,7 +51,7 @@ export const InvitesList = ({ invites, currentUserRole }: InviteListProps) => {
}, [invites, searchQuery, dateSort]);

const onCancelInvite = useCallback((inviteId: string) => {
cancelInvite(inviteId, domain)
cancelInvite(inviteId)
.then((response) => {
if (isServiceError(response)) {
toast({
Expand All@@ -70,7 +68,7 @@ export const InvitesList = ({ invites, currentUserRole }: InviteListProps) => {
router.refresh();
}
});
}, [domain, toast, router, captureEvent]);
}, [toast, router, captureEvent]);

return (
<div className="w-full mx-auto space-y-6">
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,7 +13,6 @@ import { CheckCircle, Search, XCircle } from "lucide-react";
import { useCallback, useMemo, useState } from "react";
import { approveAccountRequest, rejectAccountRequest } from "@/actions";
import { useRouter } from "next/navigation";
import { useDomain } from "@/hooks/useDomain";
import useCaptureEvent from "@/hooks/useCaptureEvent";

interface Request {
Expand All@@ -36,7 +35,6 @@ export const RequestsList = ({ requests, currentUserRole }: RequestsListProps) =
const [requestToAction, setRequestToAction] = useState<Request | null>(null)
const { toast } = useToast();
const router = useRouter();
const domain = useDomain();
const captureEvent = useCaptureEvent();

const filteredRequests = useMemo(() => {
Expand All@@ -56,7 +54,7 @@ export const RequestsList = ({ requests, currentUserRole }: RequestsListProps) =
}, [requests, searchQuery, dateSort]);

const onApproveRequest = useCallback((requestId: string) => {
approveAccountRequest(requestId, domain)
approveAccountRequest(requestId)
.then((response) => {
if (isServiceError(response)) {
toast({
Expand All@@ -73,10 +71,10 @@ export const RequestsList = ({ requests, currentUserRole }: RequestsListProps) =
router.refresh();
}
});
}, [domain, toast, router, captureEvent]);
}, [toast, router, captureEvent]);

const onRejectRequest = useCallback((requestId: string) => {
rejectAccountRequest(requestId, domain)
rejectAccountRequest(requestId)
.then((response) => {
if (isServiceError(response)) {
toast({
Expand All@@ -93,7 +91,7 @@ export const RequestsList = ({ requests, currentUserRole }: RequestsListProps) =
router.refresh();
}
});
}, [domain, toast, router, captureEvent]);
}, [toast, router, captureEvent]);

return (
<div className="w-full mx-auto space-y-6">
Expand Down
6 changes: 3 additions & 3 deletions packages/web/src/app/[domain]/settings/members/page.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -56,17 +56,17 @@ export default async function MembersSettingsPage(props: MembersSettingsPageProp
redirect(`/${domain}/settings`);
}

const members = await getOrgMembers(domain);
const members = await getOrgMembers();
if (isServiceError(members)) {
throw new ServiceErrorException(members);
}

const invites = await getOrgInvites(domain);
const invites = await getOrgInvites();
if (isServiceError(invites)) {
throw new ServiceErrorException(invites);
}

const requests = await getOrgAccountRequests(domain);
const requests = await getOrgAccountRequests();
if (isServiceError(requests)) {
throw new ServiceErrorException(requests);
}
Expand Down
3 changes: 1 addition & 2 deletions packages/web/src/app/components/anonymousAccessToggle.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,7 +3,6 @@
import { useState } from "react"
import { Switch } from "@/components/ui/switch"
import { setAnonymousAccessStatus } from "@/actions"
import { SINGLE_TENANT_ORG_DOMAIN } from "@/lib/constants"
import { isServiceError } from "@/lib/utils"
import { useToast } from "@/components/hooks/use-toast"

Expand All@@ -22,7 +21,7 @@ export function AnonymousAccessToggle({ hasAnonymousAccessEntitlement, anonymous
const handleToggle = async (checked: boolean) => {
setIsLoading(true)
try {
const result = await setAnonymousAccessStatus(SINGLE_TENANT_ORG_DOMAIN, checked)
const result = await setAnonymousAccessStatus(checked)

if (isServiceError(result)) {
toast({
Expand Down
3 changes: 1 addition & 2 deletions packages/web/src/app/components/inviteLinkToggle.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,7 +6,6 @@ import { Input } from "@/components/ui/input"
import { Switch } from "@/components/ui/switch"
import { Copy, Check } from "lucide-react"
import { useToast } from "@/components/hooks/use-toast"
import { SINGLE_TENANT_ORG_DOMAIN } from "@/lib/constants"
import { setInviteLinkEnabled } from "@/actions"
import { isServiceError } from "@/lib/utils"

Expand All@@ -25,7 +24,7 @@ export function InviteLinkToggle({ inviteLinkEnabled, inviteLink }: InviteLinkTo
const handleToggle = async (checked: boolean) => {
setIsLoading(true)
try {
const result = await setInviteLinkEnabled(SINGLE_TENANT_ORG_DOMAIN, checked)
const result = await setInviteLinkEnabled(checked)

if (isServiceError(result)) {
toast({
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,7 +3,6 @@
import { useState } from "react"
import { Switch } from "@/components/ui/switch"
import { setMemberApprovalRequired } from "@/actions"
import { SINGLE_TENANT_ORG_DOMAIN } from "@/lib/constants"
import { isServiceError } from "@/lib/utils"
import { useToast } from "@/components/hooks/use-toast"

Expand All@@ -21,7 +20,7 @@ export function MemberApprovalRequiredToggle({ memberApprovalRequired, onToggleC
const handleToggle = async (checked: boolean) => {
setIsLoading(true)
try {
const result = await setMemberApprovalRequired(SINGLE_TENANT_ORG_DOMAIN, checked)
const result = await setMemberApprovalRequired(checked)

if (isServiceError(result)) {
toast({
Expand Down
9 changes: 4 additions & 5 deletions packages/web/src/app/invite/actions.ts
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,21 @@
"use server";

import { withAuth } from "@/actions";
import { isServiceError } from "@/lib/utils";
import { orgNotFound, ServiceError } from "@/lib/serviceError";
import { sew } from "@/actions";
import { addUserToOrganization } from "@/lib/authUtils";
import { prisma } from "@/prisma";
import { withAuthV2_skipOrgMembershipCheck } from "@/withAuthV2";
import { StatusCodes } from "http-status-codes";
import { ErrorCode } from "@/lib/errorCodes";

export const joinOrganization = async (orgId: number, inviteLinkId?: string) => sew(async () =>
withAuth(async (userId) => {
withAuthV2_skipOrgMembershipCheck(async ({ user, prisma }) => {
const org = await prisma.org.findUnique({
where: {
id: orgId,
},
});
Comment thread
coderabbitai[bot] marked this conversation as resolved.

if (!org) {
return orgNotFound();
}
Expand All@@ -40,7 +39,7 @@ export const joinOrganization = async (orgId: number, inviteLinkId?: string) =>
}
}

const addUserToOrgRes = await addUserToOrganization(userId, org.id);
const addUserToOrgRes = await addUserToOrganization(user.id, org.id);
if (isServiceError(addUserToOrgRes)) {
return addUserToOrgRes;
}
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,7 +4,6 @@ import { useState } from "react"
import { useRouter } from "next/navigation"
import { Button } from "@/components/ui/button"
import { completeOnboarding } from "@/actions"
import { SINGLE_TENANT_ORG_DOMAIN } from "@/lib/constants"
import { isServiceError } from "@/lib/utils"
import { useToast } from "@/components/hooks/use-toast"

Expand All@@ -17,7 +16,7 @@ export function CompleteOnboardingButton() {
setIsLoading(true)

try {
const result = await completeOnboarding(SINGLE_TENANT_ORG_DOMAIN)
const result = await completeOnboarding()

if (isServiceError(result)) {
toast({
Expand Down
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
653 changes: 253 additions & 400 deletions packages/web/src/actions.ts

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion packages/web/src/app/[domain]/chat/[id]/page.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -104,7 +104,7 @@ export default async function Page(props: PageProps) {

const languageModels = await getConfiguredLanguageModelsInfo();
const repos = await getRepos();
const searchContexts = await getSearchContexts(params.domain);
const searchContexts = await getSearchContexts();
const chatInfo = await getChatInfo({ chatId: params.id });
const chatHistory = session ? await getUserChatHistory() : [];

Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/app/[domain]/chat/page.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -27,7 +27,7 @@ interface PageProps {
export default async function Page(props: PageProps) {
const params = await props.params;
const languageModels = await getConfiguredLanguageModelsInfo();
const searchContexts = await getSearchContexts(params.domain);
const searchContexts = await getSearchContexts();
const allRepos = await getRepos();
const session = await auth();
const chatHistory = session ? await getUserChatHistory() : [];
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -33,7 +33,7 @@ export const NavigationMenu = async ({
throw new ServiceErrorException(repoStats);
}

const role = isAuthenticated ? await getCurrentUserRole(domain) : null;
const role = isAuthenticated ? await getCurrentUserRole() : null;
if (isServiceError(role)) {
throw new ServiceErrorException(role);
}
Expand All@@ -43,7 +43,7 @@ export const NavigationMenu = async ({
return null;
}

const joinRequests = await getOrgAccountRequests(domain);
const joinRequests = await getOrgAccountRequests();
if (isServiceError(joinRequests)) {
throw new ServiceErrorException(joinRequests);
}
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -107,7 +107,7 @@ export const useSuggestionsData = ({

const { data: searchContextSuggestions, isLoading: _isLoadingSearchContexts } = useQuery({
queryKey: ["searchContexts", domain],
queryFn: () => getSearchContexts(domain),
queryFn: () => getSearchContexts(),
select: (data): Suggestion[] => {
if (isServiceError(data)) {
return [];
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/app/[domain]/repos/[id]/page.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -52,7 +52,7 @@ export default async function RepoDetailPage({ params }: { params: Promise<{ id:

const repoMetadata = repoMetadataSchema.parse(repo.metadata);

const userRole = await getCurrentUserRole(SINGLE_TENANT_ORG_DOMAIN);
const userRole = await getCurrentUserRole();
if (isServiceError(userRole)) {
throw new ServiceErrorException(userRole);
}
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/app/[domain]/repos/layout.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -24,7 +24,7 @@ export default async function Layout(
throw new ServiceErrorException(repoStats);
}

const userRoleInOrg = await getCurrentUserRole(domain);
const userRoleInOrg = await getCurrentUserRole();

return (
<div className="min-h-screen flex flex-col">
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,7 +7,6 @@ import { Input } from "@/components/ui/input";
import { isServiceError } from "@/lib/utils";
import { Copy, Check, AlertTriangle, Loader2, Plus } from "lucide-react";
import { useCallback, useEffect, useMemo, useState } from "react";
import { useDomain } from "@/hooks/useDomain";
import { useToast } from "@/components/hooks/use-toast";
import useCaptureEvent from "@/hooks/useCaptureEvent";
import { DataTable } from "@/components/ui/data-table";
Expand All@@ -16,7 +15,6 @@ import { Skeleton } from "@/components/ui/skeleton";
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip";

export function ApiKeysPage({ canCreateApiKey }: { canCreateApiKey: boolean }) {
const domain = useDomain();
const { toast } = useToast();
const captureEvent = useCaptureEvent();

Expand All@@ -33,7 +31,7 @@ export function ApiKeysPage({ canCreateApiKey }: { canCreateApiKey: boolean }) {
setIsLoading(true);
setError(null);
try {
const keys = await getUserApiKeys(domain);
const keys = await getUserApiKeys();
if (isServiceError(keys)) {
setError("Failed to load API keys");
toast({
Expand All@@ -55,7 +53,7 @@ export function ApiKeysPage({ canCreateApiKey }: { canCreateApiKey: boolean }) {
} finally {
setIsLoading(false);
}
}, [domain, toast]);
}, [toast]);

useEffect(() => {
loadApiKeys();
Expand All@@ -73,7 +71,7 @@ export function ApiKeysPage({ canCreateApiKey }: { canCreateApiKey: boolean }) {

setIsCreatingKey(true);
try {
const result = await createApiKey(newKeyName.trim(), domain);
const result = await createApiKey(newKeyName.trim());
if (isServiceError(result)) {
toast({
title: "Error",
Expand Down
4 changes: 1 addition & 3 deletions packages/web/src/app/[domain]/settings/apiKeys/columns.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,7 +4,6 @@ import { ColumnDef } from "@tanstack/react-table"
import { ArrowUpDown, Key, Trash2 } from "lucide-react"
import { Button } from "@/components/ui/button"
import { deleteApiKey } from "@/actions"
import { useParams } from "next/navigation"
import {
AlertDialog,
AlertDialogAction,
Expand All@@ -27,14 +26,13 @@ export type ApiKeyColumnInfo = {

// Component for the actions cell to properly use React hooks
function ApiKeyActions({ apiKey }: { apiKey: ApiKeyColumnInfo }) {
const params = useParams<{ domain: string }>()
const [isPending, setIsPending] = useState(false)
const { toast } = useToast()

const handleDelete = async () => {
setIsPending(true)
try {
await deleteApiKey(apiKey.name, params.domain)
await deleteApiKey(apiKey.name)
window.location.reload()
} catch (error) {
console.error("Failed to delete API key", error)
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/app/[domain]/settings/layout.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -70,7 +70,7 @@ export const getSidebarNavItems = async () =>
withAuthV2(async ({ role }) => {
let numJoinRequests: number | undefined;
if (role === OrgRole.OWNER) {
const requests = await getOrgAccountRequests(SINGLE_TENANT_ORG_DOMAIN);
const requests = await getOrgAccountRequests();
if (isServiceError(requests)) {
throw new ServiceErrorException(requests);
}
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/app/[domain]/settings/license/page.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -75,7 +75,7 @@ export default async function LicensePage(props: LicensePageProps) {
)
}

const members = await getOrgMembers(domain);
const members = await getOrgMembers();
if (isServiceError(members)) {
throw new ServiceErrorException(members);
}
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -12,7 +12,6 @@ import { PlusCircleIcon, Loader2, AlertCircle } from "lucide-react";
import { OrgRole } from "@prisma/client";
import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle } from "@/components/ui/alert-dialog";
import { createInvites } from "@/actions";
import { useDomain } from "@/hooks/useDomain";
import { isServiceError } from "@/lib/utils";
import { useToast } from "@/components/hooks/use-toast";
import { useRouter } from "next/navigation";
Expand All@@ -35,8 +34,7 @@ interface InviteMemberCardProps {
export const InviteMemberCard = ({ currentUserRole, seatsAvailable = true }: InviteMemberCardProps) => {
const [isInviteDialogOpen, setIsInviteDialogOpen] = useState(false);
const [isLoading, setIsLoading] = useState(false);
const domain = useDomain();
const { toast } = useToast();
const { toast } = useToast();
const router = useRouter();
const captureEvent = useCaptureEvent();

Expand All@@ -54,7 +52,7 @@ export const InviteMemberCard = ({ currentUserRole, seatsAvailable = true }: Inv

const onSubmit = useCallback((data: z.infer<typeof inviteMemberFormSchema>) => {
setIsLoading(true);
createInvites(data.emails.map(e => e.email), domain)
createInvites(data.emails.map(e => e.email))
.then((res) => {
if (isServiceError(res)) {
toast({
Expand All@@ -78,7 +76,7 @@ export const InviteMemberCard = ({ currentUserRole, seatsAvailable = true }: Inv
.finally(() => {
setIsLoading(false);
});
}, [domain, form, toast, router, captureEvent]);
}, [form, toast, router, captureEvent]);

const isDisabled = !seatsAvailable || currentUserRole !== OrgRole.OWNER || isLoading;

Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,7 +14,6 @@ import { Copy, MoreVertical, Search } from "lucide-react";
import { useCallback, useMemo, useState } from "react";
import { cancelInvite } from "@/actions";
import { useRouter } from "next/navigation";
import { useDomain } from "@/hooks/useDomain";
import useCaptureEvent from "@/hooks/useCaptureEvent";
interface Invite {
id: string;
Expand All@@ -34,7 +33,6 @@ export const InvitesList = ({ invites, currentUserRole }: InviteListProps) => {
const [inviteToCancel, setInviteToCancel] = useState<Invite | null>(null)
const { toast } = useToast();
const router = useRouter();
const domain = useDomain();
const captureEvent = useCaptureEvent();

const filteredInvites = useMemo(() => {
Expand All@@ -53,7 +51,7 @@ export const InvitesList = ({ invites, currentUserRole }: InviteListProps) => {
}, [invites, searchQuery, dateSort]);

const onCancelInvite = useCallback((inviteId: string) => {
cancelInvite(inviteId, domain)
cancelInvite(inviteId)
.then((response) => {
if (isServiceError(response)) {
toast({
Expand All@@ -70,7 +68,7 @@ export const InvitesList = ({ invites, currentUserRole }: InviteListProps) => {
router.refresh();
}
});
}, [domain, toast, router, captureEvent]);
}, [toast, router, captureEvent]);

return (
<div className="w-full mx-auto space-y-6">
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,7 +13,6 @@ import { CheckCircle, Search, XCircle } from "lucide-react";
import { useCallback, useMemo, useState } from "react";
import { approveAccountRequest, rejectAccountRequest } from "@/actions";
import { useRouter } from "next/navigation";
import { useDomain } from "@/hooks/useDomain";
import useCaptureEvent from "@/hooks/useCaptureEvent";

interface Request {
Expand All@@ -36,7 +35,6 @@ export const RequestsList = ({ requests, currentUserRole }: RequestsListProps) =
const [requestToAction, setRequestToAction] = useState<Request | null>(null)
const { toast } = useToast();
const router = useRouter();
const domain = useDomain();
const captureEvent = useCaptureEvent();

const filteredRequests = useMemo(() => {
Expand All@@ -56,7 +54,7 @@ export const RequestsList = ({ requests, currentUserRole }: RequestsListProps) =
}, [requests, searchQuery, dateSort]);

const onApproveRequest = useCallback((requestId: string) => {
approveAccountRequest(requestId, domain)
approveAccountRequest(requestId)
.then((response) => {
if (isServiceError(response)) {
toast({
Expand All@@ -73,10 +71,10 @@ export const RequestsList = ({ requests, currentUserRole }: RequestsListProps) =
router.refresh();
}
});
}, [domain, toast, router, captureEvent]);
}, [toast, router, captureEvent]);

const onRejectRequest = useCallback((requestId: string) => {
rejectAccountRequest(requestId, domain)
rejectAccountRequest(requestId)
.then((response) => {
if (isServiceError(response)) {
toast({
Expand All@@ -93,7 +91,7 @@ export const RequestsList = ({ requests, currentUserRole }: RequestsListProps) =
router.refresh();
}
});
}, [domain, toast, router, captureEvent]);
}, [toast, router, captureEvent]);

return (
<div className="w-full mx-auto space-y-6">
Expand Down
6 changes: 3 additions & 3 deletions packages/web/src/app/[domain]/settings/members/page.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -56,17 +56,17 @@ export default async function MembersSettingsPage(props: MembersSettingsPageProp
redirect(`/${domain}/settings`);
}

const members = await getOrgMembers(domain);
const members = await getOrgMembers();
if (isServiceError(members)) {
throw new ServiceErrorException(members);
}

const invites = await getOrgInvites(domain);
const invites = await getOrgInvites();
if (isServiceError(invites)) {
throw new ServiceErrorException(invites);
}

const requests = await getOrgAccountRequests(domain);
const requests = await getOrgAccountRequests();
if (isServiceError(requests)) {
throw new ServiceErrorException(requests);
}
Expand Down
3 changes: 1 addition & 2 deletions packages/web/src/app/components/anonymousAccessToggle.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,7 +3,6 @@
import { useState } from "react"
import { Switch } from "@/components/ui/switch"
import { setAnonymousAccessStatus } from "@/actions"
import { SINGLE_TENANT_ORG_DOMAIN } from "@/lib/constants"
import { isServiceError } from "@/lib/utils"
import { useToast } from "@/components/hooks/use-toast"

Expand All@@ -22,7 +21,7 @@ export function AnonymousAccessToggle({ hasAnonymousAccessEntitlement, anonymous
const handleToggle = async (checked: boolean) => {
setIsLoading(true)
try {
const result = await setAnonymousAccessStatus(SINGLE_TENANT_ORG_DOMAIN, checked)
const result = await setAnonymousAccessStatus(checked)

if (isServiceError(result)) {
toast({
Expand Down
3 changes: 1 addition & 2 deletions packages/web/src/app/components/inviteLinkToggle.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,7 +6,6 @@ import { Input } from "@/components/ui/input"
import { Switch } from "@/components/ui/switch"
import { Copy, Check } from "lucide-react"
import { useToast } from "@/components/hooks/use-toast"
import { SINGLE_TENANT_ORG_DOMAIN } from "@/lib/constants"
import { setInviteLinkEnabled } from "@/actions"
import { isServiceError } from "@/lib/utils"

Expand All@@ -25,7 +24,7 @@ export function InviteLinkToggle({ inviteLinkEnabled, inviteLink }: InviteLinkTo
const handleToggle = async (checked: boolean) => {
setIsLoading(true)
try {
const result = await setInviteLinkEnabled(SINGLE_TENANT_ORG_DOMAIN, checked)
const result = await setInviteLinkEnabled(checked)

if (isServiceError(result)) {
toast({
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,7 +3,6 @@
import { useState } from "react"
import { Switch } from "@/components/ui/switch"
import { setMemberApprovalRequired } from "@/actions"
import { SINGLE_TENANT_ORG_DOMAIN } from "@/lib/constants"
import { isServiceError } from "@/lib/utils"
import { useToast } from "@/components/hooks/use-toast"

Expand All@@ -21,7 +20,7 @@ export function MemberApprovalRequiredToggle({ memberApprovalRequired, onToggleC
const handleToggle = async (checked: boolean) => {
setIsLoading(true)
try {
const result = await setMemberApprovalRequired(SINGLE_TENANT_ORG_DOMAIN, checked)
const result = await setMemberApprovalRequired(checked)

if (isServiceError(result)) {
toast({
Expand Down
9 changes: 4 additions & 5 deletions packages/web/src/app/invite/actions.ts
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,21 @@
"use server";

import { withAuth } from "@/actions";
import { isServiceError } from "@/lib/utils";
import { orgNotFound, ServiceError } from "@/lib/serviceError";
import { sew } from "@/actions";
import { addUserToOrganization } from "@/lib/authUtils";
import { prisma } from "@/prisma";
import { withAuthV2_skipOrgMembershipCheck } from "@/withAuthV2";
import { StatusCodes } from "http-status-codes";
import { ErrorCode } from "@/lib/errorCodes";

export const joinOrganization = async (orgId: number, inviteLinkId?: string) => sew(async () =>
withAuth(async (userId) => {
withAuthV2_skipOrgMembershipCheck(async ({ user, prisma }) => {
const org = await prisma.org.findUnique({
where: {
id: orgId,
},
});
Comment thread
coderabbitai[bot] marked this conversation as resolved.

if (!org) {
return orgNotFound();
}
Expand All@@ -40,7 +39,7 @@ export const joinOrganization = async (orgId: number, inviteLinkId?: string) =>
}
}

const addUserToOrgRes = await addUserToOrganization(userId, org.id);
const addUserToOrgRes = await addUserToOrganization(user.id, org.id);
if (isServiceError(addUserToOrgRes)) {
return addUserToOrgRes;
}
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,7 +4,6 @@ import { useState } from "react"
import { useRouter } from "next/navigation"
import { Button } from "@/components/ui/button"
import { completeOnboarding } from "@/actions"
import { SINGLE_TENANT_ORG_DOMAIN } from "@/lib/constants"
import { isServiceError } from "@/lib/utils"
import { useToast } from "@/components/hooks/use-toast"

Expand All@@ -17,7 +16,7 @@ export function CompleteOnboardingButton() {
setIsLoading(true)

try {
const result = await completeOnboarding(SINGLE_TENANT_ORG_DOMAIN)
const result = await completeOnboarding()

if (isServiceError(result)) {
toast({
Expand Down
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
653 changes: 253 additions & 400 deletions packages/web/src/actions.ts

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion packages/web/src/app/[domain]/chat/[id]/page.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -104,7 +104,7 @@ export default async function Page(props: PageProps) {

const languageModels = await getConfiguredLanguageModelsInfo();
const repos = await getRepos();
const searchContexts = await getSearchContexts(params.domain);
const searchContexts = await getSearchContexts();
const chatInfo = await getChatInfo({ chatId: params.id });
const chatHistory = session ? await getUserChatHistory() : [];

Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/app/[domain]/chat/page.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -27,7 +27,7 @@ interface PageProps {
export default async function Page(props: PageProps) {
const params = await props.params;
const languageModels = await getConfiguredLanguageModelsInfo();
const searchContexts = await getSearchContexts(params.domain);
const searchContexts = await getSearchContexts();
const allRepos = await getRepos();
const session = await auth();
const chatHistory = session ? await getUserChatHistory() : [];
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -33,7 +33,7 @@ export const NavigationMenu = async ({
throw new ServiceErrorException(repoStats);
}

const role = isAuthenticated ? await getCurrentUserRole(domain) : null;
const role = isAuthenticated ? await getCurrentUserRole() : null;
if (isServiceError(role)) {
throw new ServiceErrorException(role);
}
Expand All@@ -43,7 +43,7 @@ export const NavigationMenu = async ({
return null;
}

const joinRequests = await getOrgAccountRequests(domain);
const joinRequests = await getOrgAccountRequests();
if (isServiceError(joinRequests)) {
throw new ServiceErrorException(joinRequests);
}
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -107,7 +107,7 @@ export const useSuggestionsData = ({

const { data: searchContextSuggestions, isLoading: _isLoadingSearchContexts } = useQuery({
queryKey: ["searchContexts", domain],
queryFn: () => getSearchContexts(domain),
queryFn: () => getSearchContexts(),
select: (data): Suggestion[] => {
if (isServiceError(data)) {
return [];
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/app/[domain]/repos/[id]/page.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -52,7 +52,7 @@ export default async function RepoDetailPage({ params }: { params: Promise<{ id:

const repoMetadata = repoMetadataSchema.parse(repo.metadata);

const userRole = await getCurrentUserRole(SINGLE_TENANT_ORG_DOMAIN);
const userRole = await getCurrentUserRole();
if (isServiceError(userRole)) {
throw new ServiceErrorException(userRole);
}
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/app/[domain]/repos/layout.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -24,7 +24,7 @@ export default async function Layout(
throw new ServiceErrorException(repoStats);
}

const userRoleInOrg = await getCurrentUserRole(domain);
const userRoleInOrg = await getCurrentUserRole();

return (
<div className="min-h-screen flex flex-col">
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,7 +7,6 @@ import { Input } from "@/components/ui/input";
import { isServiceError } from "@/lib/utils";
import { Copy, Check, AlertTriangle, Loader2, Plus } from "lucide-react";
import { useCallback, useEffect, useMemo, useState } from "react";
import { useDomain } from "@/hooks/useDomain";
import { useToast } from "@/components/hooks/use-toast";
import useCaptureEvent from "@/hooks/useCaptureEvent";
import { DataTable } from "@/components/ui/data-table";
Expand All@@ -16,7 +15,6 @@ import { Skeleton } from "@/components/ui/skeleton";
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip";

export function ApiKeysPage({ canCreateApiKey }: { canCreateApiKey: boolean }) {
const domain = useDomain();
const { toast } = useToast();
const captureEvent = useCaptureEvent();

Expand All@@ -33,7 +31,7 @@ export function ApiKeysPage({ canCreateApiKey }: { canCreateApiKey: boolean }) {
setIsLoading(true);
setError(null);
try {
const keys = await getUserApiKeys(domain);
const keys = await getUserApiKeys();
if (isServiceError(keys)) {
setError("Failed to load API keys");
toast({
Expand All@@ -55,7 +53,7 @@ export function ApiKeysPage({ canCreateApiKey }: { canCreateApiKey: boolean }) {
} finally {
setIsLoading(false);
}
}, [domain, toast]);
}, [toast]);

useEffect(() => {
loadApiKeys();
Expand All@@ -73,7 +71,7 @@ export function ApiKeysPage({ canCreateApiKey }: { canCreateApiKey: boolean }) {

setIsCreatingKey(true);
try {
const result = await createApiKey(newKeyName.trim(), domain);
const result = await createApiKey(newKeyName.trim());
if (isServiceError(result)) {
toast({
title: "Error",
Expand Down
4 changes: 1 addition & 3 deletions packages/web/src/app/[domain]/settings/apiKeys/columns.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,7 +4,6 @@ import { ColumnDef } from "@tanstack/react-table"
import { ArrowUpDown, Key, Trash2 } from "lucide-react"
import { Button } from "@/components/ui/button"
import { deleteApiKey } from "@/actions"
import { useParams } from "next/navigation"
import {
AlertDialog,
AlertDialogAction,
Expand All@@ -27,14 +26,13 @@ export type ApiKeyColumnInfo = {

// Component for the actions cell to properly use React hooks
function ApiKeyActions({ apiKey }: { apiKey: ApiKeyColumnInfo }) {
const params = useParams<{ domain: string }>()
const [isPending, setIsPending] = useState(false)
const { toast } = useToast()

const handleDelete = async () => {
setIsPending(true)
try {
await deleteApiKey(apiKey.name, params.domain)
await deleteApiKey(apiKey.name)
window.location.reload()
} catch (error) {
console.error("Failed to delete API key", error)
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/app/[domain]/settings/layout.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -70,7 +70,7 @@ export const getSidebarNavItems = async () =>
withAuthV2(async ({ role }) => {
let numJoinRequests: number | undefined;
if (role === OrgRole.OWNER) {
const requests = await getOrgAccountRequests(SINGLE_TENANT_ORG_DOMAIN);
const requests = await getOrgAccountRequests();
if (isServiceError(requests)) {
throw new ServiceErrorException(requests);
}
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/app/[domain]/settings/license/page.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -75,7 +75,7 @@ export default async function LicensePage(props: LicensePageProps) {
)
}

const members = await getOrgMembers(domain);
const members = await getOrgMembers();
if (isServiceError(members)) {
throw new ServiceErrorException(members);
}
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -12,7 +12,6 @@ import { PlusCircleIcon, Loader2, AlertCircle } from "lucide-react";
import { OrgRole } from "@prisma/client";
import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle } from "@/components/ui/alert-dialog";
import { createInvites } from "@/actions";
import { useDomain } from "@/hooks/useDomain";
import { isServiceError } from "@/lib/utils";
import { useToast } from "@/components/hooks/use-toast";
import { useRouter } from "next/navigation";
Expand All@@ -35,8 +34,7 @@ interface InviteMemberCardProps {
export const InviteMemberCard = ({ currentUserRole, seatsAvailable = true }: InviteMemberCardProps) => {
const [isInviteDialogOpen, setIsInviteDialogOpen] = useState(false);
const [isLoading, setIsLoading] = useState(false);
const domain = useDomain();
const { toast } = useToast();
const { toast } = useToast();
const router = useRouter();
const captureEvent = useCaptureEvent();

Expand All@@ -54,7 +52,7 @@ export const InviteMemberCard = ({ currentUserRole, seatsAvailable = true }: Inv

const onSubmit = useCallback((data: z.infer<typeof inviteMemberFormSchema>) => {
setIsLoading(true);
createInvites(data.emails.map(e => e.email), domain)
createInvites(data.emails.map(e => e.email))
.then((res) => {
if (isServiceError(res)) {
toast({
Expand All@@ -78,7 +76,7 @@ export const InviteMemberCard = ({ currentUserRole, seatsAvailable = true }: Inv
.finally(() => {
setIsLoading(false);
});
}, [domain, form, toast, router, captureEvent]);
}, [form, toast, router, captureEvent]);

const isDisabled = !seatsAvailable || currentUserRole !== OrgRole.OWNER || isLoading;

Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,7 +14,6 @@ import { Copy, MoreVertical, Search } from "lucide-react";
import { useCallback, useMemo, useState } from "react";
import { cancelInvite } from "@/actions";
import { useRouter } from "next/navigation";
import { useDomain } from "@/hooks/useDomain";
import useCaptureEvent from "@/hooks/useCaptureEvent";
interface Invite {
id: string;
Expand All@@ -34,7 +33,6 @@ export const InvitesList = ({ invites, currentUserRole }: InviteListProps) => {
const [inviteToCancel, setInviteToCancel] = useState<Invite | null>(null)
const { toast } = useToast();
const router = useRouter();
const domain = useDomain();
const captureEvent = useCaptureEvent();

const filteredInvites = useMemo(() => {
Expand All@@ -53,7 +51,7 @@ export const InvitesList = ({ invites, currentUserRole }: InviteListProps) => {
}, [invites, searchQuery, dateSort]);

const onCancelInvite = useCallback((inviteId: string) => {
cancelInvite(inviteId, domain)
cancelInvite(inviteId)
.then((response) => {
if (isServiceError(response)) {
toast({
Expand All@@ -70,7 +68,7 @@ export const InvitesList = ({ invites, currentUserRole }: InviteListProps) => {
router.refresh();
}
});
}, [domain, toast, router, captureEvent]);
}, [toast, router, captureEvent]);

return (
<div className="w-full mx-auto space-y-6">
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,7 +13,6 @@ import { CheckCircle, Search, XCircle } from "lucide-react";
import { useCallback, useMemo, useState } from "react";
import { approveAccountRequest, rejectAccountRequest } from "@/actions";
import { useRouter } from "next/navigation";
import { useDomain } from "@/hooks/useDomain";
import useCaptureEvent from "@/hooks/useCaptureEvent";

interface Request {
Expand All@@ -36,7 +35,6 @@ export const RequestsList = ({ requests, currentUserRole }: RequestsListProps) =
const [requestToAction, setRequestToAction] = useState<Request | null>(null)
const { toast } = useToast();
const router = useRouter();
const domain = useDomain();
const captureEvent = useCaptureEvent();

const filteredRequests = useMemo(() => {
Expand All@@ -56,7 +54,7 @@ export const RequestsList = ({ requests, currentUserRole }: RequestsListProps) =
}, [requests, searchQuery, dateSort]);

const onApproveRequest = useCallback((requestId: string) => {
approveAccountRequest(requestId, domain)
approveAccountRequest(requestId)
.then((response) => {
if (isServiceError(response)) {
toast({
Expand All@@ -73,10 +71,10 @@ export const RequestsList = ({ requests, currentUserRole }: RequestsListProps) =
router.refresh();
}
});
}, [domain, toast, router, captureEvent]);
}, [toast, router, captureEvent]);

const onRejectRequest = useCallback((requestId: string) => {
rejectAccountRequest(requestId, domain)
rejectAccountRequest(requestId)
.then((response) => {
if (isServiceError(response)) {
toast({
Expand All@@ -93,7 +91,7 @@ export const RequestsList = ({ requests, currentUserRole }: RequestsListProps) =
router.refresh();
}
});
}, [domain, toast, router, captureEvent]);
}, [toast, router, captureEvent]);

return (
<div className="w-full mx-auto space-y-6">
Expand Down
6 changes: 3 additions & 3 deletions packages/web/src/app/[domain]/settings/members/page.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -56,17 +56,17 @@ export default async function MembersSettingsPage(props: MembersSettingsPageProp
redirect(`/${domain}/settings`);
}

const members = await getOrgMembers(domain);
const members = await getOrgMembers();
if (isServiceError(members)) {
throw new ServiceErrorException(members);
}

const invites = await getOrgInvites(domain);
const invites = await getOrgInvites();
if (isServiceError(invites)) {
throw new ServiceErrorException(invites);
}

const requests = await getOrgAccountRequests(domain);
const requests = await getOrgAccountRequests();
if (isServiceError(requests)) {
throw new ServiceErrorException(requests);
}
Expand Down
3 changes: 1 addition & 2 deletions packages/web/src/app/components/anonymousAccessToggle.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,7 +3,6 @@
import { useState } from "react"
import { Switch } from "@/components/ui/switch"
import { setAnonymousAccessStatus } from "@/actions"
import { SINGLE_TENANT_ORG_DOMAIN } from "@/lib/constants"
import { isServiceError } from "@/lib/utils"
import { useToast } from "@/components/hooks/use-toast"

Expand All@@ -22,7 +21,7 @@ export function AnonymousAccessToggle({ hasAnonymousAccessEntitlement, anonymous
const handleToggle = async (checked: boolean) => {
setIsLoading(true)
try {
const result = await setAnonymousAccessStatus(SINGLE_TENANT_ORG_DOMAIN, checked)
const result = await setAnonymousAccessStatus(checked)

if (isServiceError(result)) {
toast({
Expand Down
3 changes: 1 addition & 2 deletions packages/web/src/app/components/inviteLinkToggle.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,7 +6,6 @@ import { Input } from "@/components/ui/input"
import { Switch } from "@/components/ui/switch"
import { Copy, Check } from "lucide-react"
import { useToast } from "@/components/hooks/use-toast"
import { SINGLE_TENANT_ORG_DOMAIN } from "@/lib/constants"
import { setInviteLinkEnabled } from "@/actions"
import { isServiceError } from "@/lib/utils"

Expand All@@ -25,7 +24,7 @@ export function InviteLinkToggle({ inviteLinkEnabled, inviteLink }: InviteLinkTo
const handleToggle = async (checked: boolean) => {
setIsLoading(true)
try {
const result = await setInviteLinkEnabled(SINGLE_TENANT_ORG_DOMAIN, checked)
const result = await setInviteLinkEnabled(checked)

if (isServiceError(result)) {
toast({
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,7 +3,6 @@
import { useState } from "react"
import { Switch } from "@/components/ui/switch"
import { setMemberApprovalRequired } from "@/actions"
import { SINGLE_TENANT_ORG_DOMAIN } from "@/lib/constants"
import { isServiceError } from "@/lib/utils"
import { useToast } from "@/components/hooks/use-toast"

Expand All@@ -21,7 +20,7 @@ export function MemberApprovalRequiredToggle({ memberApprovalRequired, onToggleC
const handleToggle = async (checked: boolean) => {
setIsLoading(true)
try {
const result = await setMemberApprovalRequired(SINGLE_TENANT_ORG_DOMAIN, checked)
const result = await setMemberApprovalRequired(checked)

if (isServiceError(result)) {
toast({
Expand Down
9 changes: 4 additions & 5 deletions packages/web/src/app/invite/actions.ts
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,21 @@
"use server";

import { withAuth } from "@/actions";
import { isServiceError } from "@/lib/utils";
import { orgNotFound, ServiceError } from "@/lib/serviceError";
import { sew } from "@/actions";
import { addUserToOrganization } from "@/lib/authUtils";
import { prisma } from "@/prisma";
import { withAuthV2_skipOrgMembershipCheck } from "@/withAuthV2";
import { StatusCodes } from "http-status-codes";
import { ErrorCode } from "@/lib/errorCodes";

export const joinOrganization = async (orgId: number, inviteLinkId?: string) => sew(async () =>
withAuth(async (userId) => {
withAuthV2_skipOrgMembershipCheck(async ({ user, prisma }) => {
const org = await prisma.org.findUnique({
where: {
id: orgId,
},
});
Comment thread
coderabbitai[bot] marked this conversation as resolved.

if (!org) {
return orgNotFound();
}
Expand All@@ -40,7 +39,7 @@ export const joinOrganization = async (orgId: number, inviteLinkId?: string) =>
}
}

const addUserToOrgRes = await addUserToOrganization(userId, org.id);
const addUserToOrgRes = await addUserToOrganization(user.id, org.id);
if (isServiceError(addUserToOrgRes)) {
return addUserToOrgRes;
}
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,7 +4,6 @@ import { useState } from "react"
import { useRouter } from "next/navigation"
import { Button } from "@/components/ui/button"
import { completeOnboarding } from "@/actions"
import { SINGLE_TENANT_ORG_DOMAIN } from "@/lib/constants"
import { isServiceError } from "@/lib/utils"
import { useToast } from "@/components/hooks/use-toast"

Expand All@@ -17,7 +16,7 @@ export function CompleteOnboardingButton() {
setIsLoading(true)

try {
const result = await completeOnboarding(SINGLE_TENANT_ORG_DOMAIN)
const result = await completeOnboarding()

if (isServiceError(result)) {
toast({
Expand Down
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
653 changes: 253 additions & 400 deletions packages/web/src/actions.ts

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion packages/web/src/app/[domain]/chat/[id]/page.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -104,7 +104,7 @@ export default async function Page(props: PageProps) {

const languageModels = await getConfiguredLanguageModelsInfo();
const repos = await getRepos();
const searchContexts = await getSearchContexts(params.domain);
const searchContexts = await getSearchContexts();
const chatInfo = await getChatInfo({ chatId: params.id });
const chatHistory = session ? await getUserChatHistory() : [];

Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/app/[domain]/chat/page.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -27,7 +27,7 @@ interface PageProps {
export default async function Page(props: PageProps) {
const params = await props.params;
const languageModels = await getConfiguredLanguageModelsInfo();
const searchContexts = await getSearchContexts(params.domain);
const searchContexts = await getSearchContexts();
const allRepos = await getRepos();
const session = await auth();
const chatHistory = session ? await getUserChatHistory() : [];
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -33,7 +33,7 @@ export const NavigationMenu = async ({
throw new ServiceErrorException(repoStats);
}

const role = isAuthenticated ? await getCurrentUserRole(domain) : null;
const role = isAuthenticated ? await getCurrentUserRole() : null;
if (isServiceError(role)) {
throw new ServiceErrorException(role);
}
Expand All@@ -43,7 +43,7 @@ export const NavigationMenu = async ({
return null;
}

const joinRequests = await getOrgAccountRequests(domain);
const joinRequests = await getOrgAccountRequests();
if (isServiceError(joinRequests)) {
throw new ServiceErrorException(joinRequests);
}
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -107,7 +107,7 @@ export const useSuggestionsData = ({

const { data: searchContextSuggestions, isLoading: _isLoadingSearchContexts } = useQuery({
queryKey: ["searchContexts", domain],
queryFn: () => getSearchContexts(domain),
queryFn: () => getSearchContexts(),
select: (data): Suggestion[] => {
if (isServiceError(data)) {
return [];
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/app/[domain]/repos/[id]/page.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -52,7 +52,7 @@ export default async function RepoDetailPage({ params }: { params: Promise<{ id:

const repoMetadata = repoMetadataSchema.parse(repo.metadata);

const userRole = await getCurrentUserRole(SINGLE_TENANT_ORG_DOMAIN);
const userRole = await getCurrentUserRole();
if (isServiceError(userRole)) {
throw new ServiceErrorException(userRole);
}
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/app/[domain]/repos/layout.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -24,7 +24,7 @@ export default async function Layout(
throw new ServiceErrorException(repoStats);
}

const userRoleInOrg = await getCurrentUserRole(domain);
const userRoleInOrg = await getCurrentUserRole();

return (
<div className="min-h-screen flex flex-col">
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,7 +7,6 @@ import { Input } from "@/components/ui/input";
import { isServiceError } from "@/lib/utils";
import { Copy, Check, AlertTriangle, Loader2, Plus } from "lucide-react";
import { useCallback, useEffect, useMemo, useState } from "react";
import { useDomain } from "@/hooks/useDomain";
import { useToast } from "@/components/hooks/use-toast";
import useCaptureEvent from "@/hooks/useCaptureEvent";
import { DataTable } from "@/components/ui/data-table";
Expand All@@ -16,7 +15,6 @@ import { Skeleton } from "@/components/ui/skeleton";
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip";

export function ApiKeysPage({ canCreateApiKey }: { canCreateApiKey: boolean }) {
const domain = useDomain();
const { toast } = useToast();
const captureEvent = useCaptureEvent();

Expand All@@ -33,7 +31,7 @@ export function ApiKeysPage({ canCreateApiKey }: { canCreateApiKey: boolean }) {
setIsLoading(true);
setError(null);
try {
const keys = await getUserApiKeys(domain);
const keys = await getUserApiKeys();
if (isServiceError(keys)) {
setError("Failed to load API keys");
toast({
Expand All@@ -55,7 +53,7 @@ export function ApiKeysPage({ canCreateApiKey }: { canCreateApiKey: boolean }) {
} finally {
setIsLoading(false);
}
}, [domain, toast]);
}, [toast]);

useEffect(() => {
loadApiKeys();
Expand All@@ -73,7 +71,7 @@ export function ApiKeysPage({ canCreateApiKey }: { canCreateApiKey: boolean }) {

setIsCreatingKey(true);
try {
const result = await createApiKey(newKeyName.trim(), domain);
const result = await createApiKey(newKeyName.trim());
if (isServiceError(result)) {
toast({
title: "Error",
Expand Down
4 changes: 1 addition & 3 deletions packages/web/src/app/[domain]/settings/apiKeys/columns.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,7 +4,6 @@ import { ColumnDef } from "@tanstack/react-table"
import { ArrowUpDown, Key, Trash2 } from "lucide-react"
import { Button } from "@/components/ui/button"
import { deleteApiKey } from "@/actions"
import { useParams } from "next/navigation"
import {
AlertDialog,
AlertDialogAction,
Expand All@@ -27,14 +26,13 @@ export type ApiKeyColumnInfo = {

// Component for the actions cell to properly use React hooks
function ApiKeyActions({ apiKey }: { apiKey: ApiKeyColumnInfo }) {
const params = useParams<{ domain: string }>()
const [isPending, setIsPending] = useState(false)
const { toast } = useToast()

const handleDelete = async () => {
setIsPending(true)
try {
await deleteApiKey(apiKey.name, params.domain)
await deleteApiKey(apiKey.name)
window.location.reload()
} catch (error) {
console.error("Failed to delete API key", error)
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/app/[domain]/settings/layout.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -70,7 +70,7 @@ export const getSidebarNavItems = async () =>
withAuthV2(async ({ role }) => {
let numJoinRequests: number | undefined;
if (role === OrgRole.OWNER) {
const requests = await getOrgAccountRequests(SINGLE_TENANT_ORG_DOMAIN);
const requests = await getOrgAccountRequests();
if (isServiceError(requests)) {
throw new ServiceErrorException(requests);
}
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/app/[domain]/settings/license/page.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -75,7 +75,7 @@ export default async function LicensePage(props: LicensePageProps) {
)
}

const members = await getOrgMembers(domain);
const members = await getOrgMembers();
if (isServiceError(members)) {
throw new ServiceErrorException(members);
}
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -12,7 +12,6 @@ import { PlusCircleIcon, Loader2, AlertCircle } from "lucide-react";
import { OrgRole } from "@prisma/client";
import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle } from "@/components/ui/alert-dialog";
import { createInvites } from "@/actions";
import { useDomain } from "@/hooks/useDomain";
import { isServiceError } from "@/lib/utils";
import { useToast } from "@/components/hooks/use-toast";
import { useRouter } from "next/navigation";
Expand All@@ -35,8 +34,7 @@ interface InviteMemberCardProps {
export const InviteMemberCard = ({ currentUserRole, seatsAvailable = true }: InviteMemberCardProps) => {
const [isInviteDialogOpen, setIsInviteDialogOpen] = useState(false);
const [isLoading, setIsLoading] = useState(false);
const domain = useDomain();
const { toast } = useToast();
const { toast } = useToast();
const router = useRouter();
const captureEvent = useCaptureEvent();

Expand All@@ -54,7 +52,7 @@ export const InviteMemberCard = ({ currentUserRole, seatsAvailable = true }: Inv

const onSubmit = useCallback((data: z.infer<typeof inviteMemberFormSchema>) => {
setIsLoading(true);
createInvites(data.emails.map(e => e.email), domain)
createInvites(data.emails.map(e => e.email))
.then((res) => {
if (isServiceError(res)) {
toast({
Expand All@@ -78,7 +76,7 @@ export const InviteMemberCard = ({ currentUserRole, seatsAvailable = true }: Inv
.finally(() => {
setIsLoading(false);
});
}, [domain, form, toast, router, captureEvent]);
}, [form, toast, router, captureEvent]);

const isDisabled = !seatsAvailable || currentUserRole !== OrgRole.OWNER || isLoading;

Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,7 +14,6 @@ import { Copy, MoreVertical, Search } from "lucide-react";
import { useCallback, useMemo, useState } from "react";
import { cancelInvite } from "@/actions";
import { useRouter } from "next/navigation";
import { useDomain } from "@/hooks/useDomain";
import useCaptureEvent from "@/hooks/useCaptureEvent";
interface Invite {
id: string;
Expand All@@ -34,7 +33,6 @@ export const InvitesList = ({ invites, currentUserRole }: InviteListProps) => {
const [inviteToCancel, setInviteToCancel] = useState<Invite | null>(null)
const { toast } = useToast();
const router = useRouter();
const domain = useDomain();
const captureEvent = useCaptureEvent();

const filteredInvites = useMemo(() => {
Expand All@@ -53,7 +51,7 @@ export const InvitesList = ({ invites, currentUserRole }: InviteListProps) => {
}, [invites, searchQuery, dateSort]);

const onCancelInvite = useCallback((inviteId: string) => {
cancelInvite(inviteId, domain)
cancelInvite(inviteId)
.then((response) => {
if (isServiceError(response)) {
toast({
Expand All@@ -70,7 +68,7 @@ export const InvitesList = ({ invites, currentUserRole }: InviteListProps) => {
router.refresh();
}
});
}, [domain, toast, router, captureEvent]);
}, [toast, router, captureEvent]);

return (
<div className="w-full mx-auto space-y-6">
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,7 +13,6 @@ import { CheckCircle, Search, XCircle } from "lucide-react";
import { useCallback, useMemo, useState } from "react";
import { approveAccountRequest, rejectAccountRequest } from "@/actions";
import { useRouter } from "next/navigation";
import { useDomain } from "@/hooks/useDomain";
import useCaptureEvent from "@/hooks/useCaptureEvent";

interface Request {
Expand All@@ -36,7 +35,6 @@ export const RequestsList = ({ requests, currentUserRole }: RequestsListProps) =
const [requestToAction, setRequestToAction] = useState<Request | null>(null)
const { toast } = useToast();
const router = useRouter();
const domain = useDomain();
const captureEvent = useCaptureEvent();

const filteredRequests = useMemo(() => {
Expand All@@ -56,7 +54,7 @@ export const RequestsList = ({ requests, currentUserRole }: RequestsListProps) =
}, [requests, searchQuery, dateSort]);

const onApproveRequest = useCallback((requestId: string) => {
approveAccountRequest(requestId, domain)
approveAccountRequest(requestId)
.then((response) => {
if (isServiceError(response)) {
toast({
Expand All@@ -73,10 +71,10 @@ export const RequestsList = ({ requests, currentUserRole }: RequestsListProps) =
router.refresh();
}
});
}, [domain, toast, router, captureEvent]);
}, [toast, router, captureEvent]);

const onRejectRequest = useCallback((requestId: string) => {
rejectAccountRequest(requestId, domain)
rejectAccountRequest(requestId)
.then((response) => {
if (isServiceError(response)) {
toast({
Expand All@@ -93,7 +91,7 @@ export const RequestsList = ({ requests, currentUserRole }: RequestsListProps) =
router.refresh();
}
});
}, [domain, toast, router, captureEvent]);
}, [toast, router, captureEvent]);

return (
<div className="w-full mx-auto space-y-6">
Expand Down
6 changes: 3 additions & 3 deletions packages/web/src/app/[domain]/settings/members/page.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -56,17 +56,17 @@ export default async function MembersSettingsPage(props: MembersSettingsPageProp
redirect(`/${domain}/settings`);
}

const members = await getOrgMembers(domain);
const members = await getOrgMembers();
if (isServiceError(members)) {
throw new ServiceErrorException(members);
}

const invites = await getOrgInvites(domain);
const invites = await getOrgInvites();
if (isServiceError(invites)) {
throw new ServiceErrorException(invites);
}

const requests = await getOrgAccountRequests(domain);
const requests = await getOrgAccountRequests();
if (isServiceError(requests)) {
throw new ServiceErrorException(requests);
}
Expand Down
3 changes: 1 addition & 2 deletions packages/web/src/app/components/anonymousAccessToggle.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,7 +3,6 @@
import { useState } from "react"
import { Switch } from "@/components/ui/switch"
import { setAnonymousAccessStatus } from "@/actions"
import { SINGLE_TENANT_ORG_DOMAIN } from "@/lib/constants"
import { isServiceError } from "@/lib/utils"
import { useToast } from "@/components/hooks/use-toast"

Expand All@@ -22,7 +21,7 @@ export function AnonymousAccessToggle({ hasAnonymousAccessEntitlement, anonymous
const handleToggle = async (checked: boolean) => {
setIsLoading(true)
try {
const result = await setAnonymousAccessStatus(SINGLE_TENANT_ORG_DOMAIN, checked)
const result = await setAnonymousAccessStatus(checked)

if (isServiceError(result)) {
toast({
Expand Down
3 changes: 1 addition & 2 deletions packages/web/src/app/components/inviteLinkToggle.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,7 +6,6 @@ import { Input } from "@/components/ui/input"
import { Switch } from "@/components/ui/switch"
import { Copy, Check } from "lucide-react"
import { useToast } from "@/components/hooks/use-toast"
import { SINGLE_TENANT_ORG_DOMAIN } from "@/lib/constants"
import { setInviteLinkEnabled } from "@/actions"
import { isServiceError } from "@/lib/utils"

Expand All@@ -25,7 +24,7 @@ export function InviteLinkToggle({ inviteLinkEnabled, inviteLink }: InviteLinkTo
const handleToggle = async (checked: boolean) => {
setIsLoading(true)
try {
const result = await setInviteLinkEnabled(SINGLE_TENANT_ORG_DOMAIN, checked)
const result = await setInviteLinkEnabled(checked)

if (isServiceError(result)) {
toast({
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,7 +3,6 @@
import { useState } from "react"
import { Switch } from "@/components/ui/switch"
import { setMemberApprovalRequired } from "@/actions"
import { SINGLE_TENANT_ORG_DOMAIN } from "@/lib/constants"
import { isServiceError } from "@/lib/utils"
import { useToast } from "@/components/hooks/use-toast"

Expand All@@ -21,7 +20,7 @@ export function MemberApprovalRequiredToggle({ memberApprovalRequired, onToggleC
const handleToggle = async (checked: boolean) => {
setIsLoading(true)
try {
const result = await setMemberApprovalRequired(SINGLE_TENANT_ORG_DOMAIN, checked)
const result = await setMemberApprovalRequired(checked)

if (isServiceError(result)) {
toast({
Expand Down
9 changes: 4 additions & 5 deletions packages/web/src/app/invite/actions.ts
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,21 @@
"use server";

import { withAuth } from "@/actions";
import { isServiceError } from "@/lib/utils";
import { orgNotFound, ServiceError } from "@/lib/serviceError";
import { sew } from "@/actions";
import { addUserToOrganization } from "@/lib/authUtils";
import { prisma } from "@/prisma";
import { withAuthV2_skipOrgMembershipCheck } from "@/withAuthV2";
import { StatusCodes } from "http-status-codes";
import { ErrorCode } from "@/lib/errorCodes";

export const joinOrganization = async (orgId: number, inviteLinkId?: string) => sew(async () =>
withAuth(async (userId) => {
withAuthV2_skipOrgMembershipCheck(async ({ user, prisma }) => {
const org = await prisma.org.findUnique({
where: {
id: orgId,
},
});
Comment thread
coderabbitai[bot] marked this conversation as resolved.

if (!org) {
return orgNotFound();
}
Expand All@@ -40,7 +39,7 @@ export const joinOrganization = async (orgId: number, inviteLinkId?: string) =>
}
}

const addUserToOrgRes = await addUserToOrganization(userId, org.id);
const addUserToOrgRes = await addUserToOrganization(user.id, org.id);
if (isServiceError(addUserToOrgRes)) {
return addUserToOrgRes;
}
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,7 +4,6 @@ import { useState } from "react"
import { useRouter } from "next/navigation"
import { Button } from "@/components/ui/button"
import { completeOnboarding } from "@/actions"
import { SINGLE_TENANT_ORG_DOMAIN } from "@/lib/constants"
import { isServiceError } from "@/lib/utils"
import { useToast } from "@/components/hooks/use-toast"

Expand All@@ -17,7 +16,7 @@ export function CompleteOnboardingButton() {
setIsLoading(true)

try {
const result = await completeOnboarding(SINGLE_TENANT_ORG_DOMAIN)
const result = await completeOnboarding()

if (isServiceError(result)) {
toast({
Expand Down
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
653 changes: 253 additions & 400 deletions packages/web/src/actions.ts

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion packages/web/src/app/[domain]/chat/[id]/page.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -104,7 +104,7 @@ export default async function Page(props: PageProps) {

const languageModels = await getConfiguredLanguageModelsInfo();
const repos = await getRepos();
const searchContexts = await getSearchContexts(params.domain);
const searchContexts = await getSearchContexts();
const chatInfo = await getChatInfo({ chatId: params.id });
const chatHistory = session ? await getUserChatHistory() : [];

Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/app/[domain]/chat/page.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -27,7 +27,7 @@ interface PageProps {
export default async function Page(props: PageProps) {
const params = await props.params;
const languageModels = await getConfiguredLanguageModelsInfo();
const searchContexts = await getSearchContexts(params.domain);
const searchContexts = await getSearchContexts();
const allRepos = await getRepos();
const session = await auth();
const chatHistory = session ? await getUserChatHistory() : [];
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -33,7 +33,7 @@ export const NavigationMenu = async ({
throw new ServiceErrorException(repoStats);
}

const role = isAuthenticated ? await getCurrentUserRole(domain) : null;
const role = isAuthenticated ? await getCurrentUserRole() : null;
if (isServiceError(role)) {
throw new ServiceErrorException(role);
}
Expand All@@ -43,7 +43,7 @@ export const NavigationMenu = async ({
return null;
}

const joinRequests = await getOrgAccountRequests(domain);
const joinRequests = await getOrgAccountRequests();
if (isServiceError(joinRequests)) {
throw new ServiceErrorException(joinRequests);
}
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -107,7 +107,7 @@ export const useSuggestionsData = ({

const { data: searchContextSuggestions, isLoading: _isLoadingSearchContexts } = useQuery({
queryKey: ["searchContexts", domain],
queryFn: () => getSearchContexts(domain),
queryFn: () => getSearchContexts(),
select: (data): Suggestion[] => {
if (isServiceError(data)) {
return [];
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/app/[domain]/repos/[id]/page.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -52,7 +52,7 @@ export default async function RepoDetailPage({ params }: { params: Promise<{ id:

const repoMetadata = repoMetadataSchema.parse(repo.metadata);

const userRole = await getCurrentUserRole(SINGLE_TENANT_ORG_DOMAIN);
const userRole = await getCurrentUserRole();
if (isServiceError(userRole)) {
throw new ServiceErrorException(userRole);
}
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/app/[domain]/repos/layout.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -24,7 +24,7 @@ export default async function Layout(
throw new ServiceErrorException(repoStats);
}

const userRoleInOrg = await getCurrentUserRole(domain);
const userRoleInOrg = await getCurrentUserRole();

return (
<div className="min-h-screen flex flex-col">
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,7 +7,6 @@ import { Input } from "@/components/ui/input";
import { isServiceError } from "@/lib/utils";
import { Copy, Check, AlertTriangle, Loader2, Plus } from "lucide-react";
import { useCallback, useEffect, useMemo, useState } from "react";
import { useDomain } from "@/hooks/useDomain";
import { useToast } from "@/components/hooks/use-toast";
import useCaptureEvent from "@/hooks/useCaptureEvent";
import { DataTable } from "@/components/ui/data-table";
Expand All@@ -16,7 +15,6 @@ import { Skeleton } from "@/components/ui/skeleton";
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip";

export function ApiKeysPage({ canCreateApiKey }: { canCreateApiKey: boolean }) {
const domain = useDomain();
const { toast } = useToast();
const captureEvent = useCaptureEvent();

Expand All@@ -33,7 +31,7 @@ export function ApiKeysPage({ canCreateApiKey }: { canCreateApiKey: boolean }) {
setIsLoading(true);
setError(null);
try {
const keys = await getUserApiKeys(domain);
const keys = await getUserApiKeys();
if (isServiceError(keys)) {
setError("Failed to load API keys");
toast({
Expand All@@ -55,7 +53,7 @@ export function ApiKeysPage({ canCreateApiKey }: { canCreateApiKey: boolean }) {
} finally {
setIsLoading(false);
}
}, [domain, toast]);
}, [toast]);

useEffect(() => {
loadApiKeys();
Expand All@@ -73,7 +71,7 @@ export function ApiKeysPage({ canCreateApiKey }: { canCreateApiKey: boolean }) {

setIsCreatingKey(true);
try {
const result = await createApiKey(newKeyName.trim(), domain);
const result = await createApiKey(newKeyName.trim());
if (isServiceError(result)) {
toast({
title: "Error",
Expand Down
4 changes: 1 addition & 3 deletions packages/web/src/app/[domain]/settings/apiKeys/columns.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,7 +4,6 @@ import { ColumnDef } from "@tanstack/react-table"
import { ArrowUpDown, Key, Trash2 } from "lucide-react"
import { Button } from "@/components/ui/button"
import { deleteApiKey } from "@/actions"
import { useParams } from "next/navigation"
import {
AlertDialog,
AlertDialogAction,
Expand All@@ -27,14 +26,13 @@ export type ApiKeyColumnInfo = {

// Component for the actions cell to properly use React hooks
function ApiKeyActions({ apiKey }: { apiKey: ApiKeyColumnInfo }) {
const params = useParams<{ domain: string }>()
const [isPending, setIsPending] = useState(false)
const { toast } = useToast()

const handleDelete = async () => {
setIsPending(true)
try {
await deleteApiKey(apiKey.name, params.domain)
await deleteApiKey(apiKey.name)
window.location.reload()
} catch (error) {
console.error("Failed to delete API key", error)
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/app/[domain]/settings/layout.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -70,7 +70,7 @@ export const getSidebarNavItems = async () =>
withAuthV2(async ({ role }) => {
let numJoinRequests: number | undefined;
if (role === OrgRole.OWNER) {
const requests = await getOrgAccountRequests(SINGLE_TENANT_ORG_DOMAIN);
const requests = await getOrgAccountRequests();
if (isServiceError(requests)) {
throw new ServiceErrorException(requests);
}
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/app/[domain]/settings/license/page.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -75,7 +75,7 @@ export default async function LicensePage(props: LicensePageProps) {
)
}

const members = await getOrgMembers(domain);
const members = await getOrgMembers();
if (isServiceError(members)) {
throw new ServiceErrorException(members);
}
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -12,7 +12,6 @@ import { PlusCircleIcon, Loader2, AlertCircle } from "lucide-react";
import { OrgRole } from "@prisma/client";
import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle } from "@/components/ui/alert-dialog";
import { createInvites } from "@/actions";
import { useDomain } from "@/hooks/useDomain";
import { isServiceError } from "@/lib/utils";
import { useToast } from "@/components/hooks/use-toast";
import { useRouter } from "next/navigation";
Expand All@@ -35,8 +34,7 @@ interface InviteMemberCardProps {
export const InviteMemberCard = ({ currentUserRole, seatsAvailable = true }: InviteMemberCardProps) => {
const [isInviteDialogOpen, setIsInviteDialogOpen] = useState(false);
const [isLoading, setIsLoading] = useState(false);
const domain = useDomain();
const { toast } = useToast();
const { toast } = useToast();
const router = useRouter();
const captureEvent = useCaptureEvent();

Expand All@@ -54,7 +52,7 @@ export const InviteMemberCard = ({ currentUserRole, seatsAvailable = true }: Inv

const onSubmit = useCallback((data: z.infer<typeof inviteMemberFormSchema>) => {
setIsLoading(true);
createInvites(data.emails.map(e => e.email), domain)
createInvites(data.emails.map(e => e.email))
.then((res) => {
if (isServiceError(res)) {
toast({
Expand All@@ -78,7 +76,7 @@ export const InviteMemberCard = ({ currentUserRole, seatsAvailable = true }: Inv
.finally(() => {
setIsLoading(false);
});
}, [domain, form, toast, router, captureEvent]);
}, [form, toast, router, captureEvent]);

const isDisabled = !seatsAvailable || currentUserRole !== OrgRole.OWNER || isLoading;

Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,7 +14,6 @@ import { Copy, MoreVertical, Search } from "lucide-react";
import { useCallback, useMemo, useState } from "react";
import { cancelInvite } from "@/actions";
import { useRouter } from "next/navigation";
import { useDomain } from "@/hooks/useDomain";
import useCaptureEvent from "@/hooks/useCaptureEvent";
interface Invite {
id: string;
Expand All@@ -34,7 +33,6 @@ export const InvitesList = ({ invites, currentUserRole }: InviteListProps) => {
const [inviteToCancel, setInviteToCancel] = useState<Invite | null>(null)
const { toast } = useToast();
const router = useRouter();
const domain = useDomain();
const captureEvent = useCaptureEvent();

const filteredInvites = useMemo(() => {
Expand All@@ -53,7 +51,7 @@ export const InvitesList = ({ invites, currentUserRole }: InviteListProps) => {
}, [invites, searchQuery, dateSort]);

const onCancelInvite = useCallback((inviteId: string) => {
cancelInvite(inviteId, domain)
cancelInvite(inviteId)
.then((response) => {
if (isServiceError(response)) {
toast({
Expand All@@ -70,7 +68,7 @@ export const InvitesList = ({ invites, currentUserRole }: InviteListProps) => {
router.refresh();
}
});
}, [domain, toast, router, captureEvent]);
}, [toast, router, captureEvent]);

return (
<div className="w-full mx-auto space-y-6">
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,7 +13,6 @@ import { CheckCircle, Search, XCircle } from "lucide-react";
import { useCallback, useMemo, useState } from "react";
import { approveAccountRequest, rejectAccountRequest } from "@/actions";
import { useRouter } from "next/navigation";
import { useDomain } from "@/hooks/useDomain";
import useCaptureEvent from "@/hooks/useCaptureEvent";

interface Request {
Expand All@@ -36,7 +35,6 @@ export const RequestsList = ({ requests, currentUserRole }: RequestsListProps) =
const [requestToAction, setRequestToAction] = useState<Request | null>(null)
const { toast } = useToast();
const router = useRouter();
const domain = useDomain();
const captureEvent = useCaptureEvent();

const filteredRequests = useMemo(() => {
Expand All@@ -56,7 +54,7 @@ export const RequestsList = ({ requests, currentUserRole }: RequestsListProps) =
}, [requests, searchQuery, dateSort]);

const onApproveRequest = useCallback((requestId: string) => {
approveAccountRequest(requestId, domain)
approveAccountRequest(requestId)
.then((response) => {
if (isServiceError(response)) {
toast({
Expand All@@ -73,10 +71,10 @@ export const RequestsList = ({ requests, currentUserRole }: RequestsListProps) =
router.refresh();
}
});
}, [domain, toast, router, captureEvent]);
}, [toast, router, captureEvent]);

const onRejectRequest = useCallback((requestId: string) => {
rejectAccountRequest(requestId, domain)
rejectAccountRequest(requestId)
.then((response) => {
if (isServiceError(response)) {
toast({
Expand All@@ -93,7 +91,7 @@ export const RequestsList = ({ requests, currentUserRole }: RequestsListProps) =
router.refresh();
}
});
}, [domain, toast, router, captureEvent]);
}, [toast, router, captureEvent]);

return (
<div className="w-full mx-auto space-y-6">
Expand Down
6 changes: 3 additions & 3 deletions packages/web/src/app/[domain]/settings/members/page.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -56,17 +56,17 @@ export default async function MembersSettingsPage(props: MembersSettingsPageProp
redirect(`/${domain}/settings`);
}

const members = await getOrgMembers(domain);
const members = await getOrgMembers();
if (isServiceError(members)) {
throw new ServiceErrorException(members);
}

const invites = await getOrgInvites(domain);
const invites = await getOrgInvites();
if (isServiceError(invites)) {
throw new ServiceErrorException(invites);
}

const requests = await getOrgAccountRequests(domain);
const requests = await getOrgAccountRequests();
if (isServiceError(requests)) {
throw new ServiceErrorException(requests);
}
Expand Down
3 changes: 1 addition & 2 deletions packages/web/src/app/components/anonymousAccessToggle.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,7 +3,6 @@
import { useState } from "react"
import { Switch } from "@/components/ui/switch"
import { setAnonymousAccessStatus } from "@/actions"
import { SINGLE_TENANT_ORG_DOMAIN } from "@/lib/constants"
import { isServiceError } from "@/lib/utils"
import { useToast } from "@/components/hooks/use-toast"

Expand All@@ -22,7 +21,7 @@ export function AnonymousAccessToggle({ hasAnonymousAccessEntitlement, anonymous
const handleToggle = async (checked: boolean) => {
setIsLoading(true)
try {
const result = await setAnonymousAccessStatus(SINGLE_TENANT_ORG_DOMAIN, checked)
const result = await setAnonymousAccessStatus(checked)

if (isServiceError(result)) {
toast({
Expand Down
3 changes: 1 addition & 2 deletions packages/web/src/app/components/inviteLinkToggle.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,7 +6,6 @@ import { Input } from "@/components/ui/input"
import { Switch } from "@/components/ui/switch"
import { Copy, Check } from "lucide-react"
import { useToast } from "@/components/hooks/use-toast"
import { SINGLE_TENANT_ORG_DOMAIN } from "@/lib/constants"
import { setInviteLinkEnabled } from "@/actions"
import { isServiceError } from "@/lib/utils"

Expand All@@ -25,7 +24,7 @@ export function InviteLinkToggle({ inviteLinkEnabled, inviteLink }: InviteLinkTo
const handleToggle = async (checked: boolean) => {
setIsLoading(true)
try {
const result = await setInviteLinkEnabled(SINGLE_TENANT_ORG_DOMAIN, checked)
const result = await setInviteLinkEnabled(checked)

if (isServiceError(result)) {
toast({
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,7 +3,6 @@
import { useState } from "react"
import { Switch } from "@/components/ui/switch"
import { setMemberApprovalRequired } from "@/actions"
import { SINGLE_TENANT_ORG_DOMAIN } from "@/lib/constants"
import { isServiceError } from "@/lib/utils"
import { useToast } from "@/components/hooks/use-toast"

Expand All@@ -21,7 +20,7 @@ export function MemberApprovalRequiredToggle({ memberApprovalRequired, onToggleC
const handleToggle = async (checked: boolean) => {
setIsLoading(true)
try {
const result = await setMemberApprovalRequired(SINGLE_TENANT_ORG_DOMAIN, checked)
const result = await setMemberApprovalRequired(checked)

if (isServiceError(result)) {
toast({
Expand Down
9 changes: 4 additions & 5 deletions packages/web/src/app/invite/actions.ts
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,21 @@
"use server";

import { withAuth } from "@/actions";
import { isServiceError } from "@/lib/utils";
import { orgNotFound, ServiceError } from "@/lib/serviceError";
import { sew } from "@/actions";
import { addUserToOrganization } from "@/lib/authUtils";
import { prisma } from "@/prisma";
import { withAuthV2_skipOrgMembershipCheck } from "@/withAuthV2";
import { StatusCodes } from "http-status-codes";
import { ErrorCode } from "@/lib/errorCodes";

export const joinOrganization = async (orgId: number, inviteLinkId?: string) => sew(async () =>
withAuth(async (userId) => {
withAuthV2_skipOrgMembershipCheck(async ({ user, prisma }) => {
const org = await prisma.org.findUnique({
where: {
id: orgId,
},
});
Comment thread
coderabbitai[bot] marked this conversation as resolved.

if (!org) {
return orgNotFound();
}
Expand All@@ -40,7 +39,7 @@ export const joinOrganization = async (orgId: number, inviteLinkId?: string) =>
}
}

const addUserToOrgRes = await addUserToOrganization(userId, org.id);
const addUserToOrgRes = await addUserToOrganization(user.id, org.id);
if (isServiceError(addUserToOrgRes)) {
return addUserToOrgRes;
}
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,7 +4,6 @@ import { useState } from "react"
import { useRouter } from "next/navigation"
import { Button } from "@/components/ui/button"
import { completeOnboarding } from "@/actions"
import { SINGLE_TENANT_ORG_DOMAIN } from "@/lib/constants"
import { isServiceError } from "@/lib/utils"
import { useToast } from "@/components/hooks/use-toast"

Expand All@@ -17,7 +16,7 @@ export function CompleteOnboardingButton() {
setIsLoading(true)

try {
const result = await completeOnboarding(SINGLE_TENANT_ORG_DOMAIN)
const result = await completeOnboarding()

if (isServiceError(result)) {
toast({
Expand Down
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
653 changes: 253 additions & 400 deletions packages/web/src/actions.ts

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion packages/web/src/app/[domain]/chat/[id]/page.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -104,7 +104,7 @@ export default async function Page(props: PageProps) {

const languageModels = await getConfiguredLanguageModelsInfo();
const repos = await getRepos();
const searchContexts = await getSearchContexts(params.domain);
const searchContexts = await getSearchContexts();
const chatInfo = await getChatInfo({ chatId: params.id });
const chatHistory = session ? await getUserChatHistory() : [];

Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/app/[domain]/chat/page.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -27,7 +27,7 @@ interface PageProps {
export default async function Page(props: PageProps) {
const params = await props.params;
const languageModels = await getConfiguredLanguageModelsInfo();
const searchContexts = await getSearchContexts(params.domain);
const searchContexts = await getSearchContexts();
const allRepos = await getRepos();
const session = await auth();
const chatHistory = session ? await getUserChatHistory() : [];
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -33,7 +33,7 @@ export const NavigationMenu = async ({
throw new ServiceErrorException(repoStats);
}

const role = isAuthenticated ? await getCurrentUserRole(domain) : null;
const role = isAuthenticated ? await getCurrentUserRole() : null;
if (isServiceError(role)) {
throw new ServiceErrorException(role);
}
Expand All@@ -43,7 +43,7 @@ export const NavigationMenu = async ({
return null;
}

const joinRequests = await getOrgAccountRequests(domain);
const joinRequests = await getOrgAccountRequests();
if (isServiceError(joinRequests)) {
throw new ServiceErrorException(joinRequests);
}
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -107,7 +107,7 @@ export const useSuggestionsData = ({

const { data: searchContextSuggestions, isLoading: _isLoadingSearchContexts } = useQuery({
queryKey: ["searchContexts", domain],
queryFn: () => getSearchContexts(domain),
queryFn: () => getSearchContexts(),
select: (data): Suggestion[] => {
if (isServiceError(data)) {
return [];
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/app/[domain]/repos/[id]/page.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -52,7 +52,7 @@ export default async function RepoDetailPage({ params }: { params: Promise<{ id:

const repoMetadata = repoMetadataSchema.parse(repo.metadata);

const userRole = await getCurrentUserRole(SINGLE_TENANT_ORG_DOMAIN);
const userRole = await getCurrentUserRole();
if (isServiceError(userRole)) {
throw new ServiceErrorException(userRole);
}
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/app/[domain]/repos/layout.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -24,7 +24,7 @@ export default async function Layout(
throw new ServiceErrorException(repoStats);
}

const userRoleInOrg = await getCurrentUserRole(domain);
const userRoleInOrg = await getCurrentUserRole();

return (
<div className="min-h-screen flex flex-col">
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,7 +7,6 @@ import { Input } from "@/components/ui/input";
import { isServiceError } from "@/lib/utils";
import { Copy, Check, AlertTriangle, Loader2, Plus } from "lucide-react";
import { useCallback, useEffect, useMemo, useState } from "react";
import { useDomain } from "@/hooks/useDomain";
import { useToast } from "@/components/hooks/use-toast";
import useCaptureEvent from "@/hooks/useCaptureEvent";
import { DataTable } from "@/components/ui/data-table";
Expand All@@ -16,7 +15,6 @@ import { Skeleton } from "@/components/ui/skeleton";
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip";

export function ApiKeysPage({ canCreateApiKey }: { canCreateApiKey: boolean }) {
const domain = useDomain();
const { toast } = useToast();
const captureEvent = useCaptureEvent();

Expand All@@ -33,7 +31,7 @@ export function ApiKeysPage({ canCreateApiKey }: { canCreateApiKey: boolean }) {
setIsLoading(true);
setError(null);
try {
const keys = await getUserApiKeys(domain);
const keys = await getUserApiKeys();
if (isServiceError(keys)) {
setError("Failed to load API keys");
toast({
Expand All@@ -55,7 +53,7 @@ export function ApiKeysPage({ canCreateApiKey }: { canCreateApiKey: boolean }) {
} finally {
setIsLoading(false);
}
}, [domain, toast]);
}, [toast]);

useEffect(() => {
loadApiKeys();
Expand All@@ -73,7 +71,7 @@ export function ApiKeysPage({ canCreateApiKey }: { canCreateApiKey: boolean }) {

setIsCreatingKey(true);
try {
const result = await createApiKey(newKeyName.trim(), domain);
const result = await createApiKey(newKeyName.trim());
if (isServiceError(result)) {
toast({
title: "Error",
Expand Down
4 changes: 1 addition & 3 deletions packages/web/src/app/[domain]/settings/apiKeys/columns.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,7 +4,6 @@ import { ColumnDef } from "@tanstack/react-table"
import { ArrowUpDown, Key, Trash2 } from "lucide-react"
import { Button } from "@/components/ui/button"
import { deleteApiKey } from "@/actions"
import { useParams } from "next/navigation"
import {
AlertDialog,
AlertDialogAction,
Expand All@@ -27,14 +26,13 @@ export type ApiKeyColumnInfo = {

// Component for the actions cell to properly use React hooks
function ApiKeyActions({ apiKey }: { apiKey: ApiKeyColumnInfo }) {
const params = useParams<{ domain: string }>()
const [isPending, setIsPending] = useState(false)
const { toast } = useToast()

const handleDelete = async () => {
setIsPending(true)
try {
await deleteApiKey(apiKey.name, params.domain)
await deleteApiKey(apiKey.name)
window.location.reload()
} catch (error) {
console.error("Failed to delete API key", error)
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/app/[domain]/settings/layout.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -70,7 +70,7 @@ export const getSidebarNavItems = async () =>
withAuthV2(async ({ role }) => {
let numJoinRequests: number | undefined;
if (role === OrgRole.OWNER) {
const requests = await getOrgAccountRequests(SINGLE_TENANT_ORG_DOMAIN);
const requests = await getOrgAccountRequests();
if (isServiceError(requests)) {
throw new ServiceErrorException(requests);
}
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/app/[domain]/settings/license/page.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -75,7 +75,7 @@ export default async function LicensePage(props: LicensePageProps) {
)
}

const members = await getOrgMembers(domain);
const members = await getOrgMembers();
if (isServiceError(members)) {
throw new ServiceErrorException(members);
}
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -12,7 +12,6 @@ import { PlusCircleIcon, Loader2, AlertCircle } from "lucide-react";
import { OrgRole } from "@prisma/client";
import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle } from "@/components/ui/alert-dialog";
import { createInvites } from "@/actions";
import { useDomain } from "@/hooks/useDomain";
import { isServiceError } from "@/lib/utils";
import { useToast } from "@/components/hooks/use-toast";
import { useRouter } from "next/navigation";
Expand All@@ -35,8 +34,7 @@ interface InviteMemberCardProps {
export const InviteMemberCard = ({ currentUserRole, seatsAvailable = true }: InviteMemberCardProps) => {
const [isInviteDialogOpen, setIsInviteDialogOpen] = useState(false);
const [isLoading, setIsLoading] = useState(false);
const domain = useDomain();
const { toast } = useToast();
const { toast } = useToast();
const router = useRouter();
const captureEvent = useCaptureEvent();

Expand All@@ -54,7 +52,7 @@ export const InviteMemberCard = ({ currentUserRole, seatsAvailable = true }: Inv

const onSubmit = useCallback((data: z.infer<typeof inviteMemberFormSchema>) => {
setIsLoading(true);
createInvites(data.emails.map(e => e.email), domain)
createInvites(data.emails.map(e => e.email))
.then((res) => {
if (isServiceError(res)) {
toast({
Expand All@@ -78,7 +76,7 @@ export const InviteMemberCard = ({ currentUserRole, seatsAvailable = true }: Inv
.finally(() => {
setIsLoading(false);
});
}, [domain, form, toast, router, captureEvent]);
}, [form, toast, router, captureEvent]);

const isDisabled = !seatsAvailable || currentUserRole !== OrgRole.OWNER || isLoading;

Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,7 +14,6 @@ import { Copy, MoreVertical, Search } from "lucide-react";
import { useCallback, useMemo, useState } from "react";
import { cancelInvite } from "@/actions";
import { useRouter } from "next/navigation";
import { useDomain } from "@/hooks/useDomain";
import useCaptureEvent from "@/hooks/useCaptureEvent";
interface Invite {
id: string;
Expand All@@ -34,7 +33,6 @@ export const InvitesList = ({ invites, currentUserRole }: InviteListProps) => {
const [inviteToCancel, setInviteToCancel] = useState<Invite | null>(null)
const { toast } = useToast();
const router = useRouter();
const domain = useDomain();
const captureEvent = useCaptureEvent();

const filteredInvites = useMemo(() => {
Expand All@@ -53,7 +51,7 @@ export const InvitesList = ({ invites, currentUserRole }: InviteListProps) => {
}, [invites, searchQuery, dateSort]);

const onCancelInvite = useCallback((inviteId: string) => {
cancelInvite(inviteId, domain)
cancelInvite(inviteId)
.then((response) => {
if (isServiceError(response)) {
toast({
Expand All@@ -70,7 +68,7 @@ export const InvitesList = ({ invites, currentUserRole }: InviteListProps) => {
router.refresh();
}
});
}, [domain, toast, router, captureEvent]);
}, [toast, router, captureEvent]);

return (
<div className="w-full mx-auto space-y-6">
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,7 +13,6 @@ import { CheckCircle, Search, XCircle } from "lucide-react";
import { useCallback, useMemo, useState } from "react";
import { approveAccountRequest, rejectAccountRequest } from "@/actions";
import { useRouter } from "next/navigation";
import { useDomain } from "@/hooks/useDomain";
import useCaptureEvent from "@/hooks/useCaptureEvent";

interface Request {
Expand All@@ -36,7 +35,6 @@ export const RequestsList = ({ requests, currentUserRole }: RequestsListProps) =
const [requestToAction, setRequestToAction] = useState<Request | null>(null)
const { toast } = useToast();
const router = useRouter();
const domain = useDomain();
const captureEvent = useCaptureEvent();

const filteredRequests = useMemo(() => {
Expand All@@ -56,7 +54,7 @@ export const RequestsList = ({ requests, currentUserRole }: RequestsListProps) =
}, [requests, searchQuery, dateSort]);

const onApproveRequest = useCallback((requestId: string) => {
approveAccountRequest(requestId, domain)
approveAccountRequest(requestId)
.then((response) => {
if (isServiceError(response)) {
toast({
Expand All@@ -73,10 +71,10 @@ export const RequestsList = ({ requests, currentUserRole }: RequestsListProps) =
router.refresh();
}
});
}, [domain, toast, router, captureEvent]);
}, [toast, router, captureEvent]);

const onRejectRequest = useCallback((requestId: string) => {
rejectAccountRequest(requestId, domain)
rejectAccountRequest(requestId)
.then((response) => {
if (isServiceError(response)) {
toast({
Expand All@@ -93,7 +91,7 @@ export const RequestsList = ({ requests, currentUserRole }: RequestsListProps) =
router.refresh();
}
});
}, [domain, toast, router, captureEvent]);
}, [toast, router, captureEvent]);

return (
<div className="w-full mx-auto space-y-6">
Expand Down
6 changes: 3 additions & 3 deletions packages/web/src/app/[domain]/settings/members/page.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -56,17 +56,17 @@ export default async function MembersSettingsPage(props: MembersSettingsPageProp
redirect(`/${domain}/settings`);
}

const members = await getOrgMembers(domain);
const members = await getOrgMembers();
if (isServiceError(members)) {
throw new ServiceErrorException(members);
}

const invites = await getOrgInvites(domain);
const invites = await getOrgInvites();
if (isServiceError(invites)) {
throw new ServiceErrorException(invites);
}

const requests = await getOrgAccountRequests(domain);
const requests = await getOrgAccountRequests();
if (isServiceError(requests)) {
throw new ServiceErrorException(requests);
}
Expand Down
3 changes: 1 addition & 2 deletions packages/web/src/app/components/anonymousAccessToggle.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,7 +3,6 @@
import { useState } from "react"
import { Switch } from "@/components/ui/switch"
import { setAnonymousAccessStatus } from "@/actions"
import { SINGLE_TENANT_ORG_DOMAIN } from "@/lib/constants"
import { isServiceError } from "@/lib/utils"
import { useToast } from "@/components/hooks/use-toast"

Expand All@@ -22,7 +21,7 @@ export function AnonymousAccessToggle({ hasAnonymousAccessEntitlement, anonymous
const handleToggle = async (checked: boolean) => {
setIsLoading(true)
try {
const result = await setAnonymousAccessStatus(SINGLE_TENANT_ORG_DOMAIN, checked)
const result = await setAnonymousAccessStatus(checked)

if (isServiceError(result)) {
toast({
Expand Down
3 changes: 1 addition & 2 deletions packages/web/src/app/components/inviteLinkToggle.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,7 +6,6 @@ import { Input } from "@/components/ui/input"
import { Switch } from "@/components/ui/switch"
import { Copy, Check } from "lucide-react"
import { useToast } from "@/components/hooks/use-toast"
import { SINGLE_TENANT_ORG_DOMAIN } from "@/lib/constants"
import { setInviteLinkEnabled } from "@/actions"
import { isServiceError } from "@/lib/utils"

Expand All@@ -25,7 +24,7 @@ export function InviteLinkToggle({ inviteLinkEnabled, inviteLink }: InviteLinkTo
const handleToggle = async (checked: boolean) => {
setIsLoading(true)
try {
const result = await setInviteLinkEnabled(SINGLE_TENANT_ORG_DOMAIN, checked)
const result = await setInviteLinkEnabled(checked)

if (isServiceError(result)) {
toast({
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,7 +3,6 @@
import { useState } from "react"
import { Switch } from "@/components/ui/switch"
import { setMemberApprovalRequired } from "@/actions"
import { SINGLE_TENANT_ORG_DOMAIN } from "@/lib/constants"
import { isServiceError } from "@/lib/utils"
import { useToast } from "@/components/hooks/use-toast"

Expand All@@ -21,7 +20,7 @@ export function MemberApprovalRequiredToggle({ memberApprovalRequired, onToggleC
const handleToggle = async (checked: boolean) => {
setIsLoading(true)
try {
const result = await setMemberApprovalRequired(SINGLE_TENANT_ORG_DOMAIN, checked)
const result = await setMemberApprovalRequired(checked)

if (isServiceError(result)) {
toast({
Expand Down
9 changes: 4 additions & 5 deletions packages/web/src/app/invite/actions.ts
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,21 @@
"use server";

import { withAuth } from "@/actions";
import { isServiceError } from "@/lib/utils";
import { orgNotFound, ServiceError } from "@/lib/serviceError";
import { sew } from "@/actions";
import { addUserToOrganization } from "@/lib/authUtils";
import { prisma } from "@/prisma";
import { withAuthV2_skipOrgMembershipCheck } from "@/withAuthV2";
import { StatusCodes } from "http-status-codes";
import { ErrorCode } from "@/lib/errorCodes";

export const joinOrganization = async (orgId: number, inviteLinkId?: string) => sew(async () =>
withAuth(async (userId) => {
withAuthV2_skipOrgMembershipCheck(async ({ user, prisma }) => {
const org = await prisma.org.findUnique({
where: {
id: orgId,
},
});
Comment thread
coderabbitai[bot] marked this conversation as resolved.

if (!org) {
return orgNotFound();
}
Expand All@@ -40,7 +39,7 @@ export const joinOrganization = async (orgId: number, inviteLinkId?: string) =>
}
}

const addUserToOrgRes = await addUserToOrganization(userId, org.id);
const addUserToOrgRes = await addUserToOrganization(user.id, org.id);
if (isServiceError(addUserToOrgRes)) {
return addUserToOrgRes;
}
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,7 +4,6 @@ import { useState } from "react"
import { useRouter } from "next/navigation"
import { Button } from "@/components/ui/button"
import { completeOnboarding } from "@/actions"
import { SINGLE_TENANT_ORG_DOMAIN } from "@/lib/constants"
import { isServiceError } from "@/lib/utils"
import { useToast } from "@/components/hooks/use-toast"

Expand All@@ -17,7 +16,7 @@ export function CompleteOnboardingButton() {
setIsLoading(true)

try {
const result = await completeOnboarding(SINGLE_TENANT_ORG_DOMAIN)
const result = await completeOnboarding()

if (isServiceError(result)) {
toast({
Expand Down
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
653 changes: 253 additions & 400 deletions packages/web/src/actions.ts

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion packages/web/src/app/[domain]/chat/[id]/page.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -104,7 +104,7 @@ export default async function Page(props: PageProps) {

const languageModels = await getConfiguredLanguageModelsInfo();
const repos = await getRepos();
const searchContexts = await getSearchContexts(params.domain);
const searchContexts = await getSearchContexts();
const chatInfo = await getChatInfo({ chatId: params.id });
const chatHistory = session ? await getUserChatHistory() : [];

Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/app/[domain]/chat/page.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -27,7 +27,7 @@ interface PageProps {
export default async function Page(props: PageProps) {
const params = await props.params;
const languageModels = await getConfiguredLanguageModelsInfo();
const searchContexts = await getSearchContexts(params.domain);
const searchContexts = await getSearchContexts();
const allRepos = await getRepos();
const session = await auth();
const chatHistory = session ? await getUserChatHistory() : [];
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -33,7 +33,7 @@ export const NavigationMenu = async ({
throw new ServiceErrorException(repoStats);
}

const role = isAuthenticated ? await getCurrentUserRole(domain) : null;
const role = isAuthenticated ? await getCurrentUserRole() : null;
if (isServiceError(role)) {
throw new ServiceErrorException(role);
}
Expand All@@ -43,7 +43,7 @@ export const NavigationMenu = async ({
return null;
}

const joinRequests = await getOrgAccountRequests(domain);
const joinRequests = await getOrgAccountRequests();
if (isServiceError(joinRequests)) {
throw new ServiceErrorException(joinRequests);
}
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -107,7 +107,7 @@ export const useSuggestionsData = ({

const { data: searchContextSuggestions, isLoading: _isLoadingSearchContexts } = useQuery({
queryKey: ["searchContexts", domain],
queryFn: () => getSearchContexts(domain),
queryFn: () => getSearchContexts(),
select: (data): Suggestion[] => {
if (isServiceError(data)) {
return [];
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/app/[domain]/repos/[id]/page.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -52,7 +52,7 @@ export default async function RepoDetailPage({ params }: { params: Promise<{ id:

const repoMetadata = repoMetadataSchema.parse(repo.metadata);

const userRole = await getCurrentUserRole(SINGLE_TENANT_ORG_DOMAIN);
const userRole = await getCurrentUserRole();
if (isServiceError(userRole)) {
throw new ServiceErrorException(userRole);
}
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/app/[domain]/repos/layout.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -24,7 +24,7 @@ export default async function Layout(
throw new ServiceErrorException(repoStats);
}

const userRoleInOrg = await getCurrentUserRole(domain);
const userRoleInOrg = await getCurrentUserRole();

return (
<div className="min-h-screen flex flex-col">
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -7,7 +7,6 @@ import { Input } from "@/components/ui/input";
import { isServiceError } from "@/lib/utils";
import { Copy, Check, AlertTriangle, Loader2, Plus } from "lucide-react";
import { useCallback, useEffect, useMemo, useState } from "react";
import { useDomain } from "@/hooks/useDomain";
import { useToast } from "@/components/hooks/use-toast";
import useCaptureEvent from "@/hooks/useCaptureEvent";
import { DataTable } from "@/components/ui/data-table";
Expand All@@ -16,7 +15,6 @@ import { Skeleton } from "@/components/ui/skeleton";
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip";

export function ApiKeysPage({ canCreateApiKey }: { canCreateApiKey: boolean }) {
const domain = useDomain();
const { toast } = useToast();
const captureEvent = useCaptureEvent();

Expand All@@ -33,7 +31,7 @@ export function ApiKeysPage({ canCreateApiKey }: { canCreateApiKey: boolean }) {
setIsLoading(true);
setError(null);
try {
const keys = await getUserApiKeys(domain);
const keys = await getUserApiKeys();
if (isServiceError(keys)) {
setError("Failed to load API keys");
toast({
Expand All@@ -55,7 +53,7 @@ export function ApiKeysPage({ canCreateApiKey }: { canCreateApiKey: boolean }) {
} finally {
setIsLoading(false);
}
}, [domain, toast]);
}, [toast]);

useEffect(() => {
loadApiKeys();
Expand All@@ -73,7 +71,7 @@ export function ApiKeysPage({ canCreateApiKey }: { canCreateApiKey: boolean }) {

setIsCreatingKey(true);
try {
const result = await createApiKey(newKeyName.trim(), domain);
const result = await createApiKey(newKeyName.trim());
if (isServiceError(result)) {
toast({
title: "Error",
Expand Down
4 changes: 1 addition & 3 deletions packages/web/src/app/[domain]/settings/apiKeys/columns.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,7 +4,6 @@ import { ColumnDef } from "@tanstack/react-table"
import { ArrowUpDown, Key, Trash2 } from "lucide-react"
import { Button } from "@/components/ui/button"
import { deleteApiKey } from "@/actions"
import { useParams } from "next/navigation"
import {
AlertDialog,
AlertDialogAction,
Expand All@@ -27,14 +26,13 @@ export type ApiKeyColumnInfo = {

// Component for the actions cell to properly use React hooks
function ApiKeyActions({ apiKey }: { apiKey: ApiKeyColumnInfo }) {
const params = useParams<{ domain: string }>()
const [isPending, setIsPending] = useState(false)
const { toast } = useToast()

const handleDelete = async () => {
setIsPending(true)
try {
await deleteApiKey(apiKey.name, params.domain)
await deleteApiKey(apiKey.name)
window.location.reload()
} catch (error) {
console.error("Failed to delete API key", error)
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/app/[domain]/settings/layout.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -70,7 +70,7 @@ export const getSidebarNavItems = async () =>
withAuthV2(async ({ role }) => {
let numJoinRequests: number | undefined;
if (role === OrgRole.OWNER) {
const requests = await getOrgAccountRequests(SINGLE_TENANT_ORG_DOMAIN);
const requests = await getOrgAccountRequests();
if (isServiceError(requests)) {
throw new ServiceErrorException(requests);
}
Expand Down
2 changes: 1 addition & 1 deletion packages/web/src/app/[domain]/settings/license/page.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -75,7 +75,7 @@ export default async function LicensePage(props: LicensePageProps) {
)
}

const members = await getOrgMembers(domain);
const members = await getOrgMembers();
if (isServiceError(members)) {
throw new ServiceErrorException(members);
}
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -12,7 +12,6 @@ import { PlusCircleIcon, Loader2, AlertCircle } from "lucide-react";
import { OrgRole } from "@prisma/client";
import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle } from "@/components/ui/alert-dialog";
import { createInvites } from "@/actions";
import { useDomain } from "@/hooks/useDomain";
import { isServiceError } from "@/lib/utils";
import { useToast } from "@/components/hooks/use-toast";
import { useRouter } from "next/navigation";
Expand All@@ -35,8 +34,7 @@ interface InviteMemberCardProps {
export const InviteMemberCard = ({ currentUserRole, seatsAvailable = true }: InviteMemberCardProps) => {
const [isInviteDialogOpen, setIsInviteDialogOpen] = useState(false);
const [isLoading, setIsLoading] = useState(false);
const domain = useDomain();
const { toast } = useToast();
const { toast } = useToast();
const router = useRouter();
const captureEvent = useCaptureEvent();

Expand All@@ -54,7 +52,7 @@ export const InviteMemberCard = ({ currentUserRole, seatsAvailable = true }: Inv

const onSubmit = useCallback((data: z.infer<typeof inviteMemberFormSchema>) => {
setIsLoading(true);
createInvites(data.emails.map(e => e.email), domain)
createInvites(data.emails.map(e => e.email))
.then((res) => {
if (isServiceError(res)) {
toast({
Expand All@@ -78,7 +76,7 @@ export const InviteMemberCard = ({ currentUserRole, seatsAvailable = true }: Inv
.finally(() => {
setIsLoading(false);
});
}, [domain, form, toast, router, captureEvent]);
}, [form, toast, router, captureEvent]);

const isDisabled = !seatsAvailable || currentUserRole !== OrgRole.OWNER || isLoading;

Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -14,7 +14,6 @@ import { Copy, MoreVertical, Search } from "lucide-react";
import { useCallback, useMemo, useState } from "react";
import { cancelInvite } from "@/actions";
import { useRouter } from "next/navigation";
import { useDomain } from "@/hooks/useDomain";
import useCaptureEvent from "@/hooks/useCaptureEvent";
interface Invite {
id: string;
Expand All@@ -34,7 +33,6 @@ export const InvitesList = ({ invites, currentUserRole }: InviteListProps) => {
const [inviteToCancel, setInviteToCancel] = useState<Invite | null>(null)
const { toast } = useToast();
const router = useRouter();
const domain = useDomain();
const captureEvent = useCaptureEvent();

const filteredInvites = useMemo(() => {
Expand All@@ -53,7 +51,7 @@ export const InvitesList = ({ invites, currentUserRole }: InviteListProps) => {
}, [invites, searchQuery, dateSort]);

const onCancelInvite = useCallback((inviteId: string) => {
cancelInvite(inviteId, domain)
cancelInvite(inviteId)
.then((response) => {
if (isServiceError(response)) {
toast({
Expand All@@ -70,7 +68,7 @@ export const InvitesList = ({ invites, currentUserRole }: InviteListProps) => {
router.refresh();
}
});
}, [domain, toast, router, captureEvent]);
}, [toast, router, captureEvent]);

return (
<div className="w-full mx-auto space-y-6">
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -13,7 +13,6 @@ import { CheckCircle, Search, XCircle } from "lucide-react";
import { useCallback, useMemo, useState } from "react";
import { approveAccountRequest, rejectAccountRequest } from "@/actions";
import { useRouter } from "next/navigation";
import { useDomain } from "@/hooks/useDomain";
import useCaptureEvent from "@/hooks/useCaptureEvent";

interface Request {
Expand All@@ -36,7 +35,6 @@ export const RequestsList = ({ requests, currentUserRole }: RequestsListProps) =
const [requestToAction, setRequestToAction] = useState<Request | null>(null)
const { toast } = useToast();
const router = useRouter();
const domain = useDomain();
const captureEvent = useCaptureEvent();

const filteredRequests = useMemo(() => {
Expand All@@ -56,7 +54,7 @@ export const RequestsList = ({ requests, currentUserRole }: RequestsListProps) =
}, [requests, searchQuery, dateSort]);

const onApproveRequest = useCallback((requestId: string) => {
approveAccountRequest(requestId, domain)
approveAccountRequest(requestId)
.then((response) => {
if (isServiceError(response)) {
toast({
Expand All@@ -73,10 +71,10 @@ export const RequestsList = ({ requests, currentUserRole }: RequestsListProps) =
router.refresh();
}
});
}, [domain, toast, router, captureEvent]);
}, [toast, router, captureEvent]);

const onRejectRequest = useCallback((requestId: string) => {
rejectAccountRequest(requestId, domain)
rejectAccountRequest(requestId)
.then((response) => {
if (isServiceError(response)) {
toast({
Expand All@@ -93,7 +91,7 @@ export const RequestsList = ({ requests, currentUserRole }: RequestsListProps) =
router.refresh();
}
});
}, [domain, toast, router, captureEvent]);
}, [toast, router, captureEvent]);

return (
<div className="w-full mx-auto space-y-6">
Expand Down
6 changes: 3 additions & 3 deletions packages/web/src/app/[domain]/settings/members/page.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -56,17 +56,17 @@ export default async function MembersSettingsPage(props: MembersSettingsPageProp
redirect(`/${domain}/settings`);
}

const members = await getOrgMembers(domain);
const members = await getOrgMembers();
if (isServiceError(members)) {
throw new ServiceErrorException(members);
}

const invites = await getOrgInvites(domain);
const invites = await getOrgInvites();
if (isServiceError(invites)) {
throw new ServiceErrorException(invites);
}

const requests = await getOrgAccountRequests(domain);
const requests = await getOrgAccountRequests();
if (isServiceError(requests)) {
throw new ServiceErrorException(requests);
}
Expand Down
3 changes: 1 addition & 2 deletions packages/web/src/app/components/anonymousAccessToggle.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,7 +3,6 @@
import { useState } from "react"
import { Switch } from "@/components/ui/switch"
import { setAnonymousAccessStatus } from "@/actions"
import { SINGLE_TENANT_ORG_DOMAIN } from "@/lib/constants"
import { isServiceError } from "@/lib/utils"
import { useToast } from "@/components/hooks/use-toast"

Expand All@@ -22,7 +21,7 @@ export function AnonymousAccessToggle({ hasAnonymousAccessEntitlement, anonymous
const handleToggle = async (checked: boolean) => {
setIsLoading(true)
try {
const result = await setAnonymousAccessStatus(SINGLE_TENANT_ORG_DOMAIN, checked)
const result = await setAnonymousAccessStatus(checked)

if (isServiceError(result)) {
toast({
Expand Down
3 changes: 1 addition & 2 deletions packages/web/src/app/components/inviteLinkToggle.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -6,7 +6,6 @@ import { Input } from "@/components/ui/input"
import { Switch } from "@/components/ui/switch"
import { Copy, Check } from "lucide-react"
import { useToast } from "@/components/hooks/use-toast"
import { SINGLE_TENANT_ORG_DOMAIN } from "@/lib/constants"
import { setInviteLinkEnabled } from "@/actions"
import { isServiceError } from "@/lib/utils"

Expand All@@ -25,7 +24,7 @@ export function InviteLinkToggle({ inviteLinkEnabled, inviteLink }: InviteLinkTo
const handleToggle = async (checked: boolean) => {
setIsLoading(true)
try {
const result = await setInviteLinkEnabled(SINGLE_TENANT_ORG_DOMAIN, checked)
const result = await setInviteLinkEnabled(checked)

if (isServiceError(result)) {
toast({
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,7 +3,6 @@
import { useState } from "react"
import { Switch } from "@/components/ui/switch"
import { setMemberApprovalRequired } from "@/actions"
import { SINGLE_TENANT_ORG_DOMAIN } from "@/lib/constants"
import { isServiceError } from "@/lib/utils"
import { useToast } from "@/components/hooks/use-toast"

Expand All@@ -21,7 +20,7 @@ export function MemberApprovalRequiredToggle({ memberApprovalRequired, onToggleC
const handleToggle = async (checked: boolean) => {
setIsLoading(true)
try {
const result = await setMemberApprovalRequired(SINGLE_TENANT_ORG_DOMAIN, checked)
const result = await setMemberApprovalRequired(checked)

if (isServiceError(result)) {
toast({
Expand Down
9 changes: 4 additions & 5 deletions packages/web/src/app/invite/actions.ts
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,21 @@
"use server";

import { withAuth } from "@/actions";
import { isServiceError } from "@/lib/utils";
import { orgNotFound, ServiceError } from "@/lib/serviceError";
import { sew } from "@/actions";
import { addUserToOrganization } from "@/lib/authUtils";
import { prisma } from "@/prisma";
import { withAuthV2_skipOrgMembershipCheck } from "@/withAuthV2";
import { StatusCodes } from "http-status-codes";
import { ErrorCode } from "@/lib/errorCodes";

export const joinOrganization = async (orgId: number, inviteLinkId?: string) => sew(async () =>
withAuth(async (userId) => {
withAuthV2_skipOrgMembershipCheck(async ({ user, prisma }) => {
const org = await prisma.org.findUnique({
where: {
id: orgId,
},
});
Comment thread
coderabbitai[bot] marked this conversation as resolved.

if (!org) {
return orgNotFound();
}
Expand All@@ -40,7 +39,7 @@ export const joinOrganization = async (orgId: number, inviteLinkId?: string) =>
}
}

const addUserToOrgRes = await addUserToOrganization(userId, org.id);
const addUserToOrgRes = await addUserToOrganization(user.id, org.id);
if (isServiceError(addUserToOrgRes)) {
return addUserToOrgRes;
}
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,7 +4,6 @@ import { useState } from "react"
import { useRouter } from "next/navigation"
import { Button } from "@/components/ui/button"
import { completeOnboarding } from "@/actions"
import { SINGLE_TENANT_ORG_DOMAIN } from "@/lib/constants"
import { isServiceError } from "@/lib/utils"
import { useToast } from "@/components/hooks/use-toast"

Expand All@@ -17,7 +16,7 @@ export function CompleteOnboardingButton() {
setIsLoading(true)

try {
const result = await completeOnboarding(SINGLE_TENANT_ORG_DOMAIN)
const result = await completeOnboarding()

if (isServiceError(result)) {
toast({
Expand Down
Loading
Loading