feat: refactor campaigns filtering and add profile validation

- Change user filter from WorkflowID to username in campaigns
- Simplify handleTabChange by removing inline filtering logic
- Add null check for currentCampaign length
- Add required validation for profile image field
- Add error display for school_code and image fields
- Minor formatting fixes in login page
This commit is contained in:
MehrdadAdabi 2025-11-28 13:22:26 +03:30
parent 213e865aab
commit 0cd6d7fd3f
4 changed files with 42 additions and 33 deletions

View File

@ -99,6 +99,7 @@ export function LoginPage() {
}, },
onError: () => { onError: () => {
setSubmitLoading(false); setSubmitLoading(false);
toast.error("خطا در تایید کد"); toast.error("خطا در تایید کد");
}, },

View File

@ -37,7 +37,7 @@ export function CampaignsPage() {
switch (activeTab) { switch (activeTab) {
case "my": case "my":
filtered = campaigns.filter( filtered = campaigns.filter(
(c) => Number(c.user_id) === Number(user.WorkflowID) (c) => Number(c.user_id) === Number(user.username)
); );
break; break;
case "منتخب": case "منتخب":
@ -55,7 +55,7 @@ export function CampaignsPage() {
} }
setCurrentCampaign(filtered); setCurrentCampaign(filtered);
} }
}, [campaigns, activeTab]); // Added activeTab to dependencies }, [campaigns, activeTab]);
const tabs: { value: CampaignTab; label: string }[] = [ const tabs: { value: CampaignTab; label: string }[] = [
{ value: "فعال", label: "تمام کارزار‌ها" }, { value: "فعال", label: "تمام کارزار‌ها" },
@ -70,7 +70,7 @@ export function CampaignsPage() {
setActiveTab("فعال"); setActiveTab("فعال");
if (query === "") { if (query === "") {
handleTabChange(activeTab, campaigns); handleTabChange(activeTab);
} else { } else {
const filteredCampaigns = campaigns.filter((campaign) => const filteredCampaigns = campaigns.filter((campaign) =>
campaign.title.toLowerCase().includes(query.toLowerCase()) campaign.title.toLowerCase().includes(query.toLowerCase())
@ -79,33 +79,34 @@ export function CampaignsPage() {
} }
}; };
const handleTabChange = (tab: CampaignTab, campaignData = campaigns) => { const handleTabChange = (tab: CampaignTab) => {
setActiveTab(tab); setActiveTab(tab);
const user = userInfoService.getUserInfo();
let filtered = campaignData;
switch (tab) {
case "my":
filtered = campaignData.filter(
(c) => Number(c.user_id) === Number(user.WorkflowID)
);
break;
case "منتخب":
filtered = campaignData.filter((c) => c.status === "منتخب");
break;
case "group":
filtered = campaignData.filter(
(c) => c.school_code === user.school_code
);
break;
case "فعال":
default:
filtered = campaignData;
break;
}
setCurrentCampaign(filtered);
setSearchQuery(""); setSearchQuery("");
// const user = userInfoService.getUserInfo();
// let filtered = campaignData;
// switch (tab) {
// case "my":
// filtered = campaignData.filter(
// (c) => Number(c.user_id) === Number(user.username)
// );
// break;
// case "منتخب":
// filtered = campaignData.filter((c) => c.status === "منتخب");
// break;
// case "group":
// filtered = campaignData.filter(
// (c) => c.school_code === user.school_code
// );
// break;
// case "فعال":
// default:
// filtered = campaignData;
// break;
// }
// setSearchQuery("");
// debugger
// setCurrentCampaign(filtered);
}; };
const handleJoin = (campaign: Campaign) => { const handleJoin = (campaign: Campaign) => {
@ -199,7 +200,7 @@ export function CampaignsPage() {
<main> <main>
{isLoading ? ( {isLoading ? (
renderSkeleton() renderSkeleton()
) : currentCampaign.length > 0 ? ( ) : currentCampaign?.length > 0 ? (
<ul className="space-y-4"> <ul className="space-y-4">
{currentCampaign.map((campaign) => ( {currentCampaign.map((campaign) => (
<li <li

View File

@ -121,6 +121,10 @@ export function RegisterPage() {
newErrors.base = "پایه انتخاب‌شده با مقطع متوسطه دوم سازگار نیست"; newErrors.base = "پایه انتخاب‌شده با مقطع متوسطه دوم سازگار نیست";
} }
if (!formData.image) {
newErrors.image = "فیلد پروفایل الزامی است."
}
setErrors(newErrors); setErrors(newErrors);
return Object.keys(newErrors).length === 0; return Object.keys(newErrors).length === 0;
}; };
@ -361,6 +365,7 @@ export function RegisterPage() {
placeholder="کد مدرسه خود را وارد کنید" placeholder="کد مدرسه خود را وارد کنید"
value={formData.school_code || ""} value={formData.school_code || ""}
onChange={handleInputChange} onChange={handleInputChange}
error={errors.school_code}
/> />
@ -375,6 +380,7 @@ export function RegisterPage() {
<ImageUploader <ImageUploader
label="عکس پروفایل " label="عکس پروفایل "
previewImage={previewImage} previewImage={previewImage}
error={errors.image}
onImageChange={(file) => { onImageChange={(file) => {
if (!file) { if (!file) {
setPreviewImage(""); setPreviewImage("");

View File

@ -28,8 +28,9 @@ export const fetchUserProfile = async () => {
const res = await api.post(API_ADDRESS.select, query); const res = await api.post(API_ADDRESS.select, query);
if (!res.data || res.data.length === 0) {
throw new Error("User not found"); if (res.data.resultType !== 0) {
throw new Error("خطا در دریافت کاربر");
} }
const user = JSON.parse(res.data.data)[0]; const user = JSON.parse(res.data.data)[0];
@ -46,7 +47,7 @@ export const fetchUserProfile = async () => {
schoolCode: user?.school_code, schoolCode: user?.school_code,
invitor: user?.invitor, invitor: user?.invitor,
nationalcode: user?.nationalcode, nationalcode: user?.nationalcode,
group: user.user_group_title group: user?.user_group_title
}; };
}; };