tangled
alpha
login
or
join now
shi.gg
/
mellow-web
4
fork
atom
The weeb for the next gen discord boat - Wamellow
wamellow.com
bot
discord
4
fork
atom
overview
issues
pulls
pipelines
add image v2
shi.gg
4 months ago
0fa4bef1
30ff8f8e
verified
This commit was signed with the committer's
known signature
.
shi.gg
SSH Key Fingerprint:
SHA256:f/mKQ+wsL4JFEMsfMBVIpFfwyYH0N5+n6IHwZA0Q+U0=
+23
-21
3 changed files
expand all
collapse all
unified
split
app
dashboard
[guildId]
greeting
farewell
page.tsx
welcome
page.tsx
components
inputs
image-url-input.tsx
+1
-1
app/dashboard/[guildId]/greeting/farewell/page.tsx
···
88
88
defaultMessage={data.message}
89
89
messageAttachmentComponent={(guild!.flags & GuildFlags.FarewellCard) !== 0 && (
90
90
<Image
91
91
-
src={`https://image-api.wamellow.com/?type=leave&username=${encodeURIComponent(user!.username)}&members=1090&hash=${encodeURIComponent(user!.id)}/${encodeURIComponent(user!.avatar!)}${data.card.background ? `&background=${encodeURIComponent(data.card.background)}` : ""}`}
91
91
+
src={`https://images-v2.wamellow.com/api/greet?type=leave&username=${encodeURIComponent(user!.username)}&member_count=${guild!.memberCount}&avatar_url=${encodeURIComponent(`https://cdn.discordapp.com/avatars/${user!.id}/${user!.avatar!}.png`)}${data.card.background ? `&background_url=${encodeURIComponent(data.card.background)}` : ""}`}
92
92
width={1_024 / 2}
93
93
height={(256 + 16) / 2}
94
94
loading="lazy"
+1
-1
app/dashboard/[guildId]/greeting/welcome/page.tsx
···
181
181
defaultMessage={data.message}
182
182
messageAttachmentComponent={(guild!.flags & GuildFlags.WelcomeCard) !== 0 && (
183
183
<Image
184
184
-
src={`https://image-api.wamellow.com/?type=join&username=${encodeURIComponent(user!.username)}&members=1090&hash=${encodeURIComponent(user!.id)}/${encodeURIComponent(user!.avatar!)}${data.card.background ? `&background=${encodeURIComponent(data.card.background)}` : ""}`}
184
184
+
src={`https://images-v2.wamellow.com/api/greet?type=join&username=${encodeURIComponent(user!.username)}&member_count=${guild!.memberCount}&avatar_url=${encodeURIComponent(`https://cdn.discordapp.com/avatars/${user!.id}/${user!.avatar!}.png`)}${data.card.background ? `&background_url=${encodeURIComponent(data.card.background)}` : ""}`}
185
185
width={1_024 / 2}
186
186
height={(256 + 16) / 2}
187
187
loading="lazy"
+21
-19
components/inputs/image-url-input.tsx
···
11
11
Success = 2
12
12
}
13
13
14
14
+
enum ImageState {
15
15
+
Errored = 1,
16
16
+
Success = 2
17
17
+
}
18
18
+
14
19
interface Props {
15
20
name: string;
16
21
url: string;
···
38
43
39
44
const [value, setValue] = useState<string>("");
40
45
const [defaultStatealue, setdefaultStatealue] = useState<string>("");
41
41
-
const [imagestate, setImagestate] = useState<"ERRORED" | "SUCCESS" | undefined>(undefined);
46
46
+
const [imagestate, setImagestate] = useState<ImageState | undefined>(undefined);
42
47
43
48
useEffect(() => {
44
49
if (!defaultStatealue) setdefaultStatealue(defaultState);
···
46
51
}, [defaultState]);
47
52
48
53
useEffect(() => {
49
49
-
if (!value?.length) setImagestate("SUCCESS");
50
50
-
// else setImagestate(undefind);
54
54
+
if (!value?.length) setImagestate(ImageState.Success);
51
55
}, [value]);
52
56
53
57
useEffect(() => {
54
54
-
if (imagestate !== "SUCCESS" || defaultStatealue === value) return;
58
58
+
if (imagestate !== ImageState.Success || defaultStatealue === value) return;
55
59
setError(null);
56
60
setState(State.Loading);
57
61
···
101
105
102
106
<div className="flex items-center gap-2">
103
107
<span className="text-lg dark:text-neutral-300 text-neutral-700 font-medium">{name}</span>
104
104
-
{state === State.Success && <TailSpin stroke="#d4d4d4" strokeWidth={8} className="relative h-3 w-3 overflow-visible" />}
108
108
+
{state === State.Loading && <TailSpin stroke="#d4d4d4" strokeWidth={8} className="relative h-3 w-3 overflow-visible" />}
105
109
</div>
106
110
107
111
<div className="lg:flex mt-1 w-full gap-4">
···
111
115
setValue={(v) => {
112
116
setValue(v);
113
117
setState(State.Idle);
114
114
-
if (imagestate === "SUCCESS") setImagestate(undefined);
118
118
+
if (imagestate === ImageState.Success) setImagestate(undefined);
115
119
}}
116
120
disabled={disabled}
117
121
placeholder="Paste a direct image url..."
···
121
125
122
126
<div className="max-w-1/2 w-full">
123
127
124
124
-
{value && imagestate !== "ERRORED" ?
128
128
+
{value && imagestate !== ImageState.Errored ?
125
129
/* eslint-disable-next-line @next/next/no-img-element */
126
130
<img
127
131
src={value}
128
132
alt="upload"
129
129
-
className={cn("w-full", "rounded-md", "aspect-4/1")}
130
130
-
onError={() => setImagestate("ERRORED")}
131
131
-
onLoad={() => setImagestate("SUCCESS")}
133
133
+
className={cn("rounded-lg w-full h-full object-cover aspect-906/256", ratio)}
134
134
+
onError={() => setImagestate(ImageState.Errored)}
135
135
+
onLoad={() => setImagestate(ImageState.Success)}
132
136
/>
133
137
:
134
138
<div className={cn(
135
139
"w-full border-2 rounded-md flex items-center justify-center dark:border-wamellow border-wamellow-100",
136
136
-
imagestate === "ERRORED" && "dark:border-red-500 border-red-300",
140
140
+
imagestate === ImageState.Errored && "dark:border-red-500 border-red-300",
137
141
ratio
138
142
)}>
139
139
-
{imagestate === "ERRORED" ?
143
143
+
{imagestate === ImageState.Errored ?
140
144
<div className="text-red-400 m-4">
141
141
-
<div className="font-medium">Enter a <span className="underline underline-red-400">valid</span> image url!</div>
145
145
+
<div className="font-medium">Enter a valid image url!</div>
142
146
<div className="text-xs">
143
147
<div>Recommended resolution: 1024x256</div>
144
144
-
<div>Recommended type: .png</div>
148
148
+
<div>Supported types: .png, .jpg, .jpeg, .webp</div>
145
149
</div>
146
150
{/* eslint-disable-next-line @next/next/no-img-element */}
147
151
<img
148
152
src={value}
149
149
-
alt="upload"
150
153
className="w-0 h-0"
151
151
-
onLoad={() => setImagestate("SUCCESS")}
154
154
+
onLoad={() => setImagestate(ImageState.Success)}
152
155
/>
153
156
</div>
154
157
:
···
162
165
</div>
163
166
164
167
<div className="flex">
165
165
-
{error &&
168
168
+
{error && (
166
169
<div className="ml-auto text-red-500 text-sm">
167
170
{error}
168
171
</div>
169
169
-
}
172
172
+
)}
170
173
</div>
171
171
-
172
174
</div>
173
175
);
174
176
}