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

@ -73,7 +73,7 @@ export function LoginPage() {
const verifyOtpMutation = useMutation({
mutationFn: verifyOtpService,
onSuccess: async(data) => {
onSuccess: async (data) => {
setSubmitLoading(false);
if (data.resultType !== 0) {
toast.error(data.message);
@ -99,6 +99,7 @@ export function LoginPage() {
},
onError: () => {
setSubmitLoading(false);
toast.error("خطا در تایید کد");
},

View File

@ -37,7 +37,7 @@ export function CampaignsPage() {
switch (activeTab) {
case "my":
filtered = campaigns.filter(
(c) => Number(c.user_id) === Number(user.WorkflowID)
(c) => Number(c.user_id) === Number(user.username)
);
break;
case "منتخب":
@ -55,7 +55,7 @@ export function CampaignsPage() {
}
setCurrentCampaign(filtered);
}
}, [campaigns, activeTab]); // Added activeTab to dependencies
}, [campaigns, activeTab]);
const tabs: { value: CampaignTab; label: string }[] = [
{ value: "فعال", label: "تمام کارزار‌ها" },
@ -70,7 +70,7 @@ export function CampaignsPage() {
setActiveTab("فعال");
if (query === "") {
handleTabChange(activeTab, campaigns);
handleTabChange(activeTab);
} else {
const filteredCampaigns = campaigns.filter((campaign) =>
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);
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("");
// 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) => {
@ -199,7 +200,7 @@ export function CampaignsPage() {
<main>
{isLoading ? (
renderSkeleton()
) : currentCampaign.length > 0 ? (
) : currentCampaign?.length > 0 ? (
<ul className="space-y-4">
{currentCampaign.map((campaign) => (
<li

View File

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

View File

@ -28,8 +28,9 @@ export const fetchUserProfile = async () => {
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];
@ -46,7 +47,7 @@ export const fetchUserProfile = async () => {
schoolCode: user?.school_code,
invitor: user?.invitor,
nationalcode: user?.nationalcode,
group: user.user_group_title
group: user?.user_group_title
};
};