Showing
2 changed files
with
112 additions
and
36 deletions
... | @@ -23,6 +23,8 @@ const GifEditor = ({ previewURL }) => { | ... | @@ -23,6 +23,8 @@ const GifEditor = ({ previewURL }) => { |
23 | const [isUploadLoading, setIsUploadLoading] = useState(false); | 23 | const [isUploadLoading, setIsUploadLoading] = useState(false); |
24 | const [viewLink, setViewLink] = useState(null); | 24 | const [viewLink, setViewLink] = useState(null); |
25 | 25 | ||
26 | + const [unableToUpload, setUnableToUpload] = useState(false); | ||
27 | + | ||
26 | useEffect(() => { | 28 | useEffect(() => { |
27 | if (window) { | 29 | if (window) { |
28 | setImageEditor( | 30 | setImageEditor( |
... | @@ -58,6 +60,7 @@ const GifEditor = ({ previewURL }) => { | ... | @@ -58,6 +60,7 @@ const GifEditor = ({ previewURL }) => { |
58 | gifGenerator.make().then( | 60 | gifGenerator.make().then( |
59 | (blob: Blob) => { | 61 | (blob: Blob) => { |
60 | setBlob(blob); | 62 | setBlob(blob); |
63 | + if (blob.size > 5000000) setUnableToUpload(true); | ||
61 | setDownload(window.URL.createObjectURL(blob)); | 64 | setDownload(window.URL.createObjectURL(blob)); |
62 | }, | 65 | }, |
63 | (error) => { | 66 | (error) => { |
... | @@ -84,7 +87,7 @@ const GifEditor = ({ previewURL }) => { | ... | @@ -84,7 +87,7 @@ const GifEditor = ({ previewURL }) => { |
84 | <> | 87 | <> |
85 | <div className="background" /> | 88 | <div className="background" /> |
86 | <div className="download"> | 89 | <div className="download"> |
87 | - loading... {!isUploadLoading && percent}% | 90 | + loading... {!isUploadLoading && `${percent}%`} |
88 | </div> | 91 | </div> |
89 | </> | 92 | </> |
90 | )} | 93 | )} |
... | @@ -94,19 +97,22 @@ const GifEditor = ({ previewURL }) => { | ... | @@ -94,19 +97,22 @@ const GifEditor = ({ previewURL }) => { |
94 | </div> | 97 | </div> |
95 | )} | 98 | )} |
96 | {download && !isUploadLoading && ( | 99 | {download && !isUploadLoading && ( |
97 | - <> | 100 | + // <> |
98 | - <div className="background" /> | 101 | + // <div className="background" /> |
99 | - <div className="download"> | 102 | + // <div className="download"> |
100 | - <div className="download__btn"> | 103 | + // <div className={`download__btn ${unableToUpload && "unable"}`}> |
101 | - <a href={download} download="new_gif.gif"> | 104 | + // <a href={download} download="new_gif.gif"> |
102 | - Download a File | 105 | + // Download a File |
103 | - </a> | 106 | + // </a> |
104 | - </div> | 107 | + // </div> |
105 | - <div className="download__btn"> | 108 | + // <div className="download__btn"> |
106 | - <div onClick={handleUpload}>Upload to Server</div> | 109 | + // <div onClick={handleUpload}>Upload to Server</div> |
107 | - </div> | 110 | + // </div> |
108 | - </div> | 111 | + // </div> |
109 | - </> | 112 | + // </> |
113 | + <NextStepModal | ||
114 | + {...{ unableToUpload, download, handleUpload, blob }} | ||
115 | + /> | ||
110 | )} | 116 | )} |
111 | <div onClick={makeGif} className="make"> | 117 | <div onClick={makeGif} className="make"> |
112 | Make a Gif | 118 | Make a Gif |
... | @@ -117,6 +123,35 @@ const GifEditor = ({ previewURL }) => { | ... | @@ -117,6 +123,35 @@ const GifEditor = ({ previewURL }) => { |
117 | ); | 123 | ); |
118 | }; | 124 | }; |
119 | 125 | ||
126 | +const NextStepModal = ({ unableToUpload, download, handleUpload, blob }) => { | ||
127 | + const url = window.URL.createObjectURL(blob); | ||
128 | + return ( | ||
129 | + <ModalWrapper {...{ unableToUpload }}> | ||
130 | + <div className="background" /> | ||
131 | + <div className="modal"> | ||
132 | + <div className="download"> | ||
133 | + <img src={url} width={500} /> | ||
134 | + <div className="buttons"> | ||
135 | + <div className="buttons__btn"> | ||
136 | + <a href={download} download="new_gif.gif"> | ||
137 | + Download a File | ||
138 | + </a> | ||
139 | + </div> | ||
140 | + <div className="buttons__btn"> | ||
141 | + <div onClick={!unableToUpload && handleUpload}> | ||
142 | + Upload to Server | ||
143 | + </div> | ||
144 | + </div> | ||
145 | + </div> | ||
146 | + {unableToUpload && ( | ||
147 | + <div className="warning">5MB 미만만 업로드 가능합니다!</div> | ||
148 | + )} | ||
149 | + </div> | ||
150 | + </div> | ||
151 | + </ModalWrapper> | ||
152 | + ); | ||
153 | +}; | ||
154 | + | ||
120 | const Wrapper = styled.div` | 155 | const Wrapper = styled.div` |
121 | position: fixed; | 156 | position: fixed; |
122 | width: 90%; | 157 | width: 90%; |
... | @@ -130,6 +165,10 @@ const Wrapper = styled.div` | ... | @@ -130,6 +165,10 @@ const Wrapper = styled.div` |
130 | color: black; | 165 | color: black; |
131 | text-decoration: none; | 166 | text-decoration: none; |
132 | } | 167 | } |
168 | + .unable { | ||
169 | + cursor: not-allowed; | ||
170 | + opacity: 0.5; | ||
171 | + } | ||
133 | .make { | 172 | .make { |
134 | font: 800 11.5px Arial; | 173 | font: 800 11.5px Arial; |
135 | position: absolute; | 174 | position: absolute; |
... | @@ -137,7 +176,6 @@ const Wrapper = styled.div` | ... | @@ -137,7 +176,6 @@ const Wrapper = styled.div` |
137 | top: 0; | 176 | top: 0; |
138 | width: 120px; | 177 | width: 120px; |
139 | height: 40px; | 178 | height: 40px; |
140 | - background: red; | ||
141 | z-index: 10; | 179 | z-index: 10; |
142 | border-radius: 20px; | 180 | border-radius: 20px; |
143 | margin: 8px; | 181 | margin: 8px; |
... | @@ -150,6 +188,26 @@ const Wrapper = styled.div` | ... | @@ -150,6 +188,26 @@ const Wrapper = styled.div` |
150 | text-decoration: underline; | 188 | text-decoration: underline; |
151 | } | 189 | } |
152 | } | 190 | } |
191 | + | ||
192 | + .tui-image-editor-container { | ||
193 | + border-radius: 1.5rem; | ||
194 | + } | ||
195 | + .tui-image-editor-container .tui-image-editor-help-menu.top { | ||
196 | + left: 19rem; | ||
197 | + top: 1rem; | ||
198 | + } | ||
199 | + .tui-image-editor-header-logo { | ||
200 | + display: none; | ||
201 | + } | ||
202 | + .tui-image-editor-header-buttons { | ||
203 | + display: none; | ||
204 | + } | ||
205 | + .tui-image-editor-help-menu { | ||
206 | + display: none; | ||
207 | + } | ||
208 | +`; | ||
209 | + | ||
210 | +const ModalWrapper = styled.div<{ unableToUpload: boolean }>` | ||
153 | .background { | 211 | .background { |
154 | position: fixed; | 212 | position: fixed; |
155 | top: 0; | 213 | top: 0; |
... | @@ -160,40 +218,57 @@ const Wrapper = styled.div` | ... | @@ -160,40 +218,57 @@ const Wrapper = styled.div` |
160 | opacity: 0.7; | 218 | opacity: 0.7; |
161 | z-index: 100; | 219 | z-index: 100; |
162 | } | 220 | } |
221 | + .modal { | ||
222 | + width: 100%; | ||
223 | + height: 100vh; | ||
224 | + display: flex; | ||
225 | + align-items: center; | ||
226 | + justify-content: center; | ||
227 | + } | ||
163 | .download { | 228 | .download { |
164 | position: absolute; | 229 | position: absolute; |
165 | - top: 15rem; | ||
166 | z-index: 100; | 230 | z-index: 100; |
167 | - display: flex; | ||
168 | background-color: white; | 231 | background-color: white; |
169 | padding: 1.5rem 2rem; | 232 | padding: 1.5rem 2rem; |
170 | border-radius: 2rem; | 233 | border-radius: 2rem; |
234 | + } | ||
235 | + .warning { | ||
236 | + box-sizing: border-box; | ||
237 | + padding-right: 1rem; | ||
238 | + width: 100%; | ||
239 | + text-align: end; | ||
240 | + margin-top: 1rem; | ||
241 | + } | ||
242 | + .buttons { | ||
243 | + display: flex; | ||
244 | + flex: 1; | ||
245 | + margin-top: 1rem; | ||
171 | &__btn { | 246 | &__btn { |
247 | + flex: 0.5; | ||
248 | + text-align: center; | ||
249 | + cursor: pointer; | ||
250 | + border-radius: 2rem; | ||
251 | + padding: 1.5rem; | ||
252 | + background-color: #fdba3b; | ||
253 | + display: flex; | ||
254 | + align-items: center; | ||
255 | + justify-content: center; | ||
172 | cursor: pointer; | 256 | cursor: pointer; |
173 | - :last-child { | ||
174 | - margin-left: 1rem; | ||
175 | - } | ||
176 | :hover { | 257 | :hover { |
177 | text-decoration: underline; | 258 | text-decoration: underline; |
178 | } | 259 | } |
260 | + :last-child { | ||
261 | + margin-left: 1rem; | ||
262 | + cursor: ${({ unableToUpload }) => | ||
263 | + unableToUpload ? "not-allowed" : "pointer"}; | ||
264 | + :hover { | ||
265 | + text-decoration: ${({ unableToUpload }) => | ||
266 | + !unableToUpload ? "underline" : "none"}; | ||
267 | + } | ||
268 | + opacity: ${({ unableToUpload }) => unableToUpload && 0.5}; | ||
269 | + } | ||
179 | } | 270 | } |
180 | } | 271 | } |
181 | - .tui-image-editor-container { | ||
182 | - border-radius: 1.5rem; | ||
183 | - } | ||
184 | - .tui-image-editor-container .tui-image-editor-help-menu.top { | ||
185 | - left: 19rem; | ||
186 | - top: 1rem; | ||
187 | - } | ||
188 | - .tui-image-editor-header-logo { | ||
189 | - display: none; | ||
190 | - } | ||
191 | - .tui-image-editor-header-buttons { | ||
192 | - display: none; | ||
193 | - } | ||
194 | - .tui-image-editor-help-menu { | ||
195 | - display: none; | ||
196 | - } | ||
197 | `; | 272 | `; |
198 | 273 | ||
199 | export default GifEditor; | 274 | export default GifEditor; | ... | ... |
... | @@ -6,6 +6,7 @@ const Header = () => { | ... | @@ -6,6 +6,7 @@ const Header = () => { |
6 | 6 | ||
7 | const Container = styled.div` | 7 | const Container = styled.div` |
8 | position: fixed; | 8 | position: fixed; |
9 | + box-sizing: border-box; | ||
9 | top: 0; | 10 | top: 0; |
10 | left: 0; | 11 | left: 0; |
11 | width: 100%; | 12 | width: 100%; | ... | ... |
-
Please register or login to post a comment