diff --git a/src/app/admin/news/page.tsx b/src/app/admin/news/page.tsx index 1caf6dc..7697b30 100644 --- a/src/app/admin/news/page.tsx +++ b/src/app/admin/news/page.tsx @@ -1,10 +1,11 @@ "use client"; -import { useState, useRef } from "react"; +import { useState } from "react"; +import Image from "next/image"; import { SectionEditor } from "../_components/SectionEditor"; import { InputField, TextareaField } from "../_components/FormField"; import { ArrayEditor } from "../_components/ArrayEditor"; -import { Upload, Loader2, ImageIcon, X } from "lucide-react"; +import { Upload, Loader2, X } from "lucide-react"; import { adminFetch } from "@/lib/csrf"; import type { NewsItem } from "@/types/content"; @@ -13,7 +14,7 @@ interface NewsData { items: NewsItem[]; } -function ImageUploadField({ +function PhotoPreview({ value, onChange, }: { @@ -21,7 +22,6 @@ function ImageUploadField({ onChange: (path: string) => void; }) { const [uploading, setUploading] = useState(false); - const inputRef = useRef(null); async function handleUpload(e: React.ChangeEvent) { const file = e.target.files?.[0]; @@ -46,54 +46,48 @@ function ImageUploadField({ return (
- + {value ? ( -
-
- - - {value.split("/").pop()} - -
+
+ -
) : ( -
@@ -115,6 +109,18 @@ export default function NewsEditorPage() { label="Новости" items={data.items} onChange={(items) => update({ ...data, items })} + collapsible + getItemTitle={(item) => { + const title = item.title || "Без заголовка"; + if (item.date) { + try { + const d = new Date(item.date); + const formatted = d.toLocaleDateString("ru-RU", { day: "numeric", month: "short", year: "numeric" }); + return `${title} · ${formatted}`; + } catch { /* ignore */ } + } + return title; + }} renderItem={(item, _i, updateItem) => (
@@ -138,18 +144,16 @@ export default function NewsEditorPage() { value={item.text} onChange={(v) => updateItem({ ...item, text: v })} /> -
- updateItem({ ...item, image: v || undefined })} - /> - updateItem({ ...item, link: v || undefined })} - placeholder="https://instagram.com/p/..." - /> -
+ updateItem({ ...item, image: v || undefined })} + /> + updateItem({ ...item, link: v || undefined })} + placeholder="https://instagram.com/p/..." + />
)} createItem={(): NewsItem => ({ diff --git a/src/components/sections/News.tsx b/src/components/sections/News.tsx index 6c1b845..d62d5bd 100644 --- a/src/components/sections/News.tsx +++ b/src/components/sections/News.tsx @@ -106,12 +106,19 @@ function CompactArticle({ ); } +const INITIAL_VISIBLE = 4; + export function News({ data }: NewsProps) { const [selected, setSelected] = useState(null); + const [showAll, setShowAll] = useState(false); if (!data.items || data.items.length === 0) return null; - const [featured, ...rest] = data.items; + // Sort by date, newest first + const sorted = [...data.items].sort((a, b) => (b.date || "").localeCompare(a.date || "")); + const [featured, ...rest] = sorted; + const visibleRest = showAll ? rest : rest.slice(0, INITIAL_VISIBLE - 1); + const hasMore = rest.length > INITIAL_VISIBLE - 1 && !showAll; return (
@@ -129,12 +136,12 @@ export function News({ data }: NewsProps) { /> - {rest.length > 0 && ( + {visibleRest.length > 0 && (
- {rest.map((item) => ( + {visibleRest.map((item) => ( setSelected(item)} /> @@ -142,6 +149,19 @@ export function News({ data }: NewsProps) {
)} + + {hasMore && ( + +
+ +
+
+ )}