diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 46d8b141e..6a255ca00 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -70,13 +70,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Setup pnpm uses: pnpm/action-setup@v4 - name: Setup Node.js with cache - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: '20' cache: 'pnpm' @@ -85,11 +85,11 @@ jobs: run: pnpm install --frozen-lockfile - name: Cache Prisma Client - uses: actions/cache@v4 + uses: actions/cache@v5 id: prisma-cache-validate with: - path: node_modules/.prisma/client - key: prisma-${{ runner.os }}-${{ hashFiles('prisma/schema.prisma') }} + path: src/generated/prisma + key: prisma-${{ runner.os }}-${{ hashFiles('prisma/schema.prisma', 'pnpm-lock.yaml') }} - name: Generate Prisma client if: steps.prisma-cache-validate.outputs.cache-hit != 'true' @@ -140,13 +140,13 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Setup pnpm uses: pnpm/action-setup@v4 - name: Setup Node.js with cache - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: '20' cache: 'pnpm' @@ -155,11 +155,11 @@ jobs: run: pnpm install --frozen-lockfile - name: Cache Prisma Client - uses: actions/cache@v4 + uses: actions/cache@v5 id: prisma-cache-test with: - path: node_modules/.prisma/client - key: prisma-${{ runner.os }}-${{ hashFiles('prisma/schema.prisma') }} + path: src/generated/prisma + key: prisma-${{ runner.os }}-${{ hashFiles('prisma/schema.prisma', 'pnpm-lock.yaml') }} - name: Generate Prisma client if: steps.prisma-cache-test.outputs.cache-hit != 'true' @@ -207,7 +207,7 @@ jobs: cp -r .next/static .next/standalone/.next/static - name: Cache Playwright browsers - uses: actions/cache@v4 + uses: actions/cache@v5 id: playwright-cache with: path: ~/.cache/ms-playwright @@ -225,7 +225,7 @@ jobs: run: pnpm exec playwright test - name: Upload Playwright report - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 if: ${{ !cancelled() }} with: name: playwright-report @@ -233,7 +233,7 @@ jobs: retention-days: 14 - name: Upload test results - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 if: ${{ !cancelled() }} with: name: test-results @@ -251,13 +251,13 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 + uses: docker/setup-buildx-action@v4 - name: Log in to Container Registry - uses: docker/login-action@v3 + uses: docker/login-action@v4 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} @@ -265,7 +265,7 @@ jobs: - name: Extract metadata id: meta - uses: docker/metadata-action@v5 + uses: docker/metadata-action@v6 with: images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} tags: | @@ -288,7 +288,7 @@ jobs: - name: Build and push Docker image (Production - main branch) if: github.ref == 'refs/heads/main' - uses: docker/build-push-action@v5 + uses: docker/build-push-action@v7 with: context: . file: ./Dockerfile @@ -309,7 +309,7 @@ jobs: - name: Build and push Docker image (Staging branch) if: github.ref == 'refs/heads/staging' - uses: docker/build-push-action@v5 + uses: docker/build-push-action@v7 with: context: . file: ./Dockerfile @@ -330,7 +330,7 @@ jobs: - name: Build and push Docker image (PR/other branches) if: github.ref != 'refs/heads/main' && github.ref != 'refs/heads/staging' - uses: docker/build-push-action@v5 + uses: docker/build-push-action@v7 with: context: . file: ./Dockerfile diff --git a/.github/workflows/cleanup-images.yaml b/.github/workflows/cleanup-images.yaml index 888c2108b..5fb07e4b7 100644 --- a/.github/workflows/cleanup-images.yaml +++ b/.github/workflows/cleanup-images.yaml @@ -14,7 +14,7 @@ jobs: steps: - name: Delete PR images older than 14 days - uses: snok/container-retention-policy@v3 + uses: snok/container-retention-policy@v3.0.1 with: account: alan-turing-institute token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 2155644c8..1c23e9cb7 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -19,7 +19,7 @@ jobs: if: ${{ github.event.workflow_run.conclusion == 'success' }} steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: fetch-depth: 0 token: ${{ secrets.RELEASE_TOKEN }} @@ -28,7 +28,7 @@ jobs: uses: pnpm/action-setup@v4 - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: "20" cache: "pnpm" diff --git a/.github/workflows/seed-staging.yml b/.github/workflows/seed-staging.yml index 432b5922b..dc99cb2b9 100644 --- a/.github/workflows/seed-staging.yml +++ b/.github/workflows/seed-staging.yml @@ -14,10 +14,10 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Setup Node.js - uses: actions/setup-node@v4 + uses: actions/setup-node@v6 with: node-version: "20" diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 2b5d17049..dd4a504c3 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -34,7 +34,7 @@ repos: hooks: - id: ultracite-lint name: ultracite lint (staged files) - entry: bash -c 'FILES=$(git diff --cached --name-only --diff-filter=ACM | grep -E "\.(jsx?|tsx?|json)$" || true); [ -z "$FILES" ] && exit 0; echo "$FILES" | xargs npx ultracite lint' + entry: bash -c 'FILES=$(git diff --cached --name-only --diff-filter=ACM | grep -E "\.(jsx?|tsx?|json)$" || true); [ -z "$FILES" ] && exit 0; echo "$FILES" | xargs npx ultracite check' language: system pass_filenames: false files: '\.(jsx?|tsx?|json)$' @@ -42,7 +42,7 @@ repos: - id: ultracite-format name: ultracite format (staged files, safe fixes only) - entry: bash -c 'FILES=$(git diff --cached --name-only --diff-filter=ACM | grep -E "\.(jsx?|tsx?|json)$" || true); [ -z "$FILES" ] && exit 0; echo "$FILES" | xargs npx ultracite format || true' + entry: bash -c 'FILES=$(git diff --cached --name-only --diff-filter=ACM | grep -E "\.(jsx?|tsx?|json)$" || true); [ -z "$FILES" ] && exit 0; echo "$FILES" | xargs npx ultracite fix || true' language: system pass_filenames: false files: '\.(jsx?|tsx?|json)$' diff --git a/.secrets.baseline b/.secrets.baseline index d1fe9d112..cf4504134 100644 --- a/.secrets.baseline +++ b/.secrets.baseline @@ -315,7 +315,7 @@ "filename": "lib/services/user-management-service.ts", "hashed_secret": "8911a1ef22f1dfd8cd71925c676afa4fb2959a12", "is_verified": false, - "line_number": 248 + "line_number": 254 } ], "lib/services/user-service.ts": [ @@ -13103,7 +13103,7 @@ "filename": "prisma/seed/dev-seed.ts", "hashed_secret": "8911a1ef22f1dfd8cd71925c676afa4fb2959a12", "is_verified": false, - "line_number": 129 + "line_number": 130 } ], "public/documentation/docs/technical-guide/setup-installation/cloud-deployment/index.html": [ @@ -13130,7 +13130,7 @@ "filename": "scripts/create-test-users.ts", "hashed_secret": "8911a1ef22f1dfd8cd71925c676afa4fb2959a12", "is_verified": false, - "line_number": 31 + "line_number": 32 } ], "scripts/seed-test-user.ts": [ @@ -13572,5 +13572,5 @@ } ] }, - "generated_at": "2026-03-09T18:01:04Z" + "generated_at": "2026-03-13T14:56:39Z" } diff --git a/actions/assurance-cases.ts b/actions/assurance-cases.ts index 09344843c..b92a19652 100644 --- a/actions/assurance-cases.ts +++ b/actions/assurance-cases.ts @@ -8,15 +8,15 @@ import { } from "@/lib/schemas/assurance-case"; import { validateInput } from "@/lib/validation/input-validation"; -type AssuranceCase = { +interface AssuranceCase { + createdDate?: string; + description?: string; id: number | string; + isDemo?: boolean; name: string; - description?: string; - createdDate?: string; - updatedDate?: string; owner?: number | string; - isDemo?: boolean; -}; + updatedDate?: string; +} export const fetchAssuranceCases = async (): Promise< AssuranceCase[] | null @@ -89,15 +89,15 @@ export const fetchPublishedAssuranceCases = async (): Promise< return await Promise.resolve([]); }; -type PublishedCaseForStudy = { +interface PublishedCaseForStudy { + description: string; id: string; + markedReadyAt: string | null; name: string; - description: string; - publishStatus: string; publishedAt: string | null; - markedReadyAt: string | null; publishedVersionId: string | null; -}; + publishStatus: string; +} /** * Fetches the current user's cases that are available for linking to case studies diff --git a/actions/case-data.ts b/actions/case-data.ts index 6b49df16c..2b294fffb 100644 --- a/actions/case-data.ts +++ b/actions/case-data.ts @@ -11,7 +11,7 @@ export async function loadStaticCaseData( caseFile: string ): Promise<{ data: unknown } | { error: string }> { // Validate filename to prevent path traversal - if (caseFile.includes("..") || caseFile.includes("/")) { + if (caseFile.includes("..") || caseFile.startsWith("/")) { return { error: "Invalid case file name" }; } diff --git a/actions/export-case.ts b/actions/export-case.ts index 5027a6060..21bea9fdc 100644 --- a/actions/export-case.ts +++ b/actions/export-case.ts @@ -4,9 +4,9 @@ import { validateSession } from "@/lib/auth/validate-session"; import { uuidSchema } from "@/lib/schemas/base"; import type { CaseExportNested } from "@/lib/schemas/case-export"; -type ExportOptions = { +interface ExportOptions { includeComments: boolean; -}; +} type ExportResult = { data: CaseExportNested } | { error: string }; diff --git a/actions/export-document.ts b/actions/export-document.ts index 784f8fffc..5ea0681f2 100644 --- a/actions/export-document.ts +++ b/actions/export-document.ts @@ -4,9 +4,9 @@ import { validateSession } from "@/lib/auth/validate-session"; import { uuidSchema } from "@/lib/schemas/base"; import type { CaseExportNested } from "@/lib/schemas/case-export"; -type DocumentExportOptions = { +interface DocumentExportOptions { includeComments: boolean; -}; +} type DocumentExportResult = { data: CaseExportNested } | { error: string }; diff --git a/actions/integrations.ts b/actions/integrations.ts index 540d567d2..caaf97d79 100644 --- a/actions/integrations.ts +++ b/actions/integrations.ts @@ -2,12 +2,12 @@ import { validateSession } from "@/lib/auth/validate-session"; -type DriveFile = { +interface DriveFile { id: string; - name: string; modifiedTime: string; + name: string; size?: string; -}; +} /** * Checks whether the current user has connected their Google Drive account. diff --git a/app/(authenticated)/dashboard/case-studies/_components/_form/author-section.tsx b/app/(authenticated)/dashboard/case-studies/_components/_form/author-section.tsx index 29f71e767..b682c6edd 100644 --- a/app/(authenticated)/dashboard/case-studies/_components/_form/author-section.tsx +++ b/app/(authenticated)/dashboard/case-studies/_components/_form/author-section.tsx @@ -15,16 +15,16 @@ import { Input } from "@/components/ui/input"; import { cn } from "@/lib/utils"; import type { CaseStudyFormValues } from "./form-schema"; -export type AuthorSectionProps = { - form: ReturnType>; +export interface AuthorSectionProps { + addAuthor: () => void; authors: string[]; + className?: string; + form: ReturnType>; inputValue: string; - setInputValue: React.Dispatch>; - addAuthor: () => void; - removeAuthor: (authorToRemove: string) => void; isPublished: boolean; - className?: string; -}; + removeAuthor: (authorToRemove: string) => void; + setInputValue: React.Dispatch>; +} export function AuthorSection({ form, diff --git a/app/(authenticated)/dashboard/case-studies/_components/_form/basic-information-section.tsx b/app/(authenticated)/dashboard/case-studies/_components/_form/basic-information-section.tsx index 5792e57a3..eff9d54e5 100644 --- a/app/(authenticated)/dashboard/case-studies/_components/_form/basic-information-section.tsx +++ b/app/(authenticated)/dashboard/case-studies/_components/_form/basic-information-section.tsx @@ -20,10 +20,10 @@ import { sectors } from "@/config/index"; import { cn } from "@/lib/utils"; import type { CaseStudyFormValues } from "./form-schema"; -export type BasicInformationSectionProps = { - form: ReturnType>; +export interface BasicInformationSectionProps { className?: string; -}; + form: ReturnType>; +} export function BasicInformationSection({ form, diff --git a/app/(authenticated)/dashboard/case-studies/_components/_form/description-section.tsx b/app/(authenticated)/dashboard/case-studies/_components/_form/description-section.tsx index 8bf6fbf46..b4bbbf51a 100644 --- a/app/(authenticated)/dashboard/case-studies/_components/_form/description-section.tsx +++ b/app/(authenticated)/dashboard/case-studies/_components/_form/description-section.tsx @@ -20,12 +20,12 @@ import { import { cn } from "@/lib/utils"; import type { CaseStudyFormValues } from "./form-schema"; -export type DescriptionSectionProps = { +export interface DescriptionSectionProps { + className?: string; form: ReturnType>; - value: string; setValue: React.Dispatch>; - className?: string; -}; + value: string; +} export function DescriptionSection({ form, diff --git a/app/(authenticated)/dashboard/case-studies/_components/_form/featured-image-section.tsx b/app/(authenticated)/dashboard/case-studies/_components/_form/featured-image-section.tsx index f01df1d3a..91050a92d 100644 --- a/app/(authenticated)/dashboard/case-studies/_components/_form/featured-image-section.tsx +++ b/app/(authenticated)/dashboard/case-studies/_components/_form/featured-image-section.tsx @@ -5,16 +5,16 @@ import { ImageUpload } from "@/components/ui/image-upload"; import { cn } from "@/lib/utils"; import type { CaseStudyFormValues } from "./form-schema"; -export type FeaturedImageSectionProps = { +export interface FeaturedImageSectionProps { + caseStudyId: number | undefined; + className?: string; + deleteCaseStudyFeatureImage: (caseStudyId: number) => Promise; + featuredImage: string; form: ReturnType>; previewImage: string; - setPreviewImage: React.Dispatch>; - featuredImage: string; setFeaturedImage: React.Dispatch>; - caseStudyId: number | undefined; - deleteCaseStudyFeatureImage: (caseStudyId: number) => Promise; - className?: string; -}; + setPreviewImage: React.Dispatch>; +} export function FeaturedImageSection({ form, diff --git a/app/(authenticated)/dashboard/case-studies/_components/_form/form-actions.tsx b/app/(authenticated)/dashboard/case-studies/_components/_form/form-actions.tsx index 4ca067036..efb0b120f 100644 --- a/app/(authenticated)/dashboard/case-studies/_components/_form/form-actions.tsx +++ b/app/(authenticated)/dashboard/case-studies/_components/_form/form-actions.tsx @@ -6,12 +6,12 @@ import type { CaseStudyResponse } from "@/lib/services/case-response-types"; import { cn } from "@/lib/utils"; import DeleteCaseButton from "../delete-button"; -export type FormActionsProps = { +export interface FormActionsProps { caseStudy: CaseStudyResponse | undefined; - loading: boolean; - handlePublish: () => Promise; className?: string; -}; + handlePublish: () => Promise; + loading: boolean; +} export function FormActions({ caseStudy, diff --git a/app/(authenticated)/dashboard/case-studies/_components/_form/form-schema.ts b/app/(authenticated)/dashboard/case-studies/_components/_form/form-schema.ts index e31ef59f7..6497400a6 100644 --- a/app/(authenticated)/dashboard/case-studies/_components/_form/form-schema.ts +++ b/app/(authenticated)/dashboard/case-studies/_components/_form/form-schema.ts @@ -12,9 +12,9 @@ export const caseStudyFormSchema = z.object({ authors: z.string().optional(), // category: z.string().optional(), type: z.string().optional(), - publishedDate: z.coerce.date().optional(), - lastModifiedOn: z.coerce.date().optional(), - createdOn: z.coerce.date().optional(), + publishedDate: z.date().optional(), + lastModifiedOn: z.date().optional(), + createdOn: z.date().optional(), sector: z.string().optional(), contact: z .string() diff --git a/app/(authenticated)/dashboard/case-studies/_components/_form/use-author-management.ts b/app/(authenticated)/dashboard/case-studies/_components/_form/use-author-management.ts index 823a71138..466090259 100644 --- a/app/(authenticated)/dashboard/case-studies/_components/_form/use-author-management.ts +++ b/app/(authenticated)/dashboard/case-studies/_components/_form/use-author-management.ts @@ -2,13 +2,13 @@ import { useEffect, useState } from "react"; import type { useForm } from "react-hook-form"; import type { CaseStudyFormValues } from "./form-schema"; -type UseAuthorManagementReturn = { +interface UseAuthorManagementReturn { + addAuthor: () => void; authors: string[]; inputValue: string; - setInputValue: React.Dispatch>; - addAuthor: () => void; removeAuthor: (authorToRemove: string) => void; -}; + setInputValue: React.Dispatch>; +} export function useAuthorManagement( form: ReturnType> diff --git a/app/(authenticated)/dashboard/case-studies/_components/_form/use-case-study-image.ts b/app/(authenticated)/dashboard/case-studies/_components/_form/use-case-study-image.ts index 84fe6a9e2..934e4f7cf 100644 --- a/app/(authenticated)/dashboard/case-studies/_components/_form/use-case-study-image.ts +++ b/app/(authenticated)/dashboard/case-studies/_components/_form/use-case-study-image.ts @@ -1,22 +1,22 @@ import { useCallback, useEffect, useState } from "react"; import type { toast as toastFn } from "@/lib/toast"; -type UseCaseStudyImageParams = { +interface UseCaseStudyImageParams { caseStudyId: number | undefined; toast: typeof toastFn; -}; +} -type UseCaseStudyImageReturn = { - previewImage: string; - setPreviewImage: React.Dispatch>; +interface UseCaseStudyImageReturn { + deleteCaseStudyFeatureImage: (caseStudyId: number) => Promise; featuredImage: string; + previewImage: string; setFeaturedImage: React.Dispatch>; + setPreviewImage: React.Dispatch>; uploadCaseStudyFeatureImage: ( caseStudyId: number, imageFile: File ) => Promise; - deleteCaseStudyFeatureImage: (caseStudyId: number) => Promise; -}; +} export function useCaseStudyImage({ caseStudyId, diff --git a/app/(authenticated)/dashboard/case-studies/_components/case-study-form.tsx b/app/(authenticated)/dashboard/case-studies/_components/case-study-form.tsx index 07630e339..1bd499918 100644 --- a/app/(authenticated)/dashboard/case-studies/_components/case-study-form.tsx +++ b/app/(authenticated)/dashboard/case-studies/_components/case-study-form.tsx @@ -24,10 +24,10 @@ import { useAuthorManagement } from "./_form/use-author-management"; import { useCaseStudyImage } from "./_form/use-case-study-image"; import RelatedAssuranceCaseList from "./related-assurance-case-list"; -type CaseStudyFormProps = { +interface CaseStudyFormProps { caseStudy?: CaseStudyResponse; className?: string; -}; +} const CaseStudyForm = ({ caseStudy }: CaseStudyFormProps) => { const router = useRouter(); diff --git a/app/(authenticated)/dashboard/case-studies/_components/delete-button.tsx b/app/(authenticated)/dashboard/case-studies/_components/delete-button.tsx index bd69ff3b2..b543cdac7 100644 --- a/app/(authenticated)/dashboard/case-studies/_components/delete-button.tsx +++ b/app/(authenticated)/dashboard/case-studies/_components/delete-button.tsx @@ -8,11 +8,11 @@ import { AlertModal } from "@/components/modals/alert-modal"; import { Button } from "@/components/ui/button"; import { toast } from "@/lib/toast"; -type DeleteCaseButtonProps = { +interface DeleteCaseButtonProps { caseStudyId: number; - variant: "link" | "destructive"; redirect?: boolean; -}; + variant: "link" | "destructive"; +} const DeleteCaseButton = ({ caseStudyId, diff --git a/app/(authenticated)/dashboard/case-studies/_components/related-assurance-case-list.tsx b/app/(authenticated)/dashboard/case-studies/_components/related-assurance-case-list.tsx index ed5c845c4..a1ed2a8b6 100644 --- a/app/(authenticated)/dashboard/case-studies/_components/related-assurance-case-list.tsx +++ b/app/(authenticated)/dashboard/case-studies/_components/related-assurance-case-list.tsx @@ -10,11 +10,11 @@ import { Checkbox } from "@/components/ui/checkbox"; import { ScrollArea } from "@/components/ui/scroll-area"; import type { AssuranceCaseResponse } from "@/lib/services/case-response-types"; -type RelatedAssuranceCaseListProps = { +interface RelatedAssuranceCaseListProps { + className?: string; selectedAssuranceCases: string[]; setSelectedAssuranceCases: Dispatch>; - className?: string; -}; +} const RelatedAssuranceCaseList = ({ selectedAssuranceCases, diff --git a/app/(authenticated)/dashboard/case-studies/_components/table-actions.tsx b/app/(authenticated)/dashboard/case-studies/_components/table-actions.tsx index f56b1eedf..a586b538d 100644 --- a/app/(authenticated)/dashboard/case-studies/_components/table-actions.tsx +++ b/app/(authenticated)/dashboard/case-studies/_components/table-actions.tsx @@ -14,10 +14,10 @@ import type { CaseStudyResponse } from "@/lib/services/case-response-types"; import DeleteCaseButton from "./delete-button"; import UnpublishCaseButton from "./unpublish-button"; -type TableActionsProps = { +interface TableActionsProps { caseStudy: CaseStudyResponse; className?: string; -}; +} const TableActions = ({ caseStudy }: TableActionsProps) => ( diff --git a/app/(authenticated)/dashboard/case-studies/_components/unpublish-button.tsx b/app/(authenticated)/dashboard/case-studies/_components/unpublish-button.tsx index 14086844e..08f9afea4 100644 --- a/app/(authenticated)/dashboard/case-studies/_components/unpublish-button.tsx +++ b/app/(authenticated)/dashboard/case-studies/_components/unpublish-button.tsx @@ -6,9 +6,9 @@ import { updateCaseStudy } from "@/actions/case-studies"; import { AlertModal } from "@/components/modals/alert-modal"; import { toast } from "@/lib/toast"; -type UnpublishCaseButtonProps = { +interface UnpublishCaseButtonProps { caseStudyId: number; -}; +} const UnpublishCaseButton = ({ caseStudyId }: UnpublishCaseButtonProps) => { const [alertOpen, setAlertOpen] = useState(false); diff --git a/app/(authenticated)/dashboard/settings/_components/connected-accounts-form.tsx b/app/(authenticated)/dashboard/settings/_components/connected-accounts-form.tsx index 45ada96cc..fde4af0de 100644 --- a/app/(authenticated)/dashboard/settings/_components/connected-accounts-form.tsx +++ b/app/(authenticated)/dashboard/settings/_components/connected-accounts-form.tsx @@ -14,9 +14,9 @@ import { import type { ConnectedAccountsData } from "@/lib/services/connected-accounts-service"; import { toast } from "@/lib/toast"; -type ConnectedAccountsFormProps = { +interface ConnectedAccountsFormProps { data: ConnectedAccountsData | null; -}; +} /** * Google icon component diff --git a/app/(authenticated)/dashboard/settings/_components/delete-form.tsx b/app/(authenticated)/dashboard/settings/_components/delete-form.tsx index f45447995..3e8dc9b28 100644 --- a/app/(authenticated)/dashboard/settings/_components/delete-form.tsx +++ b/app/(authenticated)/dashboard/settings/_components/delete-form.tsx @@ -9,13 +9,13 @@ import { Label } from "@/components/ui/label"; import { toast } from "@/lib/toast"; // Minimal user data needed for this form -type UserData = { +interface UserData { id: number | string; -}; +} -type DeleteFormProps = { +interface DeleteFormProps { user: UserData | null | undefined; -}; +} export const DeleteForm = ({ user }: DeleteFormProps) => { const [deleteOpen, setDeleteOpen] = useState(false); diff --git a/app/(authenticated)/dashboard/settings/_components/password-form.tsx b/app/(authenticated)/dashboard/settings/_components/password-form.tsx index 2b3ba2223..56c137610 100644 --- a/app/(authenticated)/dashboard/settings/_components/password-form.tsx +++ b/app/(authenticated)/dashboard/settings/_components/password-form.tsx @@ -22,15 +22,15 @@ import { import { toast } from "@/lib/toast"; // Minimal user data needed for this form -type UserData = { +interface UserData { id: number | string; -}; +} const _ACCEPTED_FILE_TYPES = ["jpg"]; -type PasswordFormProps = { +interface PasswordFormProps { data: UserData | null | undefined; -}; +} export function PasswordForm({ data }: PasswordFormProps) { const [error, setError] = useState(""); diff --git a/app/(authenticated)/dashboard/settings/_components/personal-info-form.tsx b/app/(authenticated)/dashboard/settings/_components/personal-info-form.tsx index f9a07b369..b53db34a7 100644 --- a/app/(authenticated)/dashboard/settings/_components/personal-info-form.tsx +++ b/app/(authenticated)/dashboard/settings/_components/personal-info-form.tsx @@ -22,17 +22,17 @@ import { import { toast } from "@/lib/toast"; // Minimal user data needed for this form -type UserData = { - id: number | string; +interface UserData { email?: string; - username?: string; firstName?: string | null; + id: number | string; lastName?: string | null; -}; + username?: string; +} -type PersonalInfoFormProps = { +interface PersonalInfoFormProps { data: UserData | null | undefined; -}; +} export function PersonalInfoForm({ data }: PersonalInfoFormProps) { const [loading, setLoading] = useState(false); diff --git a/app/(authenticated)/dashboard/teams/[id]/page.tsx b/app/(authenticated)/dashboard/teams/[id]/page.tsx index 52f338fd6..da0a7f24d 100644 --- a/app/(authenticated)/dashboard/teams/[id]/page.tsx +++ b/app/(authenticated)/dashboard/teams/[id]/page.tsx @@ -8,9 +8,9 @@ import { authOptions } from "@/lib/auth/config"; import { prisma } from "@/lib/prisma"; import type { Prisma } from "@/src/generated/prisma"; -type TeamDetailPageProps = { +interface TeamDetailPageProps { params: Promise<{ id: string }>; -}; +} type TeamWithMembers = Prisma.TeamGetPayload<{ include: { diff --git a/app/(authenticated)/dashboard/teams/[id]/settings/_components/team-settings-form.tsx b/app/(authenticated)/dashboard/teams/[id]/settings/_components/team-settings-form.tsx index ed882d0f2..a3153ee22 100644 --- a/app/(authenticated)/dashboard/teams/[id]/settings/_components/team-settings-form.tsx +++ b/app/(authenticated)/dashboard/teams/[id]/settings/_components/team-settings-form.tsx @@ -6,7 +6,6 @@ import Link from "next/link"; import { useRouter } from "next/navigation"; import { useState } from "react"; import { useForm } from "react-hook-form"; -import type { z } from "zod"; import { AlertModal } from "@/components/modals/alert-modal"; import { Button } from "@/components/ui/button"; import { @@ -26,18 +25,21 @@ import { } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; import { Textarea } from "@/components/ui/textarea"; -import { createTeamSchema } from "@/lib/schemas/team"; +import { + type CreateTeamSchemaInput, + createTeamSchema, +} from "@/lib/schemas/team"; -type FormValues = z.infer; +type FormValues = CreateTeamSchemaInput; -type TeamSettingsFormProps = { +interface TeamSettingsFormProps { team: { id: string; name: string; slug: string; description: string | null; }; -}; +} export function TeamSettingsForm({ team }: TeamSettingsFormProps) { const router = useRouter(); @@ -164,7 +166,12 @@ export function TeamSettingsForm({ team }: TeamSettingsFormProps) { Description -