1
1
import { authStore } from '@/modules/auth/auth.store' ;
2
2
import { useConfig } from '@/modules/config/config.provider' ;
3
3
import { getFileIcon } from '@/modules/files/files.models' ;
4
+ import { useI18n } from '@/modules/i18n/i18n.provider' ;
4
5
import { isHttpErrorWithCode , isRateLimitError } from '@/modules/shared/http/http-errors' ;
5
6
import { cn } from '@/modules/shared/style/cn' ;
6
7
import { CopyButton } from '@/modules/shared/utils/copy' ;
@@ -29,6 +30,8 @@ export const CreateNotePage: Component = () => {
29
30
const [ getDeleteAfterReading , setDeleteAfterReading ] = createSignal ( false ) ;
30
31
const [ getUploadedFiles , setUploadedFiles ] = createSignal < File [ ] > ( [ ] ) ;
31
32
33
+ const { t } = useI18n ( ) ;
34
+
32
35
const { config } = useConfig ( ) ;
33
36
const navigate = useNavigate ( ) ;
34
37
@@ -61,7 +64,7 @@ export const CreateNotePage: Component = () => {
61
64
62
65
const createNote = async ( ) => {
63
66
if ( ! getContent ( ) && getUploadedFiles ( ) . length === 0 ) {
64
- setError ( { message : 'Please enter a note content or attach a file.' } ) ;
67
+ setError ( { message : t ( 'create.errors.empty-note' ) } ) ;
65
68
return ;
66
69
}
67
70
@@ -83,21 +86,21 @@ export const CreateNotePage: Component = () => {
83
86
}
84
87
85
88
if ( isRateLimitError ( { error } ) ) {
86
- setError ( { message : 'You have exceeded the rate limit for creating notes. Please try again later.' } ) ;
89
+ setError ( { message : t ( 'create.errors.rate-limit' ) } ) ;
87
90
return ;
88
91
}
89
92
90
93
if ( isHttpErrorWithCode ( { error, code : 'note.payload_too_large' } ) ) {
91
- setError ( { message : 'The note content and attachments are too large. Please reduce the size and try again.' } ) ;
94
+ setError ( { message : t ( 'create.errors.too-large' ) } ) ;
92
95
return ;
93
96
}
94
97
95
98
if ( isHttpErrorWithCode ( { error, code : 'auth.unauthorized' } ) ) {
96
- setError ( { message : 'You are not authorized to create notes. Please login and try again.' } ) ;
99
+ setError ( { message : t ( ' create.errors.unauthorized' ) } ) ;
97
100
return ;
98
101
}
99
102
100
- setError ( { message : 'An error occurred while creating the note, please try again.' , details : error . message } ) ;
103
+ setError ( { message : t ( 'create.errors.unknown' ) , details : error . message } ) ;
101
104
} ;
102
105
103
106
function updateContent ( text : string ) {
@@ -114,8 +117,8 @@ export const CreateNotePage: Component = () => {
114
117
115
118
try {
116
119
await navigator . share ( {
117
- title : 'Shared note' ,
118
- text : 'Here is a note for you' ,
120
+ title : t ( 'create.share.title' ) ,
121
+ text : t ( 'create.share.description' ) ,
119
122
url : getNoteUrl ( ) ,
120
123
} ) ;
121
124
} catch ( error ) {
@@ -128,28 +131,32 @@ export const CreateNotePage: Component = () => {
128
131
< Switch >
129
132
< Match when = { ! getIsNoteCreated ( ) } >
130
133
< TextFieldRoot class = "w-full " >
131
- < TextArea placeholder = "Type your note here." class = "flex-1 p-4 min-h-300px sm:min-h-700px" value = { getContent ( ) } onInput = { e => updateContent ( e . currentTarget . value ) } />
134
+ < TextArea placeholder = { t ( 'create.settings.placeholder' ) } class = "flex-1 p-4 min-h-300px sm:min-h-700px" value = { getContent ( ) } onInput = { e => updateContent ( e . currentTarget . value ) } />
132
135
</ TextFieldRoot >
133
136
134
137
< div class = "w-full sm:w-320px flex flex-col gap-4 flex-shrink-0" >
135
138
< TextFieldRoot class = "w-full" >
136
- < TextFieldLabel > Note password</ TextFieldLabel >
139
+ < TextFieldLabel >
140
+ { t ( 'create.settings.password.label' ) }
141
+ </ TextFieldLabel >
137
142
< NotePasswordField getPassword = { getPassword } setPassword = { setPassword } />
138
143
139
144
</ TextFieldRoot >
140
145
141
146
< TextFieldRoot class = "w-full" >
142
- < TextFieldLabel > Expiration delay</ TextFieldLabel >
147
+ < TextFieldLabel >
148
+ { t ( 'create.settings.expiration' ) }
149
+ </ TextFieldLabel >
143
150
< Tabs
144
151
value = { getTtlInSeconds ( ) . toString ( ) }
145
152
onChange = { ( value : string ) => setTtlInSeconds ( Number ( value ) ) }
146
153
>
147
154
< TabsList >
148
155
< TabsIndicator />
149
- < TabsTrigger value = "3600" > 1 hour </ TabsTrigger >
150
- < TabsTrigger value = "86400" > 1 day </ TabsTrigger >
151
- < TabsTrigger value = "604800" > 1 week </ TabsTrigger >
152
- < TabsTrigger value = "2592000" > 1 month </ TabsTrigger >
156
+ < TabsTrigger value = "3600" > { t ( 'create.settings.delays.1h' ) } </ TabsTrigger >
157
+ < TabsTrigger value = "86400" > { t ( 'create.settings.delays.1d' ) } </ TabsTrigger >
158
+ < TabsTrigger value = "604800" > { t ( 'create.settings.delays.1w' ) } </ TabsTrigger >
159
+ < TabsTrigger value = "2592000" > { t ( 'create.settings.delays.1m' ) } </ TabsTrigger >
153
160
</ TabsList >
154
161
</ Tabs >
155
162
</ TextFieldRoot >
@@ -173,26 +180,28 @@ export const CreateNotePage: Component = () => {
173
180
)} */ }
174
181
175
182
< TextFieldRoot class = "w-full" >
176
- < TextFieldLabel > Delete after reading</ TextFieldLabel >
183
+ < TextFieldLabel >
184
+ { t ( 'create.settings.delete-after-reading.label' ) }
185
+ </ TextFieldLabel >
177
186
< SwitchUiComponent class = "flex items-center space-x-2" checked = { getDeleteAfterReading ( ) } onChange = { setDeleteAfterReading } >
178
187
< SwitchControl >
179
188
< SwitchThumb />
180
189
</ SwitchControl >
181
190
< SwitchLabel class = "text-sm text-muted-foreground" >
182
- Delete the note after reading
191
+ { t ( 'create.settings.delete- after- reading.description' ) }
183
192
</ SwitchLabel >
184
193
</ SwitchUiComponent >
185
194
</ TextFieldRoot >
186
195
187
196
< div >
188
197
< FileUploaderButton variant = "secondary" class = "mt-2 w-full" multiple onFilesUpload = { ( { files } ) => setUploadedFiles ( prevFiles => [ ...prevFiles , ...files ] ) } >
189
198
< div class = "i-tabler-upload mr-2 text-lg text-muted-foreground" > </ div >
190
- Attach files
199
+ { t ( 'create.settings.attach- files' ) }
191
200
</ FileUploaderButton >
192
201
193
202
< Button class = "mt-2 w-full" onClick = { createNote } >
194
203
< div class = "i-tabler-plus mr-2 text-lg text-muted-foreground" > </ div >
195
- Create note
204
+ { t ( 'create.settings.create' ) }
196
205
</ Button >
197
206
</ div >
198
207
@@ -203,7 +212,6 @@ export const CreateNotePage: Component = () => {
203
212
< div class = "truncate" title = { file . name } >
204
213
{ file . name }
205
214
</ div >
206
- { /* <div class="text-muted-foreground text-sm">{(file.size)}</div> */ }
207
215
208
216
< Button class = "size-9 ml-auto" variant = "ghost" onClick = { ( ) => setUploadedFiles ( prevFiles => prevFiles . filter ( f => f !== file ) ) } >
209
217
< div class = "i-tabler-x text-lg text-muted-foreground cursor-pointer flex-shrink-0" > </ div >
@@ -230,12 +238,16 @@ export const CreateNotePage: Component = () => {
230
238
< div class = "flex flex-col justify-center items-center gap-2 w-full mt-12 mx-auto" >
231
239
< div class = "i-tabler-circle-check text-primary text-5xl" > </ div >
232
240
< div class = "text-xl font-semibold" >
233
- Note created successfully
241
+ { t ( 'create.success.title' ) }
234
242
</ div >
235
243
236
244
< div class = "text-muted-foreground text-center max-w-400px" >
237
- Your note has been created. You can now share it using the following link.
238
- { getDeleteAfterReading ( ) && ( ' This note will be deleted after reading.' ) }
245
+ {
246
+ [
247
+ t ( 'create.success.description' ) ,
248
+ getDeleteAfterReading ( ) && t ( 'create.success.with-deletion' ) ,
249
+ ] . filter ( Boolean ) . join ( ' ' )
250
+ }
239
251
240
252
</ div >
241
253
@@ -250,14 +262,14 @@ export const CreateNotePage: Component = () => {
250
262
class = "flex-shrink-0 w-full sm:w-auto"
251
263
autofocus
252
264
text = { getNoteUrl ( ) }
253
- label = "Copy link"
254
- copiedLabel = "Link copied"
265
+ label = { t ( 'create.success.copy- link' ) }
266
+ copiedLabel = { t ( 'create.success.copy-success' ) }
255
267
/>
256
268
257
269
< Show when = { getIsShareApiSupported ( ) } >
258
270
< Button variant = "secondary" class = "flex-shrink-0 w-full sm:w-auto" onClick = { shareNote } >
259
271
< div class = "i-tabler-share mr-2 text-lg" > </ div >
260
- Share
272
+ { t ( 'create.share.button' ) }
261
273
</ Button >
262
274
</ Show >
263
275
</ div >
0 commit comments