0 ? "badge-success" : "badge-error"
@@ -65,7 +65,7 @@ export const ConnectedDispatcher = () => {
className="tooltip tooltip-right"
data-tip={`vorraussichtliche Abmeldung in ${formatDistance(new Date(), new Date(d.esimatedLogoutTime), { locale: de })}`}
>
-
+
{new Date(d.esimatedLogoutTime).toLocaleTimeString([], {
hour: "2-digit",
minute: "2-digit",
@@ -76,7 +76,7 @@ export const ConnectedDispatcher = () => {
{asPublicUser(d.publicUser).fullName}
-
{d.zone}
+
{d.zone}
{(() => {
diff --git a/apps/dispatch/package.json b/apps/dispatch/package.json
index cf2750f1..e195c34c 100644
--- a/apps/dispatch/package.json
+++ b/apps/dispatch/package.json
@@ -5,7 +5,7 @@
"private": true,
"packageManager": "pnpm@10.13.1",
"scripts": {
- "dev": "next dev --turbopack -p 3001",
+ "dev": "next dev -p 3001",
"build": "next build",
"start": "next start",
"lint": "next lint --max-warnings 0",
diff --git a/apps/hub/app/(app)/_components/Changelog.tsx b/apps/hub/app/(app)/_components/Changelog.tsx
deleted file mode 100644
index a70b0f15..00000000
--- a/apps/hub/app/(app)/_components/Changelog.tsx
+++ /dev/null
@@ -1,124 +0,0 @@
-"use client";
-import { useState } from "react";
-import Image from "next/image";
-import { Button } from "@repo/shared-components";
-import MDEditor from "@uiw/react-md-editor";
-import { RefreshCw } from "lucide-react";
-import { updateChangelogAck } from "./ChangelogActions";
-import { Changelog } from "@repo/db";
-
-export const ChangelogModal = ({
- latestChangelog,
- isOpen,
- onClose,
-}: {
- latestChangelog: Changelog | null;
- isOpen: boolean;
- onClose: () => void;
-}) => {
- if (!isOpen || !latestChangelog) return null;
-
- const handleClose = async () => {
- onClose();
- await updateChangelogAck();
- };
-
- return (
-
-
-
-
- );
-};
-
-export const ChangelogBtn = ({ latestChangelog }: { latestChangelog: Changelog | null }) => {
- const [isOpen, setIsOpen] = useState(false);
-
- if (!latestChangelog) return null;
-
- return (
- <>
-
setIsOpen(true)}
- >
- {latestChangelog.title}
-
-
setIsOpen(false)}
- />
- >
- );
-};
-
-export const OpenChangelogOnPageload = ({
- latestChangelog,
-}: {
- latestChangelog: Changelog | null;
-}) => {
- const [isOpen, setIsOpen] = useState(true);
-
- if (!latestChangelog) return null;
-
- return (
- <>
- setIsOpen(false)}
- />
- >
- );
-};
diff --git a/apps/hub/app/(app)/_components/ChangelogActions.tsx b/apps/hub/app/(app)/_components/ChangelogActions.tsx
deleted file mode 100644
index 7a9ca313..00000000
--- a/apps/hub/app/(app)/_components/ChangelogActions.tsx
+++ /dev/null
@@ -1,33 +0,0 @@
-"use server";
-import { prisma } from "@repo/db";
-import { getServerSession } from "../../api/auth/[...nextauth]/auth";
-
-export async function getLatestChangelog() {
- try {
- const latestChangelog = await prisma.changelog.findMany({
- orderBy: {
- createdAt: "desc",
- },
- take: 1,
- });
-
- if (latestChangelog.length > 0 && latestChangelog[0]) {
- return latestChangelog[0];
- }
-
- return null;
- } catch (error) {
- console.error("Failed to fetch latest changelog:", error);
- throw new Error("Failed to fetch latest changelog");
- }
-}
-
-export async function updateChangelogAck() {
- const session = await getServerSession();
- if (session?.user) {
- await prisma.user.update({
- where: { id: session.user.id },
- data: { changelogAck: true },
- });
- }
-}
diff --git a/apps/hub/app/(app)/_components/ChangelogWrapper.tsx b/apps/hub/app/(app)/_components/ChangelogWrapper.tsx
new file mode 100644
index 00000000..8b788772
--- /dev/null
+++ b/apps/hub/app/(app)/_components/ChangelogWrapper.tsx
@@ -0,0 +1,26 @@
+"use client";
+import { updateUser } from "(app)/settings/actions";
+import { Changelog } from "@repo/db";
+import { ChangelogModalBtn } from "@repo/shared-components";
+import { useSession } from "next-auth/react";
+import toast from "react-hot-toast";
+
+export const ChangelogWrapper = ({ latestChangelog }: { latestChangelog: Changelog | null }) => {
+ const { data: session } = useSession();
+ const autoOpen = !session?.user.changelogAck && !!latestChangelog;
+
+ if (!latestChangelog) return null;
+
+ return (
+ {
+ await updateUser({ changelogAck: true });
+ if (!session?.user.changelogAck) {
+ toast.success("Changelog als gelesen markiert");
+ }
+ }}
+ />
+ );
+};
diff --git a/apps/hub/app/(app)/_components/Footer.tsx b/apps/hub/app/(app)/_components/Footer.tsx
index 2a914dc3..1c2a03db 100644
--- a/apps/hub/app/(app)/_components/Footer.tsx
+++ b/apps/hub/app/(app)/_components/Footer.tsx
@@ -2,11 +2,22 @@ import Image from "next/image";
import { DiscordLogoIcon, InstagramLogoIcon, ReaderIcon } from "@radix-ui/react-icons";
import YoutubeSvg from "./youtube_wider.svg";
import FacebookSvg from "./facebook.svg";
-import { ChangelogBtn } from "./Changelog";
-import { getLatestChangelog } from "./ChangelogActions";
+import { ChangelogModalBtn } from "@repo/shared-components";
+import { getServerSession } from "api/auth/[...nextauth]/auth";
+import { updateUser } from "(app)/settings/actions";
+import toast from "react-hot-toast";
+import { ChangelogWrapper } from "(app)/_components/ChangelogWrapper";
+import { prisma } from "@repo/db";
export const Footer = async () => {
- const latestChangelog = await getLatestChangelog();
+ const session = await getServerSession();
+ const latestChangelog = await prisma.changelog.findFirst({
+ orderBy: {
+ createdAt: "desc",
+ },
+ });
+
+ const autoOpen = !session?.user.changelogAck && !!latestChangelog;
return (
{/* Center: Copyright */}
diff --git a/apps/hub/app/(app)/admin/changelog/_components/Form.tsx b/apps/hub/app/(app)/admin/changelog/_components/Form.tsx
index 5b03958c..de9abaf2 100644
--- a/apps/hub/app/(app)/admin/changelog/_components/Form.tsx
+++ b/apps/hub/app/(app)/admin/changelog/_components/Form.tsx
@@ -9,7 +9,6 @@ import { useEffect, useState } from "react";
import { deleteChangelog, upsertChangelog } from "../action";
import { Button } from "../../../../_components/ui/Button";
import { redirect } from "next/navigation";
-import Image from "next/image";
import dynamic from "next/dynamic";
import toast from "react-hot-toast";
@@ -73,7 +72,13 @@ export const ChangelogForm = ({ changelog }: { changelog?: Changelog }) => {
Allgemeines
-
+
{
{(() => {
if (showImage && isValidImageUrl(previewImage) && !imageError) {
return (
-
)}
{!session.user.pathSelected && }
- {session.user.pathSelected && latestChangelog && (
-
- )}
+
{children}