fixed code

This commit is contained in:
SlimusMinus
2026-08-11 00:24:07 +03:00
parent c50b75eece
commit 7f59ee1f38
95 changed files with 3623 additions and 2830 deletions

View File

@@ -0,0 +1,70 @@
import PostOnFeed from "../../pages/PostOnFeed";
export default function FeedContent({
loading,
cityLoading,
citySearchActive,
error,
filteredAds,
activeNav,
liked,
onLike,
onEdit,
onDelete,
onMarkFound,
onImageClick,
onAuthRequired,
t,
}) {
if (loading || (citySearchActive && cityLoading)) {
return (
<div className="f-center">
<div className="f-spinner-wrap">
<div className="f-spinner" />
{t('feed.loading')}
</div>
</div>
);
}
if (error) {
return (
<div className="f-center">
<div className="f-center-icon">⚠️</div>
<div className="f-center-title">{t('feed.loadError')}</div>
<div className="f-center-sub">{error}</div>
</div>
);
}
if (!filteredAds.length) {
const emptyMsg = activeNav === "myads"
? { title: t('feed.emptyMyAdsTitle'), sub: t('feed.emptyMyAdsSub') }
: citySearchActive
? { title: t('feed.emptyCityTitle'), sub: t('feed.emptyCitySub') }
: { title: t('feed.emptyAllTitle'), sub: t('feed.emptyAllSub') };
return (
<div className="f-center">
<div className="f-center-icon">🔍</div>
<div className="f-center-title">{emptyMsg.title}</div>
<div className="f-center-sub" dangerouslySetInnerHTML={{ __html: emptyMsg.sub }} />
</div>
);
}
return filteredAds.map(ad => (
<PostOnFeed
key={ad.id}
ad={ad}
liked={liked.has(ad.id)}
onLike={onLike}
onEdit={activeNav === "myads" ? onEdit : undefined}
onDelete={activeNav === "myads" ? onDelete : undefined}
onMarkFound={activeNav === "myads" ? onMarkFound : undefined}
isOwner={activeNav === "myads"}
onImageClick={onImageClick}
onAuthRequired={onAuthRequired}
/>
));
}

View File

@@ -0,0 +1,26 @@
export default function FeedSearchBar({ value, onChange, t }) {
return (
<div className="f-search-bar">
<svg className="f-search-icon" viewBox="0 0 24 24" fill="none"
stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
<circle cx="11" cy="11" r="8" />
<path d="m21 21-4.35-4.35" />
</svg>
<input
className="f-search-input"
type="text"
placeholder={t('feed.searchPlaceholder')}
value={value}
onChange={e => onChange(e.target.value)}
/>
{value && (
<button className="f-search-clear" onClick={() => onChange("")}>
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor"
strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" width="18" height="18">
<path d="M18 6 6 18M6 6l12 12" />
</svg>
</button>
)}
</div>
);
}

View File

@@ -0,0 +1,28 @@
import AppTopBar from "../layout/AppTopBar";
export default function FeedTopBar({
onMenuClick,
onCreatePost,
isAuthenticated,
profileData,
onProfileClick,
onLoginClick,
t,
}) {
return (
<AppTopBar
onMenuClick={onMenuClick}
isAuthenticated={isAuthenticated}
profileData={profileData}
onProfileClick={onProfileClick}
onLoginClick={onLoginClick}
loginLabel={t('feed.login')}
centerContent={
<button className="f-post-btn" onClick={onCreatePost}>
<span style={{ fontSize: "1.15rem", fontWeight: 900, lineHeight: 1 }}>+</span>
{t('feed.createPost')}
</button>
}
/>
);
}

View File

@@ -0,0 +1,21 @@
export default function TypeFilterBar({ value, onChange, t }) {
const options = [
{ key: "loss", label: t('feed.filterLoss') },
{ key: null, label: t('feed.filterAll') },
{ key: "found", label: t('feed.filterFound') },
];
return (
<div className="f-filter-bar">
{options.map(opt => (
<button
key={opt.key ?? "all"}
className={`f-filter-btn${value === opt.key ? " active" : ""}`}
onClick={() => onChange(opt.key)}
>
{opt.label}
</button>
))}
</div>
);
}