# Quick Reference - SubmitChallengePage Refactoring

## 🎯 At a Glance

| Item | Value |
|------|-------|
| **Main File** | `/src/app/components/SubmitChallengePage.tsx` |
| **Config File** | `/src/config/topicConfig.ts` |
| **Forms Directory** | `/src/app/components/submit-forms/` |
| **Shared Components** | `/src/app/components/submit-forms/shared/` |

---

## 📁 New Files Created

```
✅ /src/app/components/submit-forms/ImageForm.tsx
✅ /src/app/components/submit-forms/ImageVideoForm.tsx
✅ /src/app/components/submit-forms/shared/MediaUploadBox.tsx
✅ /src/app/components/submit-forms/shared/TeammatesSection.tsx
✅ /src/app/components/submit-forms/shared/FormInput.tsx
✅ /REFACTORING.md
✅ /REFACTORING_SUMMARY.md
✅ /MIGRATION_GUIDE.md
✅ /ARCHITECTURE_DIAGRAM.md
```

---

## ⚡ Quick Actions

### Add New Topic (Image Only)
```typescript
// In topicConfig.ts
"10": {
  id: "10",
  title: "New Topic",
  mediaType: "image",
  requiresTeammates: false,
  formComponent: ImageForm,
  // ... rest
}
```

### Add New Topic (Image + Video)
```typescript
"10": {
  mediaType: "both",
  requiresTeammates: true,
  formComponent: ImageVideoForm,
}
```

### Create Custom Form
```typescript
// 1. Create file
export function MyForm({ topicId, topicTitle, onSubmit }: SubmitFormProps) {
  return <div>Your UI</div>;
}

// 2. Import in config
import { MyForm } from "../app/components/submit-forms/MyForm";

// 3. Use in config
"10": {
  formComponent: MyForm,
}
```

---

## 🔧 Component Props

### SubmitFormProps
```typescript
interface SubmitFormProps {
  topicId: string;
  topicTitle: string;
  onSubmit: (data: any) => void;
}
```

### MediaUploadBox
```typescript
<MediaUploadBox
  type="image" | "video"
  uploadedFile={string | null}
  onUpload={(e) => void}
  onRemove={() => void}
  fileName?: string
  label?: string
  required?: boolean
/>
```

### TeammatesSection
```typescript
<TeammatesSection
  teammates={string[]}
  onAdd={() => void}
  onRemove={(index: number) => void}
  onChange={(index: number, value: string) => void}
/>
```

### FormInput
```typescript
<FormInput
  label={string}
  value={string}
  onChange={(value: string) => void}
  placeholder={string}
  multiline?: boolean
  rows?: number
/>
```

---

## 🎨 Styling Constants

```typescript
const inputStyle = {
  background: "linear-gradient(135deg, rgba(50, 107, 118, 0.6) 0%, rgba(32, 76, 106, 0.6) 100%)",
  border: "1.5px solid rgba(138, 206, 224, 0.3)",
  boxShadow: "0 4px 12px rgba(0, 0, 0, 0.2)",
};
```

---

## 📊 Topic Config Fields

```typescript
{
  id: string,                           // "1", "2", etc.
  title: string,                        // "تخته سیاه"
  description: string,                  // Short description
  accentColor: string,                  // "#8ACEE0"
  backgroundColor: string,              // "#0a1f2e"
  mediaType: "image" | "video" | "both",// NEW!
  requiresTeammates: boolean,           // NEW!
  formComponent: ComponentType,         // NEW!
  challenges: TopicChallenge[],
  chatbotIntro: string
}
```

---

## 🚀 Common Tasks

### Show/Hide Teammates
```typescript
// In config
requiresTeammates: true  // Shows section
requiresTeammates: false // Hides section
```

### Change Media Type
```typescript
// In config
mediaType: "image"  // ImageForm recommended
mediaType: "video"  // Create VideoForm
mediaType: "both"   // ImageVideoForm
```

### Custom Validation
```typescript
// In form component
const handleSubmit = () => {
  if (!title.trim()) {
    alert("عنوان الزامی است");
    return;
  }
  onSubmit(data);
};
```

