···
1
1
-
import React, { useState, useEffect } from 'react';
2
2
-
import { submitResource, getCategories } from '../services/supabase';
3
3
-
4
4
-
const ResourceSubmission = () => {
5
5
-
const [categories, setCategories] = useState([]);
6
6
-
const [subcategories, setSubcategories] = useState([]);
7
7
-
const [selectedCategory, setSelectedCategory] = useState('');
8
8
-
const [formData, setFormData] = useState({
9
9
-
name: '',
10
10
-
url: '',
11
11
-
description: '',
12
12
-
domain: '',
13
13
-
category_id: '',
14
14
-
subcategory_id: '',
15
15
-
submitter_email: '',
16
16
-
submitter_handle: ''
17
17
-
});
18
18
-
const [isSubmitting, setIsSubmitting] = useState(false);
19
19
-
const [submitSuccess, setSubmitSuccess] = useState(false);
20
20
-
const [error, setError] = useState(null);
21
21
-
22
22
-
useEffect(() => {
23
23
-
// Fetch categories
24
24
-
async function fetchCategories() {
25
25
-
try {
26
26
-
const data = await getCategories();
27
27
-
setCategories(data);
28
28
-
} catch (error) {
29
29
-
console.error('Error fetching categories:', error);
30
30
-
}
31
31
-
}
32
32
-
33
33
-
fetchCategories();
34
34
-
}, []);
35
35
-
36
36
-
// Auto-extract domain from URL
37
37
-
useEffect(() => {
38
38
-
if (formData.url) {
39
39
-
try {
40
40
-
const url = new URL(formData.url);
41
41
-
setFormData(prev => ({ ...prev, domain: url.hostname }));
42
42
-
} catch (error) {
43
43
-
// Not a valid URL yet, ignore
44
44
-
}
45
45
-
}
46
46
-
}, [formData.url]);
47
47
-
48
48
-
const handleInputChange = (e) => {
49
49
-
const { name, value } = e.target;
50
50
-
setFormData(prev => ({ ...prev, [name]: value }));
51
51
-
52
52
-
// When category changes, fetch relevant subcategories
53
53
-
if (name === 'category_id') {
54
54
-
setSelectedCategory(value);
55
55
-
// You would add API call to get subcategories here
56
56
-
}
57
57
-
};
58
58
-
59
59
-
const handleSubmit = async (e) => {
60
60
-
e.preventDefault();
61
61
-
setIsSubmitting(true);
62
62
-
setError(null);
63
63
-
64
64
-
try {
65
65
-
await submitResource(formData);
66
66
-
setSubmitSuccess(true);
67
67
-
// Reset form
68
68
-
setFormData({
69
69
-
name: '',
70
70
-
url: '',
71
71
-
description: '',
72
72
-
domain: '',
73
73
-
category_id: '',
74
74
-
subcategory_id: '',
75
75
-
submitter_email: '',
76
76
-
submitter_handle: ''
77
77
-
});
78
78
-
} catch (error) {
79
79
-
setError('There was an error submitting your resource. Please try again.');
80
80
-
console.error('Submission error:', error);
81
81
-
} finally {
82
82
-
setIsSubmitting(false);
83
83
-
}
84
84
-
};
85
85
-
86
86
-
return (
87
87
-
<div className="submission-form-container">
88
88
-
<h2>Submit a Resource</h2>
89
89
-
<p>Know a great tool for Bluesky? Submit it here for consideration.</p>
90
90
-
91
91
-
{submitSuccess ? (
92
92
-
<div className="success-message">
93
93
-
<h3>Thank you for your submission!</h3>
94
94
-
<p>Your resource has been submitted for review. We'll consider adding it to our directory.</p>
95
95
-
<button onClick={() => setSubmitSuccess(false)}>Submit Another Resource</button>
96
96
-
</div>
97
97
-
) : (
98
98
-
<form onSubmit={handleSubmit}>
99
99
-
{error && <div className="error-message">{error}</div>}
100
100
-
101
101
-
<div className="form-group">
102
102
-
<label htmlFor="name">Resource Name*</label>
103
103
-
<input
104
104
-
type="text"
105
105
-
id="name"
106
106
-
name="name"
107
107
-
value={formData.name}
108
108
-
onChange={handleInputChange}
109
109
-
required
110
110
-
/>
111
111
-
</div>
112
112
-
113
113
-
<div className="form-group">
114
114
-
<label htmlFor="url">URL*</label>
115
115
-
<input
116
116
-
type="url"
117
117
-
id="url"
118
118
-
name="url"
119
119
-
value={formData.url}
120
120
-
onChange={handleInputChange}
121
121
-
required
122
122
-
/>
123
123
-
</div>
124
124
-
125
125
-
<div className="form-group">
126
126
-
<label htmlFor="description">Description*</label>
127
127
-
<textarea
128
128
-
id="description"
129
129
-
name="description"
130
130
-
value={formData.description}
131
131
-
onChange={handleInputChange}
132
132
-
required
133
133
-
/>
134
134
-
</div>
135
135
-
136
136
-
<div className="form-group">
137
137
-
<label htmlFor="category_id">Category*</label>
138
138
-
<select
139
139
-
id="category_id"
140
140
-
name="category_id"
141
141
-
value={formData.category_id}
142
142
-
onChange={handleInputChange}
143
143
-
required
144
144
-
>
145
145
-
<option value="">Select a category</option>
146
146
-
{categories.map(category => (
147
147
-
<option key={category.id} value={category.id}>
148
148
-
{category.emoji} {category.name}
149
149
-
</option>
150
150
-
))}
151
151
-
</select>
152
152
-
</div>
153
153
-
154
154
-
{/* Add subcategory dropdown */}
155
155
-
156
156
-
<div className="form-group">
157
157
-
<label htmlFor="submitter_email">Your Email (optional)</label>
158
158
-
<input
159
159
-
type="email"
160
160
-
id="submitter_email"
161
161
-
name="submitter_email"
162
162
-
value={formData.submitter_email}
163
163
-
onChange={handleInputChange}
164
164
-
/>
165
165
-
</div>
166
166
-
167
167
-
<div className="form-group">
168
168
-
<label htmlFor="submitter_handle">Your Bluesky Handle (optional)</label>
169
169
-
<input
170
170
-
type="text"
171
171
-
id="submitter_handle"
172
172
-
name="submitter_handle"
173
173
-
value={formData.submitter_handle}
174
174
-
onChange={handleInputChange}
175
175
-
/>
176
176
-
</div>
177
177
-
178
178
-
<button
179
179
-
type="submit"
180
180
-
className="submit-button"
181
181
-
disabled={isSubmitting}
182
182
-
>
183
183
-
{isSubmitting ? 'Submitting...' : 'Submit Resource'}
184
184
-
</button>
185
185
-
</form>
186
186
-
)}
187
187
-
</div>
188
188
-
);
189
189
-
};
190
190
-
191
191
-
export default ResourceSubmission;