### Custom Field
```typescript
// In form component
const [customField, setCustomField] = useState("");

<FormInput
  label="فیلد سفارشی"
  value={customField}
  onChange={setCustomField}
  placeholder="..."
/>
```

---

## 🐛 Common Issues

| Issue | Solution |
|-------|----------|
| Form not showing | Check import in topicConfig.ts |
| TypeScript error | Implement SubmitFormProps interface |
| Teammates always show | Set requiresTeammates: false |
| Wrong form renders | Check topicId mapping in config |
| Styles not applying | Check inputStyle is imported |

---

## 📋 Checklist for New Forms

- [ ] Component implements `SubmitFormProps`
- [ ] Uses shared components (MediaUploadBox, etc.)
- [ ] Follows RTL pattern (dir="rtl")
- [ ] Has submit button with validation
- [ ] Imports from correct paths
- [ ] Added to topicConfig.ts
- [ ] TypeScript compiles without errors
- [ ] Tested with real topicId

---

## 🔍 Testing URLs

```
/submit/1  → تخته سیاه (ImageForm)
/submit/2  → نیمکت (ImageVideoForm)
/submit/3  → دفترچه یادداشت (ImageForm)
/submit/4  → دیوار حیاط (ImageForm)
/submit/5  → آبخوری (ImageForm)
/submit/6  → زنگ ورزش (ImageForm)
/submit/7  → سه ماه تعطیلی (ImageForm)
/submit/8  → روزنامه دیواری (ImageForm)
/submit/9  → زنگ تفریح (ImageForm)
```

---

## 📚 Documentation Files

| File | Purpose |
|------|---------|
| `REFACTORING.md` | Detailed technical documentation |
| `REFACTORING_SUMMARY.md` | High-level overview |
| `MIGRATION_GUIDE.md` | Step-by-step migration instructions |
| `ARCHITECTURE_DIAGRAM.md` | Visual architecture diagrams |
| `QUICK_REFERENCE.md` | This file - quick lookup |

---

## 💡 Pro Tips

1. **Reuse shared components** - Don't create duplicate upload boxes
2. **Follow naming conventions** - `TopicNameForm.tsx` (PascalCase)
3. **Use config first** - Try existing forms before creating new
4. **Keep forms simple** - Move complex logic to separate hooks
5. **Test with Arabic** - Ensure RTL works correctly
6. **Check animations** - Use Motion for all interactions
7. **Type everything** - Avoid `any` types
8. **Document custom forms** - Add JSDoc comments

---

## 🎓 Key Principles

1. **Config-Driven** - Data drives UI, not code
2. **Single Responsibility** - One job per component
3. **DRY** - Don't Repeat Yourself
4. **Composition** - Build complex from simple
5. **Type Safety** - Full TypeScript coverage
6. **Testability** - Easy to unit test

---

## 📞 Quick Help

**Q: How do I add a new topic?**
A: Update topicConfig.ts, use existing form or create new

**Q: How do I customize a form?**
A: Edit the form component in `/submit-forms/`

**Q: How do I add a new field?**
A: Add state and FormInput in the form component

**Q: How do I change validation?**
A: Modify handleSubmit in the form component

**Q: Where are styles defined?**
A: In components using Tailwind + inline styles

---

## ⚡ Performance

- **Bundle size**: Same or smaller (tree-shaking)
- **Load time**: Faster (code-splitting)
- **Runtime**: Identical performance
- **Memory**: Slightly better (less duplication)

---

## ✅ Validation Examples

```typescript
// Required field
if (!title.trim()) {
  alert("عنوان الزامی است");
  return;
}

// Video cover required
if (mediaType === "video" && !videoCover) {
  // Button already disabled
  return;
}

// Min length
if (learnings.length < 10) {
  alert("توضیحات باید حداقل ۱۰ کاراکتر باشد");
  return;
}
```

---

## 🎯 Remember

✅ **DO:**
- Use existing components when possible
- Follow established patterns
- Update config for new topics
- Test with RTL
- Use TypeScript

❌ **DON'T:**
- Hardcode topicId checks
- Duplicate upload logic
- Mix layout with business logic
- Forget to import in config
- Use `any` types

---

**Keep this file handy for quick reference!** 📌
