Compare commits

...

925 Commits

Author SHA1 Message Date
Daniel
3ce30ec0f6 Merge pull request #1255 from linkwarden/dev
Dev
2025-06-27 20:34:28 +03:30
daniel31x13
e08684328a improved performance 2025-06-27 13:03:21 -04:00
Daniel
fe06ecc3f6 Merge pull request #1254 from linkwarden/main
sync
2025-06-27 19:24:12 +03:30
daniel31x13
42d877e2b5 small fix 2025-06-27 11:52:54 -04:00
Daniel
94cba5394f Merge pull request #1253 from linkwarden/dev
minor fix
2025-06-27 16:56:46 +03:30
daniel31x13
70999b83c5 minor fix 2025-06-27 09:26:15 -04:00
Daniel
d89aa4a4e7 Merge pull request #1249 from linkwarden/dev
v2.11.0
2025-06-27 16:47:00 +03:30
daniel31x13
c933970cce bug fixed 2025-06-27 08:16:01 -04:00
daniel31x13
8f10930127 add autoFocus to modals 2025-06-27 06:41:23 -04:00
daniel31x13
30c1a064e0 add omit field to link textContent 2025-06-27 06:21:47 -04:00
daniel31x13
d207c89d8e small improvements 2025-06-26 19:39:12 -04:00
daniel31x13
4712dc9b26 bug fixed 2025-06-26 17:55:19 -04:00
daniel31x13
1203f62ab3 Merge branch 'dev' of https://github.com/linkwarden/linkwarden into dev 2025-06-26 16:10:11 -04:00
daniel31x13
c1df0db729 improvements 2025-06-26 16:10:09 -04:00
Daniel
ee5814a0e4 Merge pull request #1248 from linkwarden/i18n
New Crowdin updates
2025-06-26 21:50:46 +03:30
daniel31x13
126d98d1b8 small improvement 2025-06-26 13:54:50 -04:00
daniel31x13
ebbe68dc9c bug fixed 2025-06-26 13:45:08 -04:00
daniel31x13
5a763bdce0 minor fix 2025-06-26 13:37:48 -04:00
Daniel
3b36cf09f4 New translations common.json (Russian) 2025-06-26 20:57:10 +03:30
daniel31x13
fb017a7655 small improvement 2025-06-26 13:18:02 -04:00
daniel31x13
b462531da8 small improvement to the seed script 2025-06-26 13:13:50 -04:00
daniel31x13
acbefe4b6e update logo 2025-06-26 12:43:18 -04:00
LinkwardenBot
e5296dd5c9 New translations common.json (Portuguese, Brazilian) 2025-06-26 15:52:19 +00:00
LinkwardenBot
a8295f94b8 New translations common.json (English) 2025-06-26 15:52:19 +00:00
LinkwardenBot
8607c066b8 New translations common.json (Chinese Traditional) 2025-06-26 15:52:19 +00:00
LinkwardenBot
63bc36d5ef New translations common.json (Chinese Simplified) 2025-06-26 15:52:19 +00:00
LinkwardenBot
74a671d165 New translations common.json (Ukrainian) 2025-06-26 15:52:19 +00:00
LinkwardenBot
b95c4b2d97 New translations common.json (Turkish) 2025-06-26 15:52:19 +00:00
LinkwardenBot
9a4f74e4a9 New translations common.json (Russian) 2025-06-26 15:52:19 +00:00
LinkwardenBot
e43fd9359b New translations common.json (Polish) 2025-06-26 15:52:19 +00:00
LinkwardenBot
be011955b5 New translations common.json (Dutch) 2025-06-26 15:52:19 +00:00
LinkwardenBot
5660093f1a New translations common.json (Japanese) 2025-06-26 15:52:19 +00:00
LinkwardenBot
a7b13e27f9 New translations common.json (Italian) 2025-06-26 15:52:19 +00:00
LinkwardenBot
f25edb1302 New translations common.json (German) 2025-06-26 15:52:19 +00:00
LinkwardenBot
592254daba New translations common.json (Spanish) 2025-06-26 15:52:19 +00:00
LinkwardenBot
395a7a58aa New translations common.json (French) 2025-06-26 15:52:19 +00:00
LinkwardenBot
7fcd73b61b New translations common.json (Portuguese, Brazilian) 2025-06-26 15:52:19 +00:00
LinkwardenBot
b091e133a7 New translations common.json (Chinese Traditional) 2025-06-26 15:52:19 +00:00
LinkwardenBot
5c8e339864 New translations common.json (Chinese Simplified) 2025-06-26 15:52:19 +00:00
LinkwardenBot
35808ef03f New translations common.json (Ukrainian) 2025-06-26 15:52:19 +00:00
LinkwardenBot
1fc7f436a1 New translations common.json (Turkish) 2025-06-26 15:52:19 +00:00
LinkwardenBot
2e15d43e4b New translations common.json (Russian) 2025-06-26 15:52:19 +00:00
LinkwardenBot
8b25a54b26 New translations common.json (Polish) 2025-06-26 15:52:19 +00:00
LinkwardenBot
6c4f694f17 New translations common.json (Dutch) 2025-06-26 15:52:19 +00:00
LinkwardenBot
a6370dd24b New translations common.json (Japanese) 2025-06-26 15:52:19 +00:00
LinkwardenBot
873f51379d New translations common.json (Italian) 2025-06-26 15:52:19 +00:00
LinkwardenBot
701824dd18 New translations common.json (German) 2025-06-26 15:52:19 +00:00
LinkwardenBot
e39876790b New translations common.json (Spanish) 2025-06-26 15:52:19 +00:00
LinkwardenBot
db7135abdf New translations common.json (French) 2025-06-26 15:52:19 +00:00
daniel31x13
0b89ab3e35 minor improvement 2025-06-26 11:07:03 -04:00
Daniel
707ec84ee2 Merge pull request #1247 from linkwarden/i18n
New Crowdin updates
2025-06-26 02:04:38 +03:30
LinkwardenBot
ba03f99666 New translations common.json (Portuguese, Brazilian) 2025-06-25 22:34:12 +00:00
LinkwardenBot
6cbf9c7153 New translations common.json (English) 2025-06-25 22:34:12 +00:00
LinkwardenBot
b230c12f61 New translations common.json (Chinese Traditional) 2025-06-25 22:34:12 +00:00
LinkwardenBot
f3cd1845b7 New translations common.json (Chinese Simplified) 2025-06-25 22:34:12 +00:00
LinkwardenBot
580c87880b New translations common.json (Ukrainian) 2025-06-25 22:34:12 +00:00
LinkwardenBot
52a10aba1e New translations common.json (Turkish) 2025-06-25 22:34:12 +00:00
LinkwardenBot
5dcf73570e New translations common.json (Russian) 2025-06-25 22:34:12 +00:00
LinkwardenBot
5cffa0bd4f New translations common.json (Polish) 2025-06-25 22:34:12 +00:00
LinkwardenBot
6a8bb8b6e8 New translations common.json (Dutch) 2025-06-25 22:34:12 +00:00
LinkwardenBot
3e3a368131 New translations common.json (Japanese) 2025-06-25 22:34:12 +00:00
LinkwardenBot
6b7fca78e1 New translations common.json (Italian) 2025-06-25 22:34:12 +00:00
LinkwardenBot
d356fc9fd5 New translations common.json (German) 2025-06-25 22:34:12 +00:00
LinkwardenBot
f198cc5923 New translations common.json (Spanish) 2025-06-25 22:34:12 +00:00
LinkwardenBot
4e50ead03e New translations common.json (French) 2025-06-25 22:34:12 +00:00
LinkwardenBot
c716a986a3 New translations common.json (Portuguese, Brazilian) 2025-06-25 22:34:12 +00:00
LinkwardenBot
fcf9548552 New translations common.json (English) 2025-06-25 22:34:12 +00:00
LinkwardenBot
918d0d46b2 New translations common.json (Chinese Traditional) 2025-06-25 22:34:12 +00:00
LinkwardenBot
a57ec28f3d New translations common.json (Chinese Simplified) 2025-06-25 22:34:12 +00:00
LinkwardenBot
fc4ba6a1fc New translations common.json (Ukrainian) 2025-06-25 22:34:12 +00:00
LinkwardenBot
b05c96360f New translations common.json (Turkish) 2025-06-25 22:34:12 +00:00
LinkwardenBot
37f13af8aa New translations common.json (Russian) 2025-06-25 22:34:12 +00:00
LinkwardenBot
1e24580010 New translations common.json (Polish) 2025-06-25 22:34:12 +00:00
LinkwardenBot
69c713bf50 New translations common.json (Dutch) 2025-06-25 22:34:12 +00:00
LinkwardenBot
e9853bc6f5 New translations common.json (Japanese) 2025-06-25 22:34:12 +00:00
LinkwardenBot
dbb055699a New translations common.json (Italian) 2025-06-25 22:34:12 +00:00
LinkwardenBot
da3d4e2c0a New translations common.json (German) 2025-06-25 22:34:12 +00:00
LinkwardenBot
27d88c2218 New translations common.json (Spanish) 2025-06-25 22:34:12 +00:00
LinkwardenBot
b59ccfffa1 New translations common.json (French) 2025-06-25 22:34:12 +00:00
daniel31x13
4bc0476e38 small fix 2025-06-25 18:30:51 -04:00
daniel31x13
eba81441ea minor fix 2025-06-25 18:24:59 -04:00
daniel31x13
4bd91f0b95 minor fix 2025-06-25 18:19:22 -04:00
daniel31x13
134757648d small fix 2025-06-25 18:09:31 -04:00
daniel31x13
86a5d0f965 small fix 2025-06-25 18:04:10 -04:00
daniel31x13
8a838f382a add locale-action.yml 2025-06-25 17:54:37 -04:00
daniel31x13
dd2361d1cf update readme 2025-06-25 16:10:16 -04:00
daniel31x13
a251e5e526 Revert "New translations common.json (Portuguese, Brazilian)"
This reverts commit f5633089f9.
2025-06-25 16:08:49 -04:00
daniel31x13
1e8a0fd1c9 Revert "add translation readme"
This reverts commit 1339b5d625.

revert
2025-06-25 15:40:12 -04:00
LinkwardenBot
d4cc066c76 Merge pull request #1245 from linkwarden/LinkwardenBot-patch-1
Update .prettierignore
2025-06-25 15:08:56 -04:00
LinkwardenBot
a1f2f3484b Update .prettierignore 2025-06-25 15:08:02 -04:00
daniel31x13
1339b5d625 add translation readme 2025-06-25 12:59:30 -04:00
Daniel
40abb89602 Merge pull request #1243 from linkwarden/dev-i18n
New Crowdin updates
2025-06-25 18:29:48 +03:30
Daniel
0a8d48a07a New translations common.json (English) 2025-06-25 18:19:34 +03:30
daniel31x13
b3530225f4 remove test 2025-06-25 10:48:40 -04:00
daniel31x13
78726a2f04 crowdin test commit 2025-06-25 10:43:10 -04:00
Daniel
c44f044505 Merge pull request #1242 from linkwarden/dev-i18n
New Crowdin updates
2025-06-25 18:11:19 +03:30
Daniel
8508360dc7 New translations common.json (Portuguese, Brazilian) 2025-06-25 18:09:30 +03:30
Daniel
c16b1c621c New translations common.json (English) 2025-06-25 18:09:28 +03:30
Daniel
e098fe1c39 New translations common.json (Chinese Traditional) 2025-06-25 18:09:27 +03:30
Daniel
7f8c856f6c New translations common.json (Chinese Simplified) 2025-06-25 18:09:26 +03:30
Daniel
8b1a88f326 New translations common.json (Ukrainian) 2025-06-25 18:09:25 +03:30
Daniel
9ced58eae8 New translations common.json (Turkish) 2025-06-25 18:09:24 +03:30
Daniel
3b2e5089d4 New translations common.json (Russian) 2025-06-25 18:09:23 +03:30
Daniel
3822475fa4 New translations common.json (Polish) 2025-06-25 18:09:21 +03:30
Daniel
929e23850b New translations common.json (Dutch) 2025-06-25 18:09:20 +03:30
Daniel
3645c6f0ff New translations common.json (Japanese) 2025-06-25 18:09:19 +03:30
Daniel
1ad44a81a3 New translations common.json (Italian) 2025-06-25 18:09:17 +03:30
Daniel
d4a808e808 New translations common.json (German) 2025-06-25 18:09:16 +03:30
Daniel
3953bb000c New translations common.json (Spanish) 2025-06-25 18:09:15 +03:30
Daniel
2be900a3f0 New translations common.json (French) 2025-06-25 18:09:14 +03:30
Daniel
92d335ddbe Merge pull request #1241 from linkwarden/dev-i18n
New Crowdin updates
2025-06-25 18:00:01 +03:30
Daniel
f5633089f9 New translations common.json (Portuguese, Brazilian) 2025-06-25 17:54:56 +03:30
Daniel
1b6f8f1fc8 New translations common.json (English) 2025-06-25 17:54:55 +03:30
Daniel
5cd0fbdf6f New translations common.json (Chinese Traditional) 2025-06-25 17:54:54 +03:30
Daniel
05a20d9279 New translations common.json (Chinese Simplified) 2025-06-25 17:54:52 +03:30
Daniel
91a5c548d8 New translations common.json (Ukrainian) 2025-06-25 17:54:51 +03:30
Daniel
95f3ae382a New translations common.json (Turkish) 2025-06-25 17:54:50 +03:30
Daniel
6e3354ff0b New translations common.json (Russian) 2025-06-25 17:54:49 +03:30
Daniel
9d92e0103c New translations common.json (Polish) 2025-06-25 17:54:48 +03:30
Daniel
a57fc3f1c2 New translations common.json (Dutch) 2025-06-25 17:54:47 +03:30
Daniel
cc3a719611 New translations common.json (Japanese) 2025-06-25 17:54:45 +03:30
Daniel
16107c8369 New translations common.json (Italian) 2025-06-25 17:54:44 +03:30
Daniel
43f6314ce2 New translations common.json (German) 2025-06-25 17:54:43 +03:30
Daniel
5884687abc New translations common.json (Spanish) 2025-06-25 17:54:42 +03:30
Daniel
835fe3de17 New translations common.json (French) 2025-06-25 17:54:40 +03:30
Daniel
f8839dbdd2 New translations common.json (Portuguese, Brazilian) 2025-06-25 17:39:39 +03:30
Daniel
b0987581c0 New translations common.json (Chinese Traditional) 2025-06-25 17:39:37 +03:30
Daniel
1a02ba64a8 New translations common.json (Chinese Simplified) 2025-06-25 17:39:36 +03:30
Daniel
0ed87d7ffc New translations common.json (Ukrainian) 2025-06-25 17:39:35 +03:30
Daniel
ddd47d74e3 New translations common.json (Turkish) 2025-06-25 17:39:33 +03:30
Daniel
213b0aafee New translations common.json (Russian) 2025-06-25 17:39:32 +03:30
Daniel
396e41a232 New translations common.json (Polish) 2025-06-25 17:39:30 +03:30
Daniel
e04c256bd3 New translations common.json (Dutch) 2025-06-25 17:39:29 +03:30
Daniel
2023d6984f New translations common.json (Japanese) 2025-06-25 17:39:28 +03:30
Daniel
43ebd72aca New translations common.json (Italian) 2025-06-25 17:39:26 +03:30
Daniel
572fa267d0 New translations common.json (German) 2025-06-25 17:39:25 +03:30
Daniel
846a233639 New translations common.json (Spanish) 2025-06-25 17:39:24 +03:30
Daniel
a6e3ae1de5 New translations common.json (French) 2025-06-25 17:39:22 +03:30
daniel31x13
c0159e5a27 minor fix 2025-06-25 09:38:16 -04:00
Daniel
ee1785ca6e Update Crowdin configuration file 2025-06-25 16:18:04 +03:30
daniel31x13
7bf4db9b25 refactor(web): use separator component 2025-06-24 14:52:09 -04:00
daniel31x13
803a97b7e0 code cleanup 2025-06-24 13:48:04 -04:00
daniel31x13
87715b8f62 revert crowdin.yml removal 2025-06-24 13:01:15 -04:00
Daniel
276a2a30c8 Update Crowdin configuration file 2025-06-24 20:29:10 +03:30
daniel31x13
bbad712e0d remove files 2025-06-24 12:51:57 -04:00
daniel31x13
32f481f65b minor fix 2025-06-24 12:34:41 -04:00
daniel31x13
b7e260e180 minor fix 2025-06-24 12:29:41 -04:00
daniel31x13
df89364c0d minor fix 2025-06-24 12:17:47 -04:00
daniel31x13
77731dcf8a minor fix 2025-06-24 12:16:05 -04:00
daniel31x13
292fadaa1e move file 2025-06-24 12:15:11 -04:00
daniel31x13
fc801f98a9 add crowdin.yml file 2025-06-24 12:10:47 -04:00
daniel31x13
a005e05d72 minor fix 2025-06-23 12:43:05 -04:00
daniel31x13
6124062a85 add crowdin file 2025-06-20 06:48:07 -04:00
Daniel
1a69058c7a Merge pull request #1226 from linkwarden/hotfix
hotfix
2025-06-12 14:38:04 +03:30
Daniel
4580f8cd26 Merge branch 'dev' into hotfix 2025-06-12 14:37:48 +03:30
Daniel
63050ae7c2 Merge pull request #1225 from linkwarden/hotfix
hotfix
2025-06-12 14:36:22 +03:30
Daniel
82f1bd943e hotfix 2025-06-12 14:35:34 +03:30
daniel31x13
6a8ce9614b fix build error 2025-06-11 11:55:47 -04:00
Daniel
60bb97e4ca Merge pull request #1223 from linkwarden/feat/import-from-pocket
feat(web): add import from pocket
2025-06-11 19:12:49 +03:30
daniel31x13
c9f2799618 feat(web): add import from pocket 2025-06-11 11:40:34 -04:00
Daniel
96b508c41a Merge pull request #1222 from linkwarden/feat/redesigned-dashboard
Feat/redesigned dashboard
2025-06-11 16:33:44 +03:30
daniel31x13
a9206ca6c9 bug fixed 2025-06-10 18:18:57 -04:00
daniel31x13
441e97e4d9 minor improvement 2025-06-10 17:46:05 -04:00
daniel31x13
a918d2c960 small change 2025-06-10 17:31:06 -04:00
daniel31x13
c9860c535b add placeholder 2025-06-10 17:28:19 -04:00
daniel31x13
c2a660fd50 better looking view 2025-06-10 17:11:42 -04:00
daniel31x13
1790638012 WIP 2025-06-10 16:32:03 -04:00
daniel31x13
c9c3941688 improvements 2025-06-10 12:55:33 -04:00
daniel31x13
9f376a633c improvements 2025-06-10 08:53:09 -04:00
daniel31x13
fa0c08a1b2 minor fix 2025-06-10 07:50:47 -04:00
daniel31x13
4e0d7f5d8e add default rows 2025-06-10 07:44:21 -04:00
Daniel
59b6b7228e Merge pull request #1216 from il516/dashboard-layout
feat(dashboard): add dashboard layout reordering
2025-06-10 14:47:22 +03:30
daniel31x13
352389958c bug fixed 2025-06-09 05:16:24 -04:00
daniel31x13
6c75f3ee58 WIP 2025-06-09 04:18:37 -04:00
daniel31x13
792d03f906 small tweaks 2025-06-08 08:46:12 -04:00
Isaac
82f4921038 fix building 2025-06-07 19:05:42 -05:00
Isaac
ff497b5f66 uncomment dropdown 2025-06-07 18:45:44 -05:00
Isaac
e012c8953c fix returned links 2025-06-07 18:42:48 -05:00
Isaac
06d8cf3cb8 format 2025-06-07 18:29:19 -05:00
Isaac
7ce78fc314 final fixes 2025-06-07 18:27:57 -05:00
Isaac
de5a43cea4 fix type 2025-06-06 23:58:41 -05:00
Isaac
6e47cc6897 Merge branch 'linkwarden:main' into dashboard-layout 2025-06-06 23:49:53 -05:00
Isaac
62b1bcbc59 fixes 2025-06-06 23:49:35 -05:00
Isaac
8718b1acfe Merge branch 'dev' of https://github.com/IsaacWise06/linkwarden into dashboard-layout 2025-06-06 22:14:46 -05:00
Isaac
f36d36dec7 optimistic update 2025-06-06 21:44:01 -05:00
Isaac
8b6ded9179 Better drag and drop 2025-06-06 21:21:14 -05:00
Isaac
4333d2686c Improve endpoint & reordering when a collection is deleted 2025-06-06 21:06:34 -05:00
daniel31x13
78c1f6246f minor fix 2025-06-06 16:52:41 -04:00
daniel31x13
941bc04fc8 small improvement 2025-06-06 16:45:52 -04:00
daniel31x13
cfa36fc8da bug fixed 2025-06-06 16:33:47 -04:00
daniel31x13
9388073cbf bug fix 2025-06-06 16:11:54 -04:00
daniel31x13
90eeba5191 feat(web): add commenting functionality 2025-06-06 11:18:03 -04:00
daniel31x13
95846c1d09 feat(web): add comments for highlights ui 2025-06-06 10:06:40 -04:00
daniel31x13
31b8092472 small improvement 2025-06-06 08:53:33 -04:00
daniel31x13
2a62c1ee1a feat(web): added highlights drawer 2025-06-06 08:49:22 -04:00
daniel31x13
5a028e98e3 minor improvement 2025-06-05 09:06:27 -04:00
Daniel
8ed5147762 Merge pull request #1209 from Talkabout/dev
improve preview generation for webpages in case site does not provide an icon
2025-06-05 00:52:07 +03:30
Daniel
a20c4a67a8 Merge branch 'dev' into dev 2025-06-05 00:51:52 +03:30
daniel31x13
bf8ac7d801 minor fix 2025-06-04 17:16:21 -04:00
Daniel
2971871a51 Merge pull request #1196 from Vlad1mir-D/fix/952-invalid-image-url
fix(worker): determine origin for ogImageUrl (closes #952)
2025-06-05 00:17:44 +03:30
Daniel
834714a941 Merge pull request #1182 from redrathnure/fix-file-handling
fix: "Error copying file" when no src file
2025-06-04 17:24:26 +03:30
daniel31x13
08523b2234 minor fix 2025-06-04 09:52:48 -04:00
daniel31x13
479fea3ea4 minor improvement 2025-06-03 17:22:53 -04:00
daniel31x13
a34f1d7308 bug fixes 2025-06-03 17:15:21 -04:00
Daniel
b18ce2239a Merge pull request #1210 from linkwarden/feat/improved-readable-page
Feat/improved readable page
2025-06-03 23:57:19 +03:30
daniel31x13
17f32152c3 minor fix 2025-06-03 16:23:06 -04:00
daniel31x13
47c711fea6 feat(web): finished readable dropdown 2025-06-03 15:57:32 -04:00
Isaac
4423a30a72 format 2025-06-02 15:52:08 -05:00
Isaac
cefe5e9e1b Bug fixes 2025-06-02 15:47:28 -05:00
Talkabout
d30fb4645e improve preview generation for webpages in case site does not provide an icon 2025-06-02 18:08:48 +02:00
daniel31x13
ae099dce4f minor improvement 2025-06-02 03:17:46 -04:00
daniel31x13
7c740f01d2 feat(web): sleeker alert + remove collection name confirmation requirement 2025-06-02 03:12:50 -04:00
daniel31x13
2b8964ca64 feat(web): add a text style dropdown to readable view 2025-06-02 02:46:24 -04:00
Isaac
048842efa4 format 2025-06-01 17:14:28 -05:00
Isaac
29d90db991 basic endpoint, drag and drop, and ordering on dashboard 2025-06-01 17:13:54 -05:00
Isaac
c99067ac37 Start endpoint 2025-05-31 22:46:58 -05:00
Isaac
4a66e1ec9c Dropdown, database & start endpoint 2025-05-31 17:19:02 -05:00
daniel31x13
1211b6b1ef feat(web): hide navbar in readable view 2025-05-30 12:26:57 -04:00
Isaac
fbb1ce9687 another constraint 2025-05-29 23:35:09 -05:00
Isaac
3959a42a30 database 2025-05-29 23:19:22 -05:00
Isaac
759cb15148 fix 2025-05-29 23:13:23 -05:00
Isaac
8ecd35acfe Start reordering dropdown 2025-05-29 23:10:44 -05:00
daniel31x13
db9ea8eef4 improved readable view 2025-05-28 12:00:07 -04:00
daniel31x13
b32151eb7e WIP 2025-05-28 09:36:25 -04:00
daniel31x13
d377fa6eb0 minor fix 2025-05-27 21:48:01 -04:00
daniel31x13
4b958faf7e improved tabs 2025-05-27 17:58:40 -04:00
daniel31x13
6981ad6d7a refactor(web): use the new tooltip component 2025-05-27 15:20:23 -04:00
daniel31x13
2d97f3a138 small improvement 2025-05-27 12:47:33 -04:00
daniel31x13
e668b67a3d refactor(web): use the new button component for consistency and improved styling 2025-05-27 12:44:29 -04:00
Daniel
41eb7df457 Merge pull request #1202 from linkwarden/feat/improved-ui
Feat/improved UI
2025-05-26 20:02:08 +03:30
Daniel
7725a5dd8b Merge branch 'dev' into feat/improved-ui 2025-05-26 20:01:41 +03:30
daniel31x13
37588acc0d Merge branch 'dev' of https://github.com/linkwarden/linkwarden into dev 2025-05-26 12:27:43 -04:00
daniel31x13
6ad2511fbc Merge branch 'PeterDaveHelloKitchen-zh-TW' into dev 2025-05-26 12:26:17 -04:00
daniel31x13
f3cb12c962 Merge branch 'zh-TW' of https://github.com/PeterDaveHelloKitchen/linkwarden into PeterDaveHelloKitchen-zh-TW 2025-05-26 12:25:30 -04:00
Daniel
99fa0b1d8b Merge pull request #1188 from SoCuul/fix/name-capitalization
fix(web): fix capitalization of collection names
2025-05-26 19:49:35 +03:30
Daniel
9db7ff329a Merge pull request #1201 from il516/bulk-refresh-preservations
feat(links): Add refresh preserved formats to bulk actions
2025-05-26 19:47:32 +03:30
daniel31x13
6bdf0f1c91 small change 2025-05-26 12:16:21 -04:00
Isaac
cd23f10480 format 2025-05-25 15:11:20 -05:00
Isaac
bea11edbe8 tooltip 2025-05-25 15:09:36 -05:00
Isaac
d565958e5f Fix permissions 2025-05-24 22:47:33 -05:00
daniel31x13
7222b19745 minor change 2025-05-24 17:05:32 -04:00
daniel31x13
b9be960c7e improved dropdown UI 2025-05-24 17:01:15 -04:00
Isaac
b337045ab2 Start bulk refreshing preserved formats 2025-05-23 21:23:07 -05:00
Vladimir
14db14ff07 fix(worker): determine origin for ogImageUrl (closes #952) 2025-05-24 02:20:04 +03:00
daniel31x13
6ca2774b28 replaced button component with shadcn button 2025-05-23 18:49:25 -04:00
daniel31x13
c3d702ad53 minor fix 2025-05-23 18:07:40 -04:00
daniel31x13
921d8a3718 base comment for shadcn 2025-05-23 17:42:48 -04:00
daniel31x13
2b258680b1 minor improvement to the dropdown component 2025-05-23 16:58:56 -04:00
daniel31x13
82f5a7026f feat(web): make things less rounded 2025-05-23 15:52:46 -04:00
daniel31x13
daef130728 feat(mobile): add modal component 2025-05-23 10:23:38 -04:00
daniel31x13
a181b43529 refactor(mobile): use nativewind instead of regular styles 2025-05-22 11:57:33 -04:00
Daniel
968bd04b40 Merge pull request #1194 from linkwarden/hotfix
minor fix
2025-05-22 13:31:52 +03:30
Daniel
46c20af530 fix logo 2025-05-22 13:30:00 +03:30
daniel31x13
cfb4081112 minor fix 2025-05-22 05:55:55 -04:00
daniel31x13
61ca5cf3e5 feat(mobile): add persistence 2025-05-19 20:14:50 -04:00
daniel31x13
cecbf694f5 fix(mobile): replace react-native-render-html package 2025-05-14 13:36:24 -04:00
daniel31x13
0e122c7485 feat(mobile): view readable formats 2025-05-14 09:36:55 -04:00
daniel31x13
c6713f67f4 feat(mobile): preserved formats basic viewing functionality 2025-05-12 12:02:31 -04:00
daniel31x13
dc8e763b76 feat(mobile): add search functionality 2025-05-12 06:27:10 -04:00
daniel31x13
2a52a0c79f fix(web): improved prompt output 2025-05-12 04:09:54 -04:00
SoCuul
08e1f499e1 fix(web): fix capitalization of collection names 2025-05-10 00:52:32 -07:00
Peter Dave Hello
63196e7b99 Update and improve zh-TW Traditional Chinese locale 2025-05-07 22:34:28 +08:00
Maxim Medvedev
7cae35ce8d fix: "Error copying file" when no src file 2025-05-06 18:52:06 +02:00
daniel31x13
369b3d6207 fix(web): active tabs now are adjusted properly 2025-05-06 08:51:10 -04:00
Daniel
3762d971e9 Merge pull request #1181 from linkwarden/dev
minor fix
2025-05-06 06:40:59 +03:30
daniel31x13
f3d8a3cc95 minor fix 2025-05-05 23:09:33 -04:00
Daniel
56efeecbfd Merge pull request #1180 from linkwarden/dev
v2.10.2
2025-05-06 06:08:22 +03:30
Daniel
be8aef987a Merge pull request #1174 from wnor543/dev
feat(web): add support for http/https proxies
2025-05-06 06:03:47 +03:30
daniel31x13
4b9de5cd96 add https-proxy-agent to worker as well 2025-05-05 22:33:11 -04:00
daniel31x13
59949e21ee bump version 2025-05-05 22:17:34 -04:00
Daniel
6fda674529 Merge pull request #1179 from linkwarden/dev
fix(worker): prevent sendToWayback from crashing
2025-05-06 02:49:50 +03:30
daniel31x13
4318207c39 fix(worker): prevent sendToWayback from crashing 2025-05-05 19:18:56 -04:00
Daniel
c48ad18379 Merge pull request #1178 from linkwarden/dev
Dev
2025-05-06 02:40:50 +03:30
daniel31x13
d647c60f04 fix(worker): exit monolith processes appropriately 2025-05-05 19:08:52 -04:00
wnor543
f83a9e899c feat(web): add support for http/https proxies 2025-05-05 11:01:45 +00:00
daniel31x13
b7c0cef8de feat(mobile): open saved items in webview 2025-05-04 13:40:43 -04:00
daniel31x13
14340afb99 code cleanup 2025-05-04 12:01:24 -04:00
Daniel
b903a12f8d Merge pull request #1171 from linkwarden/dev
minor fix
2025-05-03 19:14:04 +03:30
daniel31x13
c6f7c18441 minor fix 2025-05-03 11:42:36 -04:00
Daniel
6d334be82e Merge pull request #1170 from linkwarden/dev
v2.10.1
2025-05-03 18:14:02 +03:30
daniel31x13
195cb99c90 log processing queue to console 2025-05-03 09:10:39 -04:00
daniel31x13
2ebd311e0e small fix 2025-05-03 09:10:10 -04:00
Daniel
1da1f17ea3 Merge pull request #1168 from simcop2387/main
Implement more of the vercel openai sdk bits to allow for api compatible servers
2025-05-03 16:02:59 +03:30
daniel31x13
bc36513952 used the "@ai-sdk/openai-compatible" package instead 2025-05-03 08:15:13 -04:00
daniel31x13
b04ab898d7 bug fix 2025-05-02 11:31:01 -04:00
Ryan Voots
778dd764f6 Merge remote-tracking branch 'upstream/dev' 2025-05-02 09:11:50 -04:00
daniel31x13
64f8922741 bump meilisearch timeout and make it configurable 2025-05-02 00:28:21 -04:00
Ryan Voots
c8ed9ac72d Implement more of the vercel openai sdk bits to allow for api compatible proxies and servers 2025-05-01 22:15:08 -04:00
daniel31x13
6cfd26da32 bug fix 2025-05-01 05:48:50 -04:00
daniel31x13
b56cf3faa4 bug fix 2025-05-01 05:33:59 -04:00
daniel31x13
f7526df008 bug fix 2025-04-30 11:52:14 -04:00
daniel31x13
bbeba7f50f improved mobile app + fixed a bug in the worker script 2025-04-30 10:16:24 -04:00
daniel31x13
7e5fa3eacd minor improvement 2025-04-27 11:52:39 -04:00
daniel31x13
89826bd721 add loader 2025-04-27 11:21:34 -04:00
daniel31x13
fb819b6142 ui fix 2025-04-27 09:51:39 -04:00
daniel31x13
2e131403d4 add LinkListing component 2025-04-27 09:43:02 -04:00
daniel31x13
83db594fde bug fixed 2025-04-27 01:31:18 -04:00
daniel31x13
83b002d585 remove old readme 2025-04-24 06:07:36 -04:00
Daniel
7207259cdf Merge pull request #1155 from linkwarden/mobile-app
Mobile-app
2025-04-24 12:09:51 +03:30
daniel31x13
7c647ae02d bug fix 2025-04-23 16:44:13 -04:00
daniel31x13
0630ea536e bug fixed 2025-04-23 15:54:21 -04:00
daniel31x13
f2f73fc894 bug fixed 2025-04-23 10:49:11 -04:00
daniel31x13
7887f55dd0 bug fix 2025-04-21 20:04:16 -04:00
daniel31x13
5ba759bb41 base commit for mobile app 2025-04-21 19:05:49 -04:00
daniel31x13
f325be0364 remove old architecture file 2025-04-21 12:55:14 -04:00
daniel31x13
f3c8647ff2 move react-query to the @linkwarden/router package 2025-04-21 10:14:08 -04:00
daniel31x13
ceb6b8f8e7 add router directory 2025-04-21 09:28:59 -04:00
daniel31x13
94d953d449 adapt docker to the new folder structure + bug fix 2025-04-19 17:48:01 -04:00
daniel31x13
7f74fd75c9 made everything functional across the workspaces 2025-04-19 10:48:22 -04:00
daniel31x13
4151b37f9f separate prisma as a package 2025-04-14 13:26:55 -04:00
daniel31x13
1b45286aaf move files to /apps/web directory 2025-04-10 18:38:59 -04:00
Daniel
d578fdc0c4 Merge pull request #1104 from linkwarden/dev
v2.10.0
2025-04-08 00:42:32 +03:30
Daniel
2f2747cfc8 Merge pull request #1083 from sinsky/openrouter-provider
OpenRouter AI Provider
2025-04-05 16:59:46 +03:30
Daniel
f254bd85b5 Merge pull request #1109 from TheMeier/gitlab_url
feat(gitlab-auth): allow to configure GitLab instance
2025-04-04 21:51:53 +03:30
daniel31x13
a321d12307 small fix 2025-04-04 14:02:32 -04:00
daniel31x13
0e5e3ea00e finished highlight feature implementation 2025-04-04 13:39:54 -04:00
daniel31x13
6599fd7f5a minor fix 2025-04-04 11:29:46 -04:00
daniel31x13
225288c742 minor fix 2025-04-04 11:29:17 -04:00
daniel31x13
9bf77e849f minor improvement 2025-04-04 11:16:10 -04:00
daniel31x13
44ae6d0dbf WIP 2025-04-01 02:17:00 -04:00
Christoph Maser
3684204a03 feat(gitlab-auth): allow to configure GitLab instance
This change allows to configure the GitLab instance URL in the
`.env` file. This is useful for self-hosted GitLab instances.
2025-03-30 16:49:29 +02:00
daniel31x13
5d17b628cc small change 2025-03-20 23:41:24 -04:00
daniel31x13
197a5b3b74 bug fix 2025-03-20 23:25:32 -04:00
daniel31x13
278b674ea7 small change 2025-03-20 08:00:50 -04:00
daniel31x13
78e8078d6b upped the size limits for the preservations 2025-03-20 00:11:04 -04:00
daniel31x13
2f05dbad5d improvements to docker 2025-03-19 23:47:31 -04:00
daniel31x13
0987475e41 revert change 2025-03-19 11:56:42 -04:00
daniel31x13
41e34ba4ec small improvement 2025-03-19 11:52:43 -04:00
daniel31x13
dd78c1570f bug fix 2025-03-18 09:20:40 -04:00
daniel31x13
5bf90c56de bug fix 2025-03-18 08:33:24 -04:00
daniel31x13
35643faf85 bug fixed 2025-03-12 10:36:47 -04:00
Daniel
72c5a05324 Merge pull request #1093 from linkwarden/feat/text-highlighting
Feat/text highlighting
2025-03-12 17:34:49 +03:30
daniel31x13
0de7988b29 update highlight functionality 2025-03-11 20:12:30 -04:00
daniel31x13
43d5f0a205 remove highlight client side functionality 2025-03-11 19:57:26 -04:00
daniel31x13
d703ff072c add remove highlight server side 2025-03-11 09:22:47 -04:00
daniel31x13
6f80fa62d2 view highlights + bug fixed 2025-03-10 22:46:56 -04:00
daniel31x13
34b914b91f clear comments 2025-03-10 17:02:31 -04:00
daniel31x13
c6c8dab5db post highlight functionality 2025-03-09 14:42:06 -04:00
sinsky
d4bbdebe31 added openrouter ai provider 2025-03-07 02:09:36 +09:00
daniel31x13
2f5c431fa7 small improvement 2025-03-04 08:56:14 -05:00
daniel31x13
6d92ce64bd bug fix 2025-03-04 08:48:45 -05:00
daniel31x13
6c006bb748 bug fix 2025-03-04 08:42:03 -05:00
daniel31x13
d2cb7604fa improved preservation page 2025-03-04 08:29:12 -05:00
daniel31x13
dd061e9dc8 wip 2025-03-04 07:06:22 -05:00
daniel31x13
63c50d96d7 small improvement 2025-03-03 22:47:50 -05:00
daniel31x13
1360a03eb5 revert modal 2025-03-03 18:01:02 -05:00
daniel31x13
902c724f39 remove tiptap 2025-03-03 17:22:57 -05:00
daniel31x13
1677e5e0ab bug fixed 2025-03-02 11:56:40 -05:00
daniel31x13
1989510aac Merge branch 'dev' of https://github.com/linkwarden/linkwarden into dev 2025-03-02 05:55:52 -05:00
daniel31x13
ef3cf4bcfa add line to .env.sample 2025-03-02 05:55:46 -05:00
Daniel
645df6c0aa Merge pull request #1069 from weikinhuang/remote-playwright
Add PLAYWRIGHT_WS_URL to connect to a remote chrome instance
2025-03-02 14:24:56 +03:30
Daniel
dfad34c3dd Merge pull request #1042 from clemenstyp/azure-ai-provider
Azure AI provider
2025-03-02 13:46:37 +03:30
Daniel
f5abe4e1a2 Merge pull request #1067 from sur5r/linkcounttitlefix
Fix collection card link count title
2025-03-02 13:42:57 +03:30
Daniel
79e447c58d Merge pull request #1076 from linkwarden/feat/meilisearch-implementation
Feat/meilisearch implementation
2025-03-02 13:38:49 +03:30
daniel31x13
bc013e7819 implement the meilisearch for the public page 2025-02-28 06:02:41 -05:00
Wei Kin Huang
12844f2529 Add PLAYWRIGHT_WS_URL to connect to a remote chrome instance 2025-02-26 20:00:25 -05:00
daniel31x13
92a66933ce remove unused code 2025-02-26 09:51:54 -05:00
daniel31x13
bc01b6d4a9 remove filter dropdown 2025-02-26 09:18:22 -05:00
Jakob Haufe
23650bb684 Fix collection card link count title
The link icon on the collection card has a wrong title which is even
misleading if the collection is NOT shared publicly.

This was originally introduced in cf1306d2c4
and seemingly never noticed.
2025-02-25 11:21:14 +01:00
daniel31x13
140ee8c65d bug fix 2025-02-22 16:53:56 -05:00
daniel31x13
7c153d841a bug fix 2025-02-22 16:38:59 -05:00
daniel31x13
e06f52642a improvements 2025-02-22 11:18:53 -05:00
daniel31x13
874a909d1c minor improvement 2025-02-22 10:28:01 -05:00
daniel31x13
bbe702925b add negative queries 2025-02-22 10:22:42 -05:00
daniel31x13
49262d52cf bug fix 2025-02-22 07:52:23 -05:00
daniel31x13
5a468b44a1 wip 2025-02-22 07:19:48 -05:00
daniel31x13
6678f9c971 bump timeout 2025-02-16 13:22:39 -05:00
daniel31x13
b5a27968de bug fix 2025-02-16 12:43:51 -05:00
daniel31x13
4f1c6855aa bug fix 2025-02-16 12:11:43 -05:00
daniel31x13
50c7fcd012 bug fix 2025-02-16 11:23:03 -05:00
daniel31x13
de63ba523e small change 2025-02-16 11:16:13 -05:00
daniel31x13
5e2362ea62 bug fixed 2025-02-16 11:12:37 -05:00
daniel31x13
db94b01859 update take logic 2025-02-16 09:58:55 -05:00
daniel31x13
9bd821baa9 refactored search 2025-02-15 17:14:26 -05:00
daniel31x13
b69b535155 add package 2025-02-11 05:54:41 -05:00
Clemens Eyhoff
0bee36eced added azure ai provider 2025-02-11 10:55:05 +01:00
daniel31x13
d044a6cbba pass version to config route 2025-02-10 05:07:52 -05:00
Daniel
8095010835 Merge pull request #1039 from il516/worker
feat(archival): Implement archival tags and support deletion/updating of existing preservations
2025-02-09 21:03:41 +03:30
daniel31x13
bd21c3d8c3 more improved UI 2025-02-09 12:32:38 -05:00
daniel31x13
2bacf6e07d minor improvements 2025-02-09 10:40:20 -05:00
Isaac
5c73d7097f don't need this 2025-02-08 22:32:25 -06:00
Isaac
f77236d49e FIX 2025-02-08 22:29:13 -06:00
Isaac
1152571e49 format 2025-02-08 22:20:28 -06:00
Isaac
eda41d7132 Fix console warning 2025-02-08 22:20:16 -06:00
Isaac
dd58a8565a more fixes 2025-02-08 22:14:18 -06:00
Isaac
64d20df6f1 Fix tag selection & deleting new tags 2025-02-08 21:47:51 -06:00
Isaac
cd3f5f7e70 revert 2025-02-08 21:13:12 -06:00
Isaac
fca04dd0a0 fix building 2025-02-08 21:11:01 -06:00
Isaac
e024b324ed format 2025-02-08 20:57:14 -06:00
Isaac
f012eaee33 move api route & update schema 2025-02-08 20:56:36 -06:00
Isaac
794f8f07fa use existing TagSelection 2025-02-08 20:26:53 -06:00
Isaac
0a9aa774cc use existing modal for confirmation modal 2025-02-08 20:09:36 -06:00
Isaac
ebbc23f581 Make sure the user has an AI tagging method set 2025-02-07 20:39:01 -06:00
Isaac
bf7722aa2e format 2025-02-07 17:45:14 -06:00
Isaac
33637a8bca Regenerate preview when choosing to represerve 2025-02-07 17:44:26 -06:00
Isaac
80962c5df6 format & lint 2025-02-07 14:58:01 -06:00
Isaac
7fa9621de1 Merge branch 'dev' into worker 2025-02-07 14:52:30 -06:00
Isaac
d17fed9c85 Finish delete/update preservations 2025-02-07 14:45:18 -06:00
Isaac
81536e61f7 Update text & add third option 2025-02-06 21:32:53 -06:00
Isaac
c790781315 Start worker archival update/delete options 2025-02-06 21:21:18 -06:00
Isaac
e7a067b358 Verify user is admin 2025-02-06 18:06:01 -06:00
Isaac
4156126a71 add archival delete/update route 2025-02-06 18:04:52 -06:00
Isaac
95f456bbb6 Add tag archival settings to the worker 2025-02-06 17:34:49 -06:00
Isaac
102cd1a6cf Fix endpoint & useMutation callback 2025-02-06 16:49:26 -06:00
Isaac
395dc5c0cb Track changes to prevent useless requests 2025-02-06 16:20:19 -06:00
Isaac
7f0c8f4bbf finish endpoint 2025-02-05 18:48:41 -06:00
Isaac
671f27ccde fix deleting archival tags 2025-02-05 17:46:36 -06:00
Isaac
c90b53376d Archival tags post route 2025-02-05 16:47:16 -06:00
daniel31x13
13ed7b6cdc bug fixed 2025-02-05 06:49:38 -05:00
Daniel
3c71301cbc Merge pull request #1021 from stuzer05/dev
Add collection select sorting, fix inconsistent sidebar reorder
2025-02-05 15:15:40 +03:30
daniel31x13
833a871731 remove extra logging 2025-02-05 05:56:54 -05:00
daniel31x13
7b3a4e48c1 remove note modal to focus on advanced bookmarking functionality 2025-02-05 05:50:18 -05:00
Isaac
76112534f6 remove duplicate functions 2025-02-04 17:06:43 -06:00
Isaac
adafe36cd7 Merge branch 'worker' of https://github.com/il516/linkwarden into worker 2025-02-04 16:58:00 -06:00
Isaac
0123791b8a use a hook to manage state for archival tags input 2025-02-04 16:51:56 -06:00
Isaac
81f150c0ce Merge branch 'linkwarden:main' into worker 2025-02-04 01:50:12 -06:00
Isaac
9177ad6a72 complete toggling options 2025-02-03 21:53:16 -06:00
Isaac
d360f612e2 add ai tagging & fix select 2025-02-03 21:13:41 -06:00
Daniel
b0496e2e65 Merge pull request #942 from AverageHelper/avg/decode-html-entities
[Fix] Work around parser bug that mangles attribute values
2025-02-03 19:35:28 +03:30
daniel31x13
c5751386fa undo changes to yarn.lock 2025-02-03 11:05:10 -05:00
Daniel
406647d687 Merge pull request #1003 from Kur0den/dev
Fix mistranslation and add new translation in Japanese
2025-02-03 18:11:46 +03:30
Daniel
5949a0965c Merge pull request #1017 from YeeJiaWei/fix/double-overflow
fixed height causing double overflow
2025-02-03 18:01:24 +03:30
daniel31x13
c015bed8a7 small improvement 2025-02-03 09:30:52 -05:00
daniel31x13
504af53f18 bug fix 2025-02-03 08:26:25 -05:00
daniel31x13
d822db440b improved UX 2025-02-03 08:22:18 -05:00
daniel31x13
181e1009e5 fix build errors 2025-02-03 07:47:46 -05:00
Daniel
db16044949 Merge pull request #1028 from il516/more-ai-providers
feat(tags): Ability to use OpenAI/Anthropic & auto tag existing links
2025-02-03 16:09:03 +03:30
daniel31x13
1626a277e0 better UX 2025-02-03 07:38:16 -05:00
daniel31x13
616efffed2 improvements 2025-02-03 06:57:22 -05:00
daniel31x13
c9dd143d59 remove extra logging 2025-02-03 04:14:15 -05:00
Isaac
0a4d62491d Start tag archival options 2025-02-02 15:59:37 -06:00
daniel31x13
9e417b7f35 bug fixed 2025-02-02 11:30:29 -05:00
daniel31x13
81e9b27683 small change 2025-02-02 03:09:20 -05:00
Isaac
942ae4af99 format 2025-02-01 18:03:26 -06:00
Isaac
f7e9119450 Remove comment 2025-02-01 18:03:10 -06:00
Isaac
d71216a908 Add user option to archive as readable 2025-02-01 18:02:12 -06:00
Isaac
f61ce5563d Max tag name length 2025-02-01 17:10:31 -06:00
Isaac
575d91832e format 2025-02-01 17:07:56 -06:00
Isaac
15fe4575f9 Use existing tags for ai tagging 2025-02-01 17:04:54 -06:00
daniel31x13
9ba9b06ae3 remove comments 2025-02-01 06:27:14 -05:00
daniel31x13
cf16344aef add note modal 2025-02-01 06:25:39 -05:00
Isaac
29ed07c74a format 2025-01-29 17:25:52 -06:00
Isaac
493e0e2f6b Merge branch 'more-ai-providers' of https://github.com/il516/linkwarden into more-ai-providers 2025-01-29 17:04:52 -06:00
Isaac
d76d99844c remove console log 2025-01-29 17:04:28 -06:00
Isaac
533f29706e Merge branch 'linkwarden:main' into more-ai-providers 2025-01-29 15:28:14 -06:00
Isaac
88cf45c7c2 format 2025-01-29 14:12:48 -06:00
Isaac
b100129d80 use env interval 2025-01-29 14:12:10 -06:00
Isaac
a267d4ed3a format 2025-01-29 14:09:15 -06:00
Isaac
9d8d5f0fa0 auto tag existing links & use meta description 2025-01-29 14:08:34 -06:00
daniel31x13
aa6b068d92 remove unused imports 2025-01-29 04:37:08 -05:00
daniel31x13
4b230e01d3 fix typo 2025-01-29 03:01:13 -05:00
daniel31x13
d140e2109f wip 2025-01-29 02:44:13 -05:00
Isaac
d5703ba70e Fix ollama 2025-01-28 20:01:56 -06:00
Isaac
5f12046a49 Provide list of models for openai & anthropic 2025-01-28 19:26:52 -06:00
Isaac
edad55d608 use provided ollama URL 2025-01-28 19:22:00 -06:00
Isaac
fac46de09c Add OpenAI & Anthropic 2025-01-28 19:19:16 -06:00
stuzer05
007de56cd3 Commit 2025-01-27 10:45:33 +02:00
stuzer05
8efdf6d87b Commit 2025-01-27 10:34:23 +02:00
daniel31x13
69225e0642 minor improvement 2025-01-27 02:40:13 -05:00
daniel31x13
0aa23e27b3 minor fix 2025-01-27 02:16:23 -05:00
daniel31x13
3bf2daddd1 improvements 2025-01-27 02:08:12 -05:00
stuzer05
71644e6e4e Commit 2025-01-27 08:55:51 +02:00
daniel31x13
6e7f92c046 improvements 2025-01-27 00:59:57 -05:00
daniel31x13
8d4504262b small fix 2025-01-27 00:34:36 -05:00
daniel31x13
20224c835a small improvement 2025-01-27 00:25:19 -05:00
daniel31x13
c3873b030f full width expanded mode 2025-01-27 00:20:17 -05:00
daniel31x13
cf8a202afa small fix 2025-01-27 00:05:34 -05:00
daniel31x13
c79b1e6492 cleaner code 2025-01-27 00:04:33 -05:00
daniel31x13
e21e3ecaae minor change 2025-01-26 14:12:39 -05:00
daniel31x13
b84840e12c wip 2025-01-25 11:35:01 -05:00
daniel31x13
f8a130ae6e add component 2025-01-25 10:11:34 -05:00
daniel31x13
852de0d587 minor fix 2025-01-24 18:00:50 -05:00
daniel31x13
eecfb112e3 small change 2025-01-24 17:45:01 -05:00
daniel31x13
81a35655e9 add portal wrapper component 2025-01-24 17:28:29 -05:00
Yee Jia Wei
c45b44cdbc fixed height causing double overflow 2025-01-25 02:56:35 +08:00
daniel31x13
ecc48f8fe2 wip 2025-01-24 06:10:44 -05:00
daniel31x13
e1c4f85e53 small fix 2025-01-22 04:01:22 -05:00
daniel31x13
f8c96b493c wip 2025-01-22 03:49:16 -05:00
daniel31x13
63904f6d41 small fix 2025-01-19 12:37:32 -05:00
Daniel
9083d9a01b Merge pull request #1008 from linkwarden:patch
add issue template
2025-01-19 10:53:51 -05:00
Daniel
806cba8110 Merge pull request #1007 from linkwarden/patch
add issue template
2025-01-19 10:51:50 -05:00
daniel31x13
ae24358a77 add issue template 2025-01-19 10:50:44 -05:00
daniel31x13
f0dfd5568e small fix 2025-01-18 16:19:20 -05:00
daniel31x13
9d17600124 bug fix 2025-01-18 15:58:58 -05:00
daniel31x13
6a72d7894b bug fixed 2025-01-18 00:56:31 -05:00
daniel31x13
00c33d48f0 wip 2025-01-18 00:36:55 -05:00
daniel31x13
6573c683f6 support for markdown for readable content 2025-01-15 22:11:26 -05:00
Kur0den0010
5412545c6f Change translate in Japanese
Change start_journey
2025-01-16 10:54:18 +09:00
Kur0den0010
eee06e2be9 Add new translation in Japanese
Add invalid_url_guide to search_query_invalid_symbol
2025-01-16 10:52:01 +09:00
Kur0den0010
c3e8097aac Add missing translation keys in Japanese
Add invalid_url_guide to search_query_invalid_symbol
2025-01-16 10:45:16 +09:00
Kur0den0010
2d97feef17 Add missing translation in Japanese
Add from_omnivore
2025-01-16 10:43:42 +09:00
Kur0den0010
74c0a40622 Fix mistranslation in Japanese
Change created
2025-01-16 10:42:06 +09:00
daniel31x13
56741b123b minor fix 2025-01-15 19:02:06 -05:00
daniel31x13
e8c6cc45f4 minor fix 2025-01-15 18:33:22 -05:00
daniel31x13
d0c999655c improved preservation view 2025-01-15 18:32:29 -05:00
daniel31x13
05594e6507 redesigned preserved view 2025-01-15 12:10:17 -05:00
daniel31x13
b59663ea91 WIP 2025-01-15 05:56:11 -05:00
daniel31x13
8d2029a19d wip 2025-01-15 05:04:21 -05:00
daniel31x13
cee2f0a759 WIP 2025-01-15 02:57:27 -05:00
daniel31x13
032f96191e WIP 2025-01-15 02:33:39 -05:00
Daniel
e87bfc83bf Merge pull request #996 from linkwarden/dev
v2.9.3
2025-01-13 11:17:32 -05:00
daniel31x13
aa0c7d64f4 bug fixes 2025-01-13 11:12:41 -05:00
Daniel
b8a1839fb6 Merge pull request #972 from siberianspot/main
Localization and small fixes
2025-01-12 18:46:32 -05:00
Daniel
629574c6b2 Merge branch 'dev' into main 2025-01-12 18:45:51 -05:00
daniel31x13
1bb7d3cc5c fixes #981 2025-01-11 09:47:49 -05:00
daniel31x13
6b811c3e7d undo 2025-01-11 09:44:27 -05:00
daniel31x13
a941eec569 bug fix 2025-01-11 08:47:54 -05:00
Daniel
5ed79f0f5b Merge pull request #990 from linkwarden/dev
update README
2025-01-10 15:09:26 -05:00
daniel31x13
010ca8eeae update README 2025-01-10 14:59:07 -05:00
Denis Bryukhanov
5840ffc620 Merge pull request #1 from linkwarden/main
Merge with latest
2025-01-08 01:53:44 +07:00
siberian
14754a23f1 Adding missing localizations, Fix Russian localization, Correcting a duplicate value in the settings 2025-01-08 01:50:21 +07:00
Daniel
1a501b5365 Merge pull request #967 from linkwarden/dev
Dev
2025-01-07 08:28:11 -05:00
daniel31x13
3bc9bbf074 bump version 2025-01-07 08:26:37 -05:00
daniel31x13
09a52dd260 bug fixed 2025-01-07 08:26:04 -05:00
Daniel
84e99b55c9 Merge pull request #959 from linkwarden/dev
revert variable name
2025-01-06 13:32:38 -05:00
daniel31x13
22c4fbf613 revert variable name 2025-01-06 13:32:02 -05:00
Daniel
0e1b51177b Merge pull request #958 from linkwarden/dev
v2.9.1
2025-01-06 13:28:45 -05:00
daniel31x13
44499c1277 bump version 2025-01-06 13:28:25 -05:00
daniel31x13
9d986356a7 switch to react-query for fetching the config 2025-01-06 12:56:17 -05:00
daniel31x13
1d854e16aa bug fix 2025-01-06 12:39:16 -05:00
daniel31x13
02c02fc3b9 use SSR for public ENV 2025-01-06 11:32:44 -05:00
Daniel
99bdc7d55e Merge pull request #954 from linkwarden/dev
bug fixed
2025-01-06 05:44:35 -05:00
daniel31x13
62c7bbbb74 bug fixed 2025-01-06 05:43:22 -05:00
Daniel
dfb31ab1b3 Merge pull request #948 from linkwarden/dev
Linkwarden v2.9.0
2025-01-06 05:09:24 -05:00
daniel31x13
e0c0b76eb0 update README 2025-01-05 19:25:00 -05:00
daniel31x13
9bc261bc85 minor change 2025-01-02 23:16:03 -05:00
daniel31x13
b2d2e23539 fix: better green 2025-01-02 16:37:07 -05:00
daniel31x13
04c69bb05f feat: add option to open link details 2025-01-02 16:33:58 -05:00
daniel31x13
0cc1fd8407 WIP 2025-01-02 16:26:38 -05:00
daniel31x13
848e0bf50e feat: quick look at the preserved formats 2025-01-02 15:42:47 -05:00
daniel31x13
c3981c7fff feat: support for multiple themes 2025-01-02 13:48:35 -05:00
daniel31x13
ec7d6f4a6b minor improvement 2024-12-31 18:43:11 -05:00
daniel31x13
9d8b602839 feat: choose what to show in dashboard 2024-12-31 18:42:34 -05:00
daniel31x13
f0f57fb1a9 bug fix 2024-12-31 17:01:27 -05:00
daniel31x13
88820361e9 update README 2024-12-31 08:36:06 -05:00
daniel31x13
be47c78e4d small improvement to the public collection page 2024-12-30 06:05:15 -05:00
daniel31x13
fa059d1b00 bug fixed 2024-12-30 04:15:43 -05:00
daniel31x13
bcfec38adf bug fixed 2024-12-30 04:07:48 -05:00
AverageHelper
0344467cb7 feat: Use the same decoder that JSDom uses to encode 2024-12-29 01:37:22 -07:00
daniel31x13
454ed7b7eb more efficient docker-compose file 2024-12-29 02:04:28 -05:00
Daniel
51da37a22f Merge pull request #893 from zodac/dev
Adding healthcheck to docker image
2024-12-29 01:43:00 -05:00
Daniel
6edbc4f438 Merge pull request #902 from keizie/fix/import-pin
fix(import): save pinnedLinks from Linkwarden export json
2024-12-29 01:17:00 -05:00
AverageHelper
899ddafd90 fix(import-html): Work around parser bug that mangles attribute values 2024-12-28 23:11:50 -07:00
Daniel
755721f1c2 Merge pull request #920 from Zalaxx/dev
fix: HTML backup with Monolith when using Docker
2024-12-29 01:04:46 -05:00
Daniel
0b20f61913 Merge pull request #928 from il516/rss-feeds
feat(rss): Add RSS feeds for collections
2024-12-25 08:08:00 -05:00
daniel31x13
e9cf93d769 minor improvement 2024-12-25 08:07:15 -05:00
Daniel
f94d10a3d3 Merge pull request #934 from mrkhachaturov/main
russian language support
2024-12-24 09:31:34 -05:00
Daniel
6a95f6efdc Merge branch 'dev' into main 2024-12-24 09:30:19 -05:00
Daniel
150eeb9f11 Merge pull request #875 from dereulenspiegel/omnivore-import
Omnivore import
2024-12-24 09:27:48 -05:00
daniel31x13
fe77625289 finalized the implementation 2024-12-24 09:22:53 -05:00
zodac
63e7377df4 Installing curl 2024-12-24 21:48:16 +13:00
Ruben Khachaturov
458eae9a3c russian language support 2024-12-23 08:42:48 +03:00
daniel31x13
7ef2afae7f small change 2024-12-22 14:07:10 -05:00
Isaac Wise
a1d02f110d Fix RSS Subscription form & move endpoint 2024-12-19 17:16:07 -06:00
Isaac Wise
378fec06bb Format & Lint 2024-12-19 16:06:24 -06:00
Isaac Wise
e04997c8c4 Add RSS Feed button 2024-12-19 16:05:34 -06:00
Isaac Wise
aecb90b4a4 use correct protocol 2024-12-19 01:02:56 -06:00
Isaac Wise
dac6ec966c rss feeds 2024-12-19 00:44:53 -06:00
daniel31x13
582159f454 resolved conflicts 2024-12-14 10:28:46 -05:00
dereulenspiegel
cf02b7a099 Rebased to dev and ran formatting 2024-12-13 18:18:32 +01:00
dereulenspiegel
7b4d324852 Previous import mechanism is restored to previous behavior, while omnivore uses new binary import path 2024-12-13 18:17:57 +01:00
dereulenspiegel
8932b9929a Moving omnivore import to specific binary upload route 2024-12-13 18:17:56 +01:00
dereulenspiegel
6b416f23f0 Now limiting the read size for imports in a configuration compatible way to the previous implementation 2024-12-13 18:17:55 +01:00
dereulenspiegel
fb25cf5c75 Adopted other import functions to handle streams instead of text 2024-12-13 18:17:54 +01:00
dereulenspiegel
c8f33f4800 Returning 200 success to avoid stalled responses 2024-12-13 18:17:53 +01:00
dereulenspiegel
95f818959b Made the import links dropdown menu reusable to avoid code duplication 2024-12-13 18:17:52 +01:00
dereulenspiegel
a0aabde322 Fixed the unnecessary creation of multiple import collections 2024-12-13 18:17:51 +01:00
dereulenspiegel
0e3ca5b51f Made importBookmarks reusable 2024-12-13 18:17:46 +01:00
dereulenspiegel
a733cc69a3 Import should now work on testdata 2024-12-13 18:17:03 +01:00
dereulenspiegel
cbc88ebcb2 Revert "Added adm-zip dependency to be able to handle zip files for importing omnivore exports"
This reverts commit 47367c44c1.
2024-12-13 18:17:02 +01:00
dereulenspiegel
c3b78a8f82 Added adm-zip dependency to be able to handle zip files for importing omnivore exports 2024-12-13 18:17:00 +01:00
dereulenspiegel
8ad9ab7755 Added basic infrastructure to be able to have omnivore imports 2024-12-13 18:16:58 +01:00
daniel31x13
4bf220c786 minimize the usage of external dependencies 2024-12-11 09:36:42 -05:00
Daniel
ed8f2d3777 Merge pull request #894 from KittyKatt/dev
Sub-collections included in collection page and total link count
2024-12-10 07:15:35 -05:00
daniel31x13
5b87799fdd improvements 2024-12-10 07:14:17 -05:00
Daniel
97abe5de0c Merge branch 'dev' into omnivore-import 2024-12-10 06:25:01 -05:00
daniel31x13
731b259329 update version number 2024-12-09 23:48:41 -05:00
daniel31x13
63cef8e6b0 minor fix 2024-12-09 22:38:51 -05:00
Daniel
18db677c29 Merge pull request #921 from linkwarden/ai-tagging
Ai tagging
2024-12-09 22:36:20 -05:00
Daniel
6071aa617f Merge branch 'dev' into ai-tagging 2024-12-09 22:33:03 -05:00
daniel31x13
f270adbffa fully implemented ai tagging 2024-12-09 22:31:39 -05:00
daniel31x13
6259048431 remove pending format logic 2024-12-09 16:17:39 -05:00
daniel31x13
40f4a5acd9 cleaner code + add "aiTagged" field 2024-12-09 14:10:20 -05:00
Zalax
4240d37d77 Merge branch 'linkwarden:dev' into dev 2024-12-09 19:07:11 +00:00
Zalax
0abe065c0c fix: HTML backup with Monolith when using Docker
ca-certificates is needed to not have certificates error when monolith is retrieving a website's resources.

It does not happend with other backup format because the retrieving is done with a headless chrome and thus has its own certificate store
2024-12-09 20:06:06 +01:00
Daniel
346f41a12c Merge pull request #911 from AmadeusGraves/dev
Update Spanish Lang
2024-12-08 07:42:09 -05:00
Daniel
2ffbede170 Merge pull request #910 from il516/rss-feed-subscriptions
feat(rss): Add RSS Subscriptions
2024-12-08 07:41:14 -05:00
daniel31x13
c148c2b953 improvements 2024-12-08 07:37:27 -05:00
daniel31x13
a872f218fb added a base prompt for the tag generation... 2024-12-05 14:04:02 -05:00
Isaac Wise
ff1f87cb35 uncomment collection table cell 2024-12-05 02:49:37 -06:00
AmadeusGraves
94b143c91a Update common.json
Upload translation to spanish.
2024-12-05 09:48:07 +01:00
Isaac Wise
52a11040f6 Fix capitalization 2024-12-05 02:22:38 -06:00
Isaac Wise
e9c43d75fe remove console log 2024-12-05 02:04:21 -06:00
Isaac Wise
47b226cf1f format 2024-12-05 02:01:47 -06:00
Isaac Wise
266f834018 RSS form 2024-12-05 01:53:53 -06:00
Isaac Wise
c9885c0b73 format 2024-12-04 16:56:26 -06:00
Isaac
ec885a7db2 Merge branch 'linkwarden:main' into rss-feed-subscriptions 2024-12-04 16:52:52 -06:00
Isaac Wise
5665fbb412 Include collection name in table 2024-12-04 16:51:41 -06:00
Isaac Wise
9e933bd630 Update yarn lock 2024-12-04 01:55:29 -06:00
Isaac Wise
3572e101fb Table & Delete modal 2024-12-04 01:53:25 -06:00
Isaac Wise
fb06549330 Delete RSS Subscription 2024-12-04 01:18:11 -06:00
Isaac Wise
991f12566f Start RSS Subscriptions 2024-12-04 01:12:05 -06:00
dereulenspiegel
160845319f Now limiting the read size for imports in a configuration compatible way to the previous implementation 2024-12-01 15:27:16 +01:00
Daniel
bff5a7ae9a Merge pull request #903 from keizie/fix/import-url-slice
fix(import): keep url not sliced
2024-12-01 06:26:56 -05:00
Daniel
6e01c135dc increase the url limits 2024-12-01 06:25:13 -05:00
Daniel
f32e5a8d05 Merge pull request #897 from 7Adrian/7Adrian-pl-language
Added Polish "polski" language.
2024-12-01 06:02:55 -05:00
Daniel
e9003e5c45 added locale to configs 2024-12-01 05:56:38 -05:00
keizie
9065756686 fix(import): save pinnedLinks from Linkwarden export json 2024-12-01 15:25:30 +09:00
keizie
881df93c02 fix(import): keep url not sliced 2024-12-01 13:01:43 +09:00
Daniel
ed7fab0473 Merge pull request #899 from linkwarden/dev
minor fix
2024-11-30 16:13:46 -05:00
daniel31x13
38d054e143 minor fix 2024-11-30 16:12:10 -05:00
Daniel
5e89658a11 Merge pull request #898 from linkwarden/dev
Dev
2024-11-30 16:10:47 -05:00
daniel31x13
d964e02ba1 update readme 2024-11-30 16:09:31 -05:00
daniel31x13
a36eb23096 update version number 2024-11-30 15:55:36 -05:00
7Adrian
8f875d15b0 Added Polish "polski" language.
Add Polish language to public/locales/pl/common.json.
2024-11-30 17:38:48 +01:00
Daniel
9f660ff70f Merge pull request #885 from Go-rom/2.8.3-french-translation
2.8.3 french translation
2024-11-29 23:32:52 -05:00
Daniel
e6f43bbbfa Merge pull request #896 from keizie/fix-monolith-error
fix(monolith): quote url
2024-11-29 23:31:10 -05:00
keizie
1609868149 fix(monolith): quote url
when url include ampersand shell fails
```
/bin/sh: 1: amp: not found
/bin/sh: 1: -j: not found
Uncaught Monolith error...
```
2024-11-30 11:07:56 +09:00
daniel31x13
9075618e00 added ai tagging to the settings 2024-11-29 12:57:42 -05:00
Katie Bohnenkamper
179cd18ac5 Sub-collections shown on collection page 2024-11-29 00:25:50 -06:00
Katie Bohnenkamper
5a5fa9ed6c Sub-collections included in link count on tree 2024-11-29 00:24:59 -06:00
zodac
5279d94b8c Adding healthcheck to docker image 2024-11-29 13:43:37 +13:00
Gorom
5c3848e833 Update french translation 2024-11-20 17:15:59 +01:00
Gorom
27d7bbabb3 Update french translation 2024-11-20 16:56:41 +01:00
dereulenspiegel
8ff1346bf1 Adopted other import functions to handle streams instead of text 2024-11-19 12:51:21 +01:00
dereulenspiegel
71119d511e Returning 200 success to avoid stalled responses 2024-11-19 12:48:13 +01:00
dereulenspiegel
b7eb8f2c2f Made the import links dropdown menu reusable to avoid code duplication 2024-11-19 12:47:03 +01:00
dereulenspiegel
3d54cc05a4 Fixed the unnecessary creation of multiple import collections 2024-11-18 18:02:02 +01:00
dereulenspiegel
8973bdd94e Made importBookmarks reusable 2024-11-18 17:54:36 +01:00
dereulenspiegel
1af37f3619 Import should now work on testdata 2024-11-18 17:39:06 +01:00
daniel31x13
5303d63e4b add option to disable preservation 2024-11-17 16:06:05 -05:00
Daniel
05a30e1ec6 Merge pull request #867 from clemenstyp/fixed-placeholder
fixed placeholder in german translation (delete collection)
2024-11-16 09:13:21 -05:00
daniel31x13
b1a55785b5 import dates as well 2024-11-16 08:58:03 -05:00
Clemens Eyhoff
24b47e9d4b fixed an other uppercase placeholder 2024-11-16 14:49:07 +01:00
Clemens Eyhoff
34d19f9dbe fixed placeholder (was upper case) 2024-11-16 12:46:44 +01:00
dereulenspiegel
3a70e138b5 Revert "Added adm-zip dependency to be able to handle zip files for importing omnivore exports"
This reverts commit 47367c44c1.
2024-11-15 12:50:04 +01:00
dereulenspiegel
47367c44c1 Added adm-zip dependency to be able to handle zip files for importing omnivore exports 2024-11-15 12:43:17 +01:00
dereulenspiegel
e1a31481ad Added basic infrastructure to be able to have omnivore imports 2024-11-15 12:39:13 +01:00
Daniel
95dddd7da0 Merge pull request #859 from linkwarden/dev
Dev
2024-11-14 15:45:17 -05:00
daniel31x13
1a949ecdc6 bug fix 2024-11-14 15:44:31 -05:00
daniel31x13
2e6f1c207c bug fixed 2024-11-14 15:43:37 -05:00
Daniel
6aa0fa9465 Merge pull request #857 from linkwarden/dev
minor UI improvement
2024-11-14 11:01:41 -05:00
daniel31x13
8677df0340 minor UI improvement 2024-11-14 11:01:02 -05:00
Daniel
125f6ac619 Merge pull request #856 from linkwarden/dev
update version
2024-11-14 08:51:33 -05:00
daniel31x13
89ecf5c529 update version 2024-11-14 08:50:52 -05:00
Daniel
fa78d6057f Merge pull request #855 from linkwarden/dev
bug fix
2024-11-14 08:50:10 -05:00
daniel31x13
cfc28be898 bug fix 2024-11-14 08:48:18 -05:00
Daniel
c8efd4f9db Merge pull request #852 from linkwarden/dev
created check-branch.yml
2024-11-14 02:43:50 -05:00
daniel31x13
ada4e53b46 created check-branch.yml 2024-11-14 02:42:01 -05:00
Daniel
91494b0188 Merge pull request #849 from linkwarden/dev
increase staticPageGenerationTimeout
2024-11-13 22:20:17 -05:00
daniel31x13
e9fd6ec4d5 increase staticPageGenerationTimeout 2024-11-13 22:19:18 -05:00
Daniel
f08f4058dc Merge pull request #846 from linkwarden/dev
update Dockerfile
2024-11-13 09:23:59 -05:00
daniel31x13
d60200205a update Dockerfile 2024-11-13 09:23:22 -05:00
Daniel
de38eb2963 Merge pull request #845 from linkwarden/dev
revert dockerfile to working state
2024-11-13 06:14:46 -05:00
daniel31x13
f22dd4535d revert dockerfile to working state 2024-11-13 06:12:39 -05:00
Daniel
043589b301 Merge pull request #841 from linkwarden/dev
update version number
2024-11-13 00:01:50 -05:00
daniel31x13
4556827d79 update version number 2024-11-13 00:01:12 -05:00
Daniel
98ebd6d7bc Merge pull request #840 from linkwarden/dev
Dev
2024-11-12 23:59:47 -05:00
daniel31x13
0a3ca4a1d4 Merge branch 'dev' of https://github.com/linkwarden/linkwarden into dev 2024-11-12 23:58:53 -05:00
daniel31x13
106410f55a revert change 2024-11-12 23:58:50 -05:00
Daniel
1ffe1b68a9 Merge pull request #839 from linkwarden/dev
Dev
2024-11-12 23:15:52 -05:00
Daniel
91ab0e609b Merge pull request #833 from click0/Ukrainian-translation
Corrected Ukrainian translation for November 12, 2024
2024-11-12 23:13:38 -05:00
daniel31x13
cbb7a666cd bug fix 2024-11-12 23:12:20 -05:00
Daniel
e8cf14334f Merge pull request #838 from linkwarden/dev
added status badges
2024-11-12 22:50:33 -05:00
daniel31x13
019790791b added status badges 2024-11-12 22:49:38 -05:00
Daniel
e41ba2668f Merge pull request #837 from linkwarden/dev
bug fix
2024-11-12 22:18:25 -05:00
daniel31x13
66a09fdc4b bug fix 2024-11-12 22:16:42 -05:00
Daniel
e50143ca7e Merge pull request #835 from linkwarden/dev
minor change
2024-11-12 18:22:28 -05:00
daniel31x13
162b120e55 minor change 2024-11-12 18:21:58 -05:00
Daniel
b4dd47aa37 Merge pull request #834 from linkwarden/dev
updated README
2024-11-12 17:40:32 -05:00
daniel31x13
256c232a85 updated README 2024-11-12 17:39:48 -05:00
vlad11
b7ddf22662 Corrected Ukrainian translation for November 12, 2024
Signed-off-by: vlad11 <admin@support.od.ua>
2024-11-13 00:12:32 +02:00
Daniel
5f60e9833e Merge pull request #831 from linkwarden/dev
bug fix
2024-11-12 16:18:15 -05:00
daniel31x13
ceed23ff51 bug fix 2024-11-12 16:17:38 -05:00
daniel31x13
a4c83dc82f small fix 2024-11-12 08:36:40 -05:00
daniel31x13
46f81ebf25 add info to inviteModal 2024-11-10 16:42:04 -05:00
daniel31x13
0ac5009a4a minor change 2024-11-10 00:27:13 -05:00
daniel31x13
6842da4283 new feature: open all links 2024-11-09 23:59:12 -05:00
daniel31x13
78ecf3ddb5 bug fix 2024-11-09 23:33:13 -05:00
daniel31x13
e39645e135 bug fix 2024-11-09 23:11:03 -05:00
daniel31x13
836360f99d bug fixed 2024-11-09 23:07:01 -05:00
daniel31x13
9c9fd969bc minor fix 2024-11-09 15:27:15 -05:00
daniel31x13
213105942b minor change 2024-11-09 15:02:59 -05:00
daniel31x13
0b7acb35b7 minor change 2024-11-09 14:14:13 -05:00
daniel31x13
9b58ea5c98 minor change 2024-11-09 13:45:11 -05:00
daniel31x13
c85c3bb0d7 minor fix 2024-11-08 18:03:00 -05:00
daniel31x13
7ca574b76f bug fixes 2024-11-08 17:57:50 -05:00
daniel31x13
8593df4673 bug fixed 2024-11-08 17:21:20 -05:00
daniel31x13
ddc2079f4b minor fix 2024-11-08 12:25:31 -05:00
daniel31x13
0de5caffa1 minor fix 2024-11-08 05:24:18 -05:00
daniel31x13
b14e77bdf9 minor fix 2024-11-08 04:48:31 -05:00
daniel31x13
8d366ae7d8 minor fix 2024-11-07 16:54:51 -05:00
daniel31x13
a18938ba2a minor fix 2024-11-07 16:46:26 -05:00
daniel31x13
6eac8423f8 added survey 2024-11-07 11:09:36 -05:00
daniel31x13
cbf93dcf06 minor improvement 2024-11-07 07:32:06 -05:00
daniel31x13
2993347dc7 sleeker dashboard items 2024-11-07 02:09:56 -05:00
daniel31x13
cc45c8fc3e minor improvement 2024-11-07 01:17:30 -05:00
daniel31x13
d5602a09cd minor fix 2024-11-07 01:14:23 -05:00
daniel31x13
736e98ac7d improvements 2024-11-07 01:12:05 -05:00
daniel31x13
7eaff332a9 bug fixed 2024-11-07 00:20:57 -05:00
daniel31x13
7931e2d7b6 better logic when showing link icons 2024-11-07 00:19:12 -05:00
daniel31x13
ac3888f9b3 icon picker is now much more efficient 2024-11-06 23:57:20 -05:00
daniel31x13
ac8add8c5d small improvement 2024-11-06 22:53:21 -05:00
daniel31x13
a6a0f6965b bug fixed 2024-11-06 03:36:02 -05:00
Daniel
b2c5c3c6dd Merge pull request #792 from jvanbruegge/prisma-update
Update prisma to v5
2024-11-03 14:20:24 -05:00
Daniel
4555874725 Merge branch 'dev' into prisma-update 2024-11-03 14:19:28 -05:00
daniel31x13
0f5b70eda7 update prisma 2024-11-03 03:59:39 -05:00
daniel31x13
d1c3748681 minor improvement 2024-11-03 03:34:21 -05:00
Daniel
2524139113 Merge pull request #816 from linkwarden/main
Merge main to dev
2024-11-03 03:19:40 -05:00
Daniel
6c2b86fc4b Merge branch 'dev' into main 2024-11-03 03:19:29 -05:00
Daniel
d0e0526655 Merge pull request #815 from Green-Kite/dev
update german translation
2024-11-03 03:10:40 -05:00
Green-Kite
43e94ebd0b update german translation
updated german translation
2024-11-03 07:24:38 +01:00
Daniel
aeafe6e15d Merge pull request #789 from jvanbruegge/playwright-path
Allow to specify a custom playwright browser path
2024-11-02 21:59:12 -04:00
daniel31x13
5ec221d87d update .env.sample 2024-11-02 21:58:44 -04:00
Daniel
d6d6442bc4 Merge pull request #809 from Green-Kite/dev
update german translation
2024-11-02 20:57:31 -04:00
Daniel
d12d12518e Merge pull request #636 from bjoerndot/tags-in-public-collection
Tags in public collection
2024-11-02 20:55:16 -04:00
daniel31x13
02ced62832 final change 2024-11-02 20:45:31 -04:00
daniel31x13
4febe1ace5 minor changes 2024-11-02 20:43:53 -04:00
daniel31x13
2e1e94112f make tags visible on public collections 2024-11-02 18:16:38 -04:00
daniel31x13
d86bbcd940 minor fix 2024-11-02 18:07:16 -04:00
daniel31x13
eed80ca812 add migration 2024-11-02 18:01:36 -04:00
Daniel
394251c1f1 Merge branch 'dev' into tags-in-public-collection 2024-11-02 17:56:43 -04:00
Daniel
68cdde91ad Merge pull request #813 from linkwarden/feat/team-support
Feat/seats support
2024-11-02 17:52:17 -04:00
Green-Kite
1ef286a38c update german translation
German translation updated
2024-11-01 10:08:14 +01:00
daniel31x13
508844dd9d bug fixes 2024-10-30 16:47:40 -04:00
daniel31x13
fa1f9873d5 minor change 2024-10-30 13:56:07 -04:00
Oliver Schwamb
891803547e retrieve all links for collection 2024-10-30 12:10:53 +01:00
Oliver Schwamb
24d45f8e8e Merge remote-tracking branch 'upstream/dev' into tags-in-public-collection 2024-10-30 12:10:30 +01:00
daniel31x13
f95350405c rename variable 2024-10-29 18:14:35 -04:00
daniel31x13
665019dc59 finalizing team support 2024-10-29 18:08:47 -04:00
daniel31x13
b09de5a8af updated verify max link logic 2024-10-26 13:44:52 -04:00
daniel31x13
cfd33e9bd1 bug fixed 2024-10-26 10:58:27 -04:00
daniel31x13
d3d2d5069e add member onboarding 2024-10-26 09:42:21 -04:00
daniel31x13
cffc74caa4 add team invitation functionality [WIP] 2024-10-21 13:59:05 -04:00
Jan van Brügge
3cd8eadee3 Update prisma to v5 2024-10-08 16:25:36 +01:00
daniel31x13
d146ec296c bug fixed 2024-10-07 23:43:44 -04:00
Jan van Brügge
fb4aa42eef Allow to specify a custom playwright browser path 2024-10-07 15:05:48 +01:00
daniel31x13
f68582e28c bug fixed 2024-10-07 00:57:36 -04:00
daniel31x13
d042c82cb0 add subscription webhook 2024-10-06 01:59:31 -04:00
Daniel
8738dd45e9 Merge pull request #771 from click0/main
Corrected Ukrainian translation.
2024-09-19 14:13:37 -04:00
Vladyslav V. Prodan
839de18d7a Merge branch 'linkwarden:main' into main 2024-09-19 00:46:06 +03:00
vlad11
2ba0851fee Corrected Ukrainian translation.
Signed-off-by: vlad11 <admin@support.od.ua>
2024-09-19 00:36:16 +03:00
daniel31x13
d99972a335 minor fix 2024-09-18 12:10:45 -04:00
daniel31x13
e071b9eb07 minor fix 2024-09-18 11:39:31 -04:00
daniel31x13
eb00d151b7 added locale to the config file 2024-09-18 11:06:31 -04:00
Daniel
22aaa52b3e Merge pull request #770 from bennyz327/dev
feat(lang): add traditional chinese translate
2024-09-18 11:04:03 -04:00
Benny Chou
4541277b28 feat(lang): add traditional chinese translate 2024-09-18 15:21:19 +08:00
Daniel
39faece9d7 Merge pull request #769 from linkwarden/main
Merge pull request #766 from linkwarden/daniel31x13-patch-1
2024-09-17 14:08:44 -04:00
daniel31x13
a21b0760de remove unused type 2024-09-17 14:06:03 -04:00
daniel31x13
04149fe86b Merge branch 'dev' of https://github.com/linkwarden/linkwarden into dev 2024-09-17 14:03:07 -04:00
daniel31x13
ff6e71d494 add schema validation for PUT requests 2024-09-17 14:03:05 -04:00
Daniel
5b02c1cfc9 Merge pull request #765 from ochtum/dev
Translated the added IDs.
2024-09-15 13:53:00 -04:00
Daniel
1ff13e8aa0 Merge pull request #767 from linkwarden/daniel31x13-patch-1
Update .env.sample
2024-09-15 13:52:47 -04:00
Daniel
eaf4524598 Merge pull request #766 from linkwarden/daniel31x13-patch-1
Update .env.sample
2024-09-15 13:52:17 -04:00
Daniel
a276065288 Update .env.sample 2024-09-15 13:51:09 -04:00
daniel31x13
1cf7421b76 added zod for post requests 2024-09-14 16:00:19 -04:00
武田 淳一
ed4a334024 Translated the added IDs. 2024-09-14 13:24:29 +09:00
Daniel
a5b1952e0d Merge pull request #710 from arran4/patch-1
Please 'EXPOSE' port 3000
2024-09-13 01:57:56 -04:00
Daniel
01826b1634 Merge branch 'dev' into patch-1 2024-09-13 01:57:39 -04:00
daniel31x13
3b17d4ddfe bug fixed 2024-09-13 00:37:58 -04:00
Daniel
f104fa095f Merge pull request #672 from jlssmt/logging
disabled query logging as default
2024-09-12 23:36:01 -04:00
Daniel
b08e6690f3 Merge pull request #689 from stumpylog/chore/update-actions
Chore: Updates actions to their latest versions
2024-09-12 23:16:27 -04:00
Daniel
33a654d21a Merge pull request #688 from stumpylog/feature/docker-file-reduce
fix: reduce Docker image size
2024-09-12 23:06:08 -04:00
Daniel
e1262142f8 Merge pull request #764 from click0/main
Corrected Ukrainian translation for September 12, 2024.
2024-09-12 19:04:50 -04:00
vlad11
0a43279665 Corrected Ukrainian translation for September 12, 2024.
Signed-off-by: vlad11 <admin@support.od.ua>
2024-09-13 01:29:34 +03:00
daniel31x13
5491ac74a5 add nl and tr translations 2024-09-12 17:06:36 -04:00
Daniel
bbcfca4cde Merge pull request #716 from kgnfth/main
feat(translations): Add Dutch and Turkish translations
2024-09-12 17:05:19 -04:00
daniel31x13
bf9a7d4fa0 add german translation 2024-09-12 17:01:38 -04:00
Daniel
edf4e489ec Merge pull request #711 from Green-Kite/main
Add German Translation
2024-09-12 17:00:49 -04:00
daniel31x13
20c5a20851 add spanish translation 2024-09-12 17:00:26 -04:00
Daniel
6f47a20e87 Merge pull request #717 from joser93/es-patch-1
Patch for Spanish translation.
2024-09-12 16:56:31 -04:00
Daniel
384937e210 Merge pull request #714 from phampyk/main
Added Spanish translation
2024-09-12 16:54:58 -04:00
Daniel
d22d989c91 Merge pull request #724 from ochtum/main
Created Japanese Translate
2024-09-12 16:53:24 -04:00
Daniel
4e0294322f Merge branch 'dev' into main 2024-09-12 16:53:12 -04:00
daniel31x13
75d5061bdf minor fix 2024-09-12 16:52:26 -04:00
Daniel
0150a9a6e3 Merge pull request #762 from rdeavila/dev
Update pt-BR translation
2024-09-12 16:49:38 -04:00
Daniel
87b79ffbac Merge pull request #726 from CoffeeAnon/feat/set-max-workers
Add Configurable Playwright Concurrency via Environment Variable
2024-09-12 16:43:32 -04:00
Rodrigo de Avila
5a40677191 Update pt-BR translation 2024-09-12 17:42:17 -03:00
Daniel
95ce2f30a8 Merge pull request #734 from click0/main
Added Ukranian translation
2024-09-12 16:33:28 -04:00
Daniel
e6a0ecbab5 Merge branch 'dev' into main 2024-09-12 16:32:39 -04:00
daniel31x13
e4c9cf8a38 add locale to config 2024-09-12 16:30:20 -04:00
Daniel
eaca3d7453 Merge pull request #746 from rdeavila/main
Add Brazilian Portuguese (pt-BR) support
2024-09-12 16:18:06 -04:00
Rodrigo de Avila
fbe3642be4 Merge branch 'linkwarden:main' into main 2024-09-12 17:16:22 -03:00
daniel31x13
bc32abbb92 Merge branch 'main' into dev
merge main to dev
2024-09-12 16:10:35 -04:00
daniel31x13
38f731f313 minor change 2024-09-12 15:46:16 -04:00
daniel31x13
aaf3590542 members with edit permission can now refresh preservation as well + bug fix 2024-09-12 15:30:15 -04:00
daniel31x13
8bb6e32bfa urls are now editable 2024-09-12 15:03:14 -04:00
daniel31x13
7bd3872195 bug fixed + optimizations 2024-09-12 13:47:18 -04:00
daniel31x13
906779010e collection closing bug fixed 2024-09-12 12:46:38 -04:00
daniel31x13
b0f87e8659 bug fixed 2024-09-12 11:59:20 -04:00
daniel31x13
653b1bc396 bug fix 2024-09-11 02:29:50 -04:00
daniel31x13
9b1506a64e add pin to hover view + add number of pins to dashboard + bug fixes 2024-09-11 01:38:38 -04:00
daniel31x13
fb1869ca7a fix dashboard bug 2024-09-10 00:09:33 -04:00
daniel31x13
5e7835b4d5 minor improvement 2024-09-09 23:27:55 -04:00
daniel31x13
0a91c47f83 minor change 2024-09-09 23:07:22 -04:00
daniel31x13
dc9db05e75 fully implemented the custom slider for the number of columns to show 2024-09-09 23:05:57 -04:00
daniel31x13
e1149c2733 minor fix 2024-09-09 19:16:28 -04:00
daniel31x13
0591d7c134 remove unused import 2024-09-09 19:09:09 -04:00
daniel31x13
4602269dd8 add number of columns slider 2024-09-09 19:05:30 -04:00
daniel31x13
9ae6a22236 minor improvement 2024-09-09 12:18:45 -04:00
daniel31x13
442da02956 minor fix 2024-09-04 23:17:58 -04:00
daniel31x13
dfcc271343 bug fix 2024-09-04 23:02:19 -04:00
daniel31x13
43d50dfd1b minor change 2024-09-04 22:39:10 -04:00
daniel31x13
40bb3e6fae fix build error 2024-09-04 22:29:54 -04:00
Daniel
3e077fa247 Merge pull request #754 from linkwarden/feat/customizable-links
Feat/customizable links
2024-09-04 22:20:16 -04:00
daniel31x13
3de8872f26 upload preview functionality 2024-09-04 22:19:40 -04:00
daniel31x13
e9072bba51 minor improvement 2024-08-30 18:10:50 -04:00
daniel31x13
d20c915970 improved edit view 2024-08-30 17:29:15 -04:00
daniel31x13
1a378de267 minor improvement 2024-08-30 10:54:27 -04:00
daniel31x13
d594159c15 minor improvement 2024-08-30 10:47:29 -04:00
daniel31x13
aee10fa406 better edit view 2024-08-30 02:38:58 -04:00
daniel31x13
820d686c37 minor improvement 2024-08-29 18:26:15 -04:00
daniel31x13
4189062c4c bug fixed 2024-08-29 12:53:37 -04:00
Daniel
1461caf68a Merge pull request #748 from linkwarden/hotfix
bug fix
2024-08-29 12:49:48 -04:00
daniel31x13
e7c7fedf8b bug fix 2024-08-29 12:47:23 -04:00
daniel31x13
b7adbbc86f improvements 2024-08-28 20:48:35 -04:00
daniel31x13
975716937f minor improvement 2024-08-28 20:30:57 -04:00
daniel31x13
2d0e52f65b better looking detail modal 2024-08-28 20:22:11 -04:00
Rodrigo de Avila
e9afe0ef25 Add Brazilian Portuguese (pt-BR) support 2024-08-28 10:26:27 -03:00
José Roberto Sánchez
a38133d618 Improved translations based on comments from @jmiguelr 2024-08-27 11:32:15 -06:00
daniel31x13
6498ae794b custom preview initial commit 2024-08-26 21:04:52 -04:00
daniel31x13
0371695eb3 choose to show which detail in each views 2024-08-26 19:56:04 -04:00
daniel31x13
9ae9c7c81a refactored view dropdown 2024-08-26 18:47:10 -04:00
daniel31x13
642374c2e5 remove commented code 2024-08-26 16:22:59 -04:00
daniel31x13
f368c2aa81 less padding for list view 2024-08-26 16:11:02 -04:00
daniel31x13
fae9e95fa9 added custom icons for links 2024-08-24 15:50:29 -04:00
Daniel
03639adc22 Merge pull request #735 from IsaacWise06/issue-691
Add new collection drop down
2024-08-22 22:48:56 -04:00
Isaac Wise
9fe829771d Add new collection drop down 2024-08-22 17:09:14 -05:00
vlad11
ed7b268c2b Created Ukranian Translate.
Signed-off-by: vlad11 <admin@support.od.ua>
2024-08-22 03:07:25 +03:00
daniel31x13
bf1a6efd2e custom icons fully implemented for collections 2024-08-20 19:25:35 -04:00
daniel31x13
6df2e44213 added translation to icon picker component + other fixes and improvements 2024-08-20 18:11:20 -04:00
daniel31x13
ae2324ecd3 progressed icon picker component 2024-08-20 16:59:01 -04:00
daniel31x13
accbd4cbfa bug fixes 2024-08-19 23:53:43 -04:00
Daniel
5f4e0d4262 Merge pull request #731 from linkwarden/hotfix
bugs fixed
2024-08-19 23:37:30 -04:00
daniel31x13
c072fed99f bugs fixed 2024-08-19 23:36:28 -04:00
Daniel
b4a9f917b5 Merge pull request #728 from linkwarden/hotfix
hotfix
2024-08-19 19:30:26 -04:00
daniel31x13
078e5ba95f minor change 2024-08-19 19:30:01 -04:00
daniel31x13
495509c888 bug fix 2024-08-19 19:25:13 -04:00
daniel31x13
dc388ebba5 improved iconPicker component + other improvements 2024-08-19 18:14:09 -04:00
Dan Jacobsen
21578bac8d feat: add configurable max workers 2024-08-19 12:44:59 -07:00
武田 淳一
1062e07065 Created Japanese Translate 2024-08-20 00:50:07 +09:00
daniel31x13
2893d3caf2 minor improvement 2024-08-18 16:52:08 -04:00
Daniel
9f74f62330 Merge pull request #722 from linkwarden/dev
Dev
2024-08-18 16:41:48 -04:00
Daniel
c6e3147bb6 Merge pull request #678 from IsaacWise06/fixes
General Fixes
2024-08-18 16:40:48 -04:00
daniel31x13
1260e8c093 fixes 2024-08-18 16:39:43 -04:00
Daniel
5cb4bdced3 Merge pull request #721 from linkwarden/feat/customizable-links
small improvements
2024-08-18 14:47:55 -04:00
Daniel
03b4240b8b Merge pull request #720 from linkwarden/revert-719-feat/customizable-links
Revert "Feat/customizable links"
2024-08-18 14:47:29 -04:00
Daniel
9a3e82470a Revert "Feat/customizable links" 2024-08-18 14:46:52 -04:00
Daniel
ee2319996b Merge pull request #719 from linkwarden/feat/customizable-links
Feat/customizable links
2024-08-18 14:46:21 -04:00
daniel31x13
c979adfe69 small improvements 2024-08-18 14:45:40 -04:00
Isaac Wise
2b83522eaa Merge branch 'dev' into fixes 2024-08-18 13:21:02 -05:00
Daniel
8c738d4a99 Merge pull request #718 from linkwarden/feat/customizable-links
Feat/customizable links
2024-08-18 14:11:47 -04:00
Isaac Wise
63678b7f1e format 2024-08-18 13:06:36 -05:00
Isaac Wise
b73e845299 Fix building 2024-08-18 13:06:19 -05:00
Isaac Wise
898b126231 Fix merge conflicts 2024-08-18 13:03:09 -05:00
daniel31x13
17d1cb45e3 minor improvement 2024-08-18 13:49:33 -04:00
José Roberto Sánchez
0aad2d9e4b Change email and fixed some typos. Overall is a good translation and I hope is merged soon. :D 2024-08-18 11:07:13 -06:00
daniel31x13
c18a5f4162 added details drawer 2024-08-18 02:55:59 -04:00
Teal'c
df7814385a feat(translations): Add Dutch and Turkish translations
- Added Dutch (nl) translations.
- Added Turkish (tr) translations.

#216
2024-08-18 04:39:35 +03:00
Ana
d568f22e00 Upload Spanish translation 2024-08-18 00:42:33 +01:00
Green-Kite
6bd1c90417 Create German Translation
updated German translation
2024-08-17 09:57:57 +02:00
daniel31x13
a40026040c icon picker component 2024-08-16 23:00:37 -04:00
Arran Ubels
334ad9f3dc Please 'EXPOSE' port 3000
This is so I can setup up Synology correctly
2024-08-17 11:56:00 +10:00
Daniel
f944345745 Merge pull request #708 from linkwarden/dev
bump version
2024-08-16 13:45:28 -04:00
daniel31x13
6b647573f0 bump version 2024-08-16 13:44:53 -04:00
Daniel
d81493e021 Merge pull request #707 from linkwarden/dev
bug fix
2024-08-16 13:43:57 -04:00
daniel31x13
03f4523d57 bug fix 2024-08-16 13:42:55 -04:00
Daniel
c24e76adac Merge pull request #706 from linkwarden/dev
v2.7.0
2024-08-16 12:36:43 -04:00
daniel31x13
5d26617251 bug fixed 2024-08-16 12:35:04 -04:00
daniel31x13
0e47ad9920 bump version 2024-08-15 16:42:36 -04:00
daniel31x13
ca45076b6c minor fix 2024-08-15 15:37:47 -04:00
Daniel
3bf6dcad2f Merge pull request #692 from phillibl/main
Update [...nextauth].ts to allow existing SSO user sign
2024-08-15 13:45:07 -04:00
daniel31x13
23860b8511 minor fix 2024-08-15 11:00:29 -04:00
daniel31x13
8758976f8d minor fix 2024-08-15 10:30:44 -04:00
Daniel
550dbd2bf0 Merge pull request #704 from shichen437/dev
feat(lang): add chinese translate
2024-08-15 08:49:26 -04:00
shichen437
04d2b3c6b2 feat(lang): add chinese translate 2024-08-15 17:20:46 +08:00
Trenton Holmes
cc1c17363b Also install a single browser (Chromium) through Playwright 2024-08-14 19:48:16 -07:00
daniel31x13
7bd0e29538 small improvement 2024-08-14 20:07:06 -04:00
daniel31x13
5baf55694c minor improvement 2024-08-14 19:23:51 -04:00
daniel31x13
193a70c6e8 fix dropdown text wrapping in other languages 2024-08-14 19:13:19 -04:00
daniel31x13
5b430cf31e add french translation 2024-08-14 17:49:53 -04:00
Daniel
684609a1dd Merge pull request #654 from zarevskaya/patch-1
Add french translation
2024-08-14 17:43:15 -04:00
Daniel
ebb2016915 Merge pull request #671 from jlssmt/main
handle undefined
2024-08-14 17:40:28 -04:00
daniel31x13
c103b66694 Merge branch 'dev' of https://github.com/linkwarden/linkwarden into dev 2024-08-14 17:26:40 -04:00
daniel31x13
863bcc3838 bug fixed 2024-08-14 17:26:38 -04:00
Daniel
66b0aacc3f Merge pull request #660 from IsaacWise06/issue-646
fix(collections): Redirect to dashboard or login for non-public collections
2024-08-14 17:04:25 -04:00
Daniel
299498ffa6 Merge pull request #703 from linkwarden/chore/react-query-implementation
Chore/react query implementation
2024-08-14 16:45:40 -04:00
phillibl
c5602dc79f Merge pull request #1 from phillibl/phillibl-SSO-user-signin
Update [...nextauth].ts to allow existing SSO user sign
2024-08-07 05:44:19 -04:00
phillibl
0158e58d90 Update [...nextauth].ts
Fixed issue where sign in would fail for existing user if DISABLE_NEW_SSO_USERS  = true
2024-08-07 05:29:10 -04:00
Trenton Holmes
602f399119 Updates actions to their latest versions 2024-08-04 15:15:33 -07:00
Trenton Holmes
012caab606 Use multi-stage building for the monolith binary 2024-08-04 15:01:54 -07:00
jlssmt
102690fc10 handle undefined 2024-08-02 09:07:13 +02:00
Daniel
237499fd03 Merge pull request #684 from linkwarden/daniel31x13-patch-1
Update README
2024-08-01 15:55:20 -04:00
Daniel
9a287d1aef Merge pull request #683 from linkwarden/daniel31x13-patch-1
Update README.md
2024-08-01 15:54:29 -04:00
Daniel
299a2331ff Update README.md 2024-08-01 15:54:00 -04:00
Isaac Wise
a1248fe62f Fix issue with link action dropdown 2024-07-27 20:19:24 -05:00
Isaac Wise
8f7e0b8d09 Remove type assertions 2024-07-27 20:01:51 -05:00
Isaac Wise
9d91d2064b Merge branch 'linkwarden:main' into issue-646 2024-07-27 17:57:25 -05:00
Isaac Wise
d631754b50 Keep any types for selects 2024-07-27 17:45:54 -05:00
Isaac Wise
94be3a7448 format 2024-07-27 17:41:13 -05:00
Isaac Wise
4faf389a2b Fix more types and use logical ANDs 2024-07-27 17:40:07 -05:00
Isaac Wise
ff31732ba3 remove more ternaries 2024-07-27 16:17:38 -05:00
Isaac Wise
fa051c0d4d Merge branch 'linkwarden:main' into fixes 2024-07-26 16:42:51 -05:00
Isaac Wise
02cb93065f Redact all ids when exporting data 2024-07-26 16:41:19 -05:00
Daniel
15a0084fb7 Merge pull request #677 from linkwarden/dev
bump version
2024-07-26 12:01:38 -04:00
Daniel
c0abf2f411 Merge pull request #676 from linkwarden/dev
bug fixed
2024-07-26 11:55:07 -04:00
Daniel
a886437589 Merge pull request #674 from linkwarden/dev
merged the two migration scripts for v2.6.1
2024-07-25 23:44:46 -04:00
Isaac Wise
0b8a9b4310 Fix some any types 2024-07-25 18:58:52 -05:00
jlssmt
ce1aa5a0ec disabled query logging as default 2024-07-25 23:19:33 +02:00
Daniel
a82c4ef85f Merge pull request #670 from linkwarden/dev
Dev
2024-07-25 14:24:24 -04:00
Daniel
7036b46084 Merge pull request #668 from linkwarden/dev
made script more efficient
2024-07-25 14:16:16 -04:00
Daniel
2bba8198b8 Merge pull request #667 from linkwarden/dev
minor fix
2024-07-25 13:58:13 -04:00
Daniel
96a70a9689 Merge pull request #666 from linkwarden/dev
update version number
2024-07-25 13:46:59 -04:00
Daniel
288fd9df87 Merge pull request #665 from linkwarden/dev
bug fixed
2024-07-25 13:45:03 -04:00
Isaac Wise
e79b98d3b0 Replace useless ternarys with logical ANDs 2024-07-22 22:34:36 -05:00
Isaac Wise
7d43ed52a4 format 2024-07-22 17:50:24 -05:00
Isaac Wise
614653bf29 Merge branch 'linkwarden:main' into issue-646 2024-07-22 17:41:34 -05:00
Isaac Wise
1b9dafbe47 Handle 400 error code when accesing a non public collection 2024-07-22 17:39:38 -05:00
zarev
abc93f1bf9 Update common.json
Correction
2024-07-20 09:55:51 +02:00
zarev
c23964a46d Create common.json
In french, if you want it ;)
2024-07-19 22:37:46 +02:00
Daniel
a76e996fc1 Merge pull request #653 from linkwarden/dev
v2.6.0
2024-07-19 08:59:54 -04:00
Oliver Schwamb
abb73f80bd Reworked access to tags as public viewer 2024-07-10 10:22:58 +02:00
Oliver Schwamb
e8d0cce58a Added allLinksOfCollection to linksStore
Removed duplicated tags
Fixed overflow for line
added disclosure for tags in public collection
2024-07-09 13:50:08 +02:00
Oliver Schwamb
e045c18b7d Only show tags within collection 2024-07-05 10:50:32 +02:00
Oliver Schwamb
a1f48bbd79 Tags in public collection 2024-07-05 10:40:40 +02:00
651 changed files with 42484 additions and 11061 deletions

View File

@@ -1,11 +1,12 @@
NEXTAUTH_SECRET=very_sensitive_secret
NEXTAUTH_URL=http://localhost:3000/api/v1/auth
NEXTAUTH_SECRET=
# Manual installation database settings
DATABASE_URL=postgresql://user:password@localhost:5432/linkwarden
# Example: DATABASE_URL=postgresql://user:password@localhost:5432/linkwarden
DATABASE_URL=
# Docker installation database settings
POSTGRES_PASSWORD=super_secret_password
POSTGRES_PASSWORD=
# Additional Optional Settings
PAGINATION_TAKE_COUNT=
@@ -14,7 +15,6 @@ AUTOSCROLL_TIMEOUT=
NEXT_PUBLIC_DISABLE_REGISTRATION=
NEXT_PUBLIC_CREDENTIALS_ENABLED=
DISABLE_NEW_SSO_USERS=
RE_ARCHIVE_LIMIT=
MAX_LINKS_PER_USER=
ARCHIVE_TAKE_COUNT=
BROWSER_TIMEOUT=
@@ -26,13 +26,51 @@ NEXT_PUBLIC_DEMO_USERNAME=
NEXT_PUBLIC_DEMO_PASSWORD=
NEXT_PUBLIC_ADMIN=
NEXT_PUBLIC_MAX_FILE_BUFFER=
MONOLITH_MAX_BUFFER=
MONOLITH_CUSTOM_OPTIONS=
PDF_MAX_BUFFER=
SCREENSHOT_MAX_BUFFER=
READABILITY_MAX_BUFFER=
PREVIEW_MAX_BUFFER=
MONOLITH_MAX_BUFFER=
MONOLITH_CUSTOM_OPTIONS=
IMPORT_LIMIT=
PLAYWRIGHT_LAUNCH_OPTIONS_EXECUTABLE_PATH=
PLAYWRIGHT_WS_URL=
MAX_WORKERS=
DISABLE_PRESERVATION=
NEXT_PUBLIC_RSS_POLLING_INTERVAL_MINUTES=
RSS_SUBSCRIPTION_LIMIT_PER_USER=
TEXT_CONTENT_LIMIT=
SEARCH_FILTER_LIMIT=
INDEX_TAKE_COUNT=
MEILI_TIMEOUT=
# AI Settings
NEXT_PUBLIC_OLLAMA_ENDPOINT_URL=
OLLAMA_MODEL=
# https://ai-sdk.dev/providers/openai-compatible-providers
OPENAI_API_KEY=
OPENAI_MODEL=
# Optional: Set a custom OpenAI base URL and name (for third-party providers)
CUSTOM_OPENAI_BASE_URL=
CUSTOM_OPENAI_NAME=
# https://sdk.vercel.ai/providers/ai-sdk-providers/azure
AZURE_API_KEY=
AZURE_RESOURCE_NAME=
AZURE_MODEL=
# https://sdk.vercel.ai/providers/ai-sdk-providers/anthropic
ANTHROPIC_API_KEY=
ANTHROPIC_MODEL=
# https://github.com/OpenRouterTeam/ai-sdk-provider
OPENROUTER_API_KEY=
OPENROUTER_MODEL=
# MeiliSearch Settings
MEILI_HOST=
MEILI_MASTER_KEY=
# AWS S3 Settings
SPACES_KEY=
@@ -216,6 +254,7 @@ NEXT_PUBLIC_GITLAB_ENABLED=
GITLAB_CUSTOM_NAME=
GITLAB_CLIENT_ID=
GITLAB_CLIENT_SECRET=
GITLAB_AUTH_URL=
# Google
NEXT_PUBLIC_GOOGLE_ENABLED=

View File

@@ -0,0 +1,13 @@
name: Installation Problem
title: Installation Problem
description: Report an issue with installation
labels: installation
body:
- type: textarea
id: feature-description
validations:
required: true
attributes:
label: For installation issues, please visit discord.linkwarden.app
description: "Invite link: https://discord.com/invite/CtuYV47nuJ"
placeholder: Please do not submit installation issues on GitHub.

18
.github/workflows/check-branch.yml vendored Normal file
View File

@@ -0,0 +1,18 @@
name: Check pull request source branch
on:
pull_request_target:
types:
- opened
- reopened
- synchronize
- edited
jobs:
check-branches:
runs-on: ubuntu-latest
steps:
- name: Check branches
run: |
if [ ${{ github.head_ref }} != "dev" ] && [ ${{ github.base_ref }} == "main" ]; then
echo "Merge requests to main branch are only allowed from dev branch. Please rebase your changes to dev branch."
exit 1
fi

45
.github/workflows/locale-action.yml vendored Normal file
View File

@@ -0,0 +1,45 @@
name: Manage i18n pull requests
on:
pull_request:
types: [opened, reopened, synchronize, ready_for_review]
permissions:
contents: write
pull-requests: write
jobs:
rewrite-author:
if: github.event.pull_request.head.ref == 'i18n'
runs-on: ubuntu-latest
steps:
- name: Checkout i18n branch
uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.ref }}
fetch-depth: 0
- name: Skip if already rewritten
run: |
if [ "$(git show -s --format='%an')" = 'LinkwardenBot' ]; then
echo "Already rewritten skipping."
exit 0
fi
- name: Configure bot identity
run: |
git config user.name "LinkwardenBot"
git config user.email "bot@linkwarden.app"
- name: Amend just the PR commits
env:
BASE_SHA: ${{ github.event.pull_request.base.sha }}
run: |
git rebase --committer-date-is-author-date \
--exec 'git commit --amend --no-edit --allow-empty \
--author="LinkwardenBot <bot@linkwarden.app>"' \
"$BASE_SHA"
- name: Push rewritten history
run: git push --force-with-lease origin HEAD:i18n

View File

@@ -59,10 +59,10 @@ jobs:
--health-retries 5
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
- name: Use Node.js
uses: actions/setup-node@v3
uses: actions/setup-node@v4
with:
node-version: "18"
cache: 'yarn'
@@ -119,23 +119,19 @@ jobs:
restore-keys: |
${{ runner.os }}-playwright-
- name: Install playwright
if: steps.cache-playwright.outputs.cache-hit != 'true'
run: yarn playwright install --with-deps
- name: Setup project
run: |
yarn prisma generate
yarn build
yarn prisma migrate deploy
yarn prisma:generate
yarn web:build
yarn prisma:deploy
- name: Start linkwarden server and worker
run: yarn start &
run: yarn concurrently:start &
- name: Run Tests
run: npx playwright test --grep ${{ matrix.test_case }}
run: yarn workspace @linkwarden/web playwright test --grep ${{ matrix.test_case }}
- uses: actions/upload-artifact@v3
- uses: actions/upload-artifact@v4
if: always()
with:
name: playwright-report

View File

@@ -1,6 +1,7 @@
name: Create and publish a container image on release
on:
workflow_dispatch:
push:
tags:
- "*"
@@ -27,7 +28,7 @@ jobs:
uses: docker/setup-buildx-action@v3
- name: Log in to the Container registry
uses: docker/login-action@v2
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
@@ -40,7 +41,7 @@ jobs:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
- name: Build and push Docker image
uses: docker/build-push-action@v3
uses: docker/build-push-action@v6
with:
context: .
push: true

32
.gitignore vendored
View File

@@ -1,5 +1,5 @@
# dependencies
/node_modules
node_modules
/.pnp
.pnp.js
@@ -7,7 +7,7 @@
/coverage
# next.js
/.next/
.next
/out/
# production
@@ -34,23 +34,21 @@ yarn-error.log*
*.tsbuildinfo
next-env.d.ts
# generated files and folders
/data
.idea
prisma/dev.db
# tests
/tests
/test-results/
/blob-report/
/playwright-report/
/playwright/.cache/
/playwright/.auth/
/apps/web/tests
/apps/web/test-results/
/apps/web/blob-report/
/apps/web/playwright-report/
/apps/web/playwright/.cache/
/apps/web/playwright/.auth/
# docker
pgdata
certificates
/test-results/
/playwright-report/
/blob-report/
/playwright/.cache/
# generated files and folders
/data
.idea
prisma/dev.db
data.ms
.turbo

View File

@@ -1,45 +0,0 @@
# Architecture
This is a summary of the architecture of Linkwarden. It's intended as a primer for collaborators to get a high-level understanding of the project.
When you start Linkwarden, there are mainly two components that run:
- The NextJS app, This is the main app and it's responsible for serving the frontend and handling the API routes.
- [The Background Worker](https://github.com/linkwarden/linkwarden/blob/main/scripts/worker.ts), This is a separate `ts-node` process that runs in the background and is responsible for archiving links.
## Main Tech Stack
- [NextJS](https://github.com/vercel/next.js)
- [TypeScript](https://github.com/microsoft/TypeScript)
- [Tailwind](https://github.com/tailwindlabs/tailwindcss)
- [DaisyUI](https://github.com/saadeghi/daisyui)
- [Prisma](https://github.com/prisma/prisma)
- [Playwright](https://github.com/microsoft/playwright)
- [Zustand](https://github.com/pmndrs/zustand)
## Folder Structure
Here's a summary of the main files and folders in the project:
```
linkwarden
├── components # React components
├── hooks # React reusable hooks
├── layouts # Layouts for pages
├── lib
│   ├── api # Server-side functions (controllers, etc.)
│   ├── client # Client-side functions
│   └── shared # Shared functions between client and server
├── pages # Pages and API routes
├── prisma # Prisma schema and migrations
├── scripts
│   ├── migration # Scripts for breaking changes
│   └── worker.ts # Background worker for archiving links
├── store # Zustand stores
├── styles # Styles
└── types # TypeScript types
```
## Versioning
We use semantic versioning for the project. You can track the changes from the [Releases](https://github.com/linkwarden/linkwarden/releases).

View File

@@ -1,4 +1,16 @@
FROM node:18.18-bullseye-slim
# Stage: monolith-builder
# Purpose: Uses the Rust image to build monolith
# Notes:
# - Fine to leave extra here, as only the resulting binary is copied out
FROM docker.io/rust:1.86-bullseye AS monolith-builder
RUN set -eux && cargo install --locked monolith
# Stage: main-app
# Purpose: Compiles the frontend and
# Notes:
# - Nothing extra should be left here. All commands should cleanup
FROM node:22.14-bullseye-slim AS main-app
ARG DEBIAN_FRONTEND=noninteractive
@@ -6,35 +18,42 @@ RUN mkdir /data
WORKDIR /data
COPY ./package.json ./yarn.lock ./playwright.config.ts ./
COPY ./apps/web/package.json ./apps/web/playwright.config.ts ./apps/web/
RUN --mount=type=cache,sharing=locked,target=/usr/local/share/.cache/yarn yarn install --network-timeout 10000000
COPY ./apps/worker/package.json ./apps/worker/
RUN apt-get update
COPY ./packages ./packages
RUN apt-get install -y \
build-essential \
curl \
libssl-dev \
pkg-config
COPY ./yarn.lock ./package.json ./
RUN apt-get update
RUN --mount=type=cache,sharing=locked,target=/usr/local/share/.cache/yarn \
set -eux && \
yarn install --network-timeout 10000000 && \
# Install curl for healthcheck, and ca-certificates to prevent monolith from failing to retrieve resources due to invalid certificates
apt-get update && \
apt-get install -yqq --no-install-recommends curl ca-certificates && \
apt-get autoremove && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
RUN curl https://sh.rustup.rs -sSf | bash -s -- -y
# Copy the compiled monolith binary from the builder stage
COPY --from=monolith-builder /usr/local/cargo/bin/monolith /usr/local/bin/monolith
ENV PATH="/root/.cargo/bin:${PATH}"
RUN cargo install monolith
RUN npx playwright install-deps && \
RUN set -eux && \
apt-get clean && \
yarn cache clean
RUN yarn playwright install
COPY . .
RUN yarn prisma generate && \
yarn build
RUN yarn prisma:generate && \
yarn web:build
CMD yarn prisma migrate deploy && yarn start
HEALTHCHECK --interval=30s \
--timeout=5s \
--start-period=10s \
--retries=3 \
CMD [ "/usr/bin/curl", "--silent", "--fail", "http://127.0.0.1:3000/" ]
EXPOSE 3000
CMD ["sh", "-c", "yarn prisma:deploy && yarn concurrently:start"]

View File

@@ -1,17 +1,23 @@
<div align="center">
<img src="./assets/logo.png" width="100px" />
<h1>Linkwarden</h1>
<h3>Bookmark Preservation for Individuals and Teams</h3>
<a href="https://discord.com/invite/CtuYV47nuJ"><img src="https://img.shields.io/discord/1117993124669702164?logo=discord&style=flat" alt="Discord"></a>
<a href="https://twitter.com/LinkwardenHQ"><img src="https://img.shields.io/twitter/follow/linkwarden" alt="Twitter"></a>
<a href="https://twitter.com/LinkwardenHQ"><img src="https://img.shields.io/twitter/follow/linkwarden" alt="Twitter"></a> <a href="https://news.ycombinator.com/item?id=36942308"><img src="https://img.shields.io/badge/Hacker%20News-280-%23FF6600"></img></a>
<img alt="GitHub commits since latest release" src="https://img.shields.io/github/commits-since/linkwarden/linkwarden/latest/dev?style=for-the-badge&label=COMMITS%20SINCE%20LATEST%20RELEASE">
<a href="https://github.com/linkwarden/linkwarden/releases"><img alt="GitHub release" src="https://img.shields.io/github/v/release/linkwarden/linkwarden"></a>
<a href="https://crowdin.com/project/linkwarden">
<img src="https://badges.crowdin.net/linkwarden/localized.svg" alt="Crowdin" /></a>
<a href="https://opencollective.com/linkwarden"><img src="https://img.shields.io/opencollective/all/linkwarden" alt="Open Collective"></a>
</div>
<div align='center'>
[Website](https://linkwarden.app) | [Getting Started](https://docs.linkwarden.app) | [Features](https://github.com/linkwarden/linkwarden#features) | [Roadmap](https://github.com/orgs/linkwarden/projects/1) | [Support ❤](https://github.com/linkwarden/linkwarden#support-)
[« LAUNCH DEMO »](https://demo.linkwarden.app)
[Cloud](https://cloud.linkwarden.app) · [Website](https://linkwarden.app) · [Features](https://github.com/linkwarden/linkwarden#features) · [Docs](https://docs.linkwarden.app)
</div>
@@ -24,7 +30,7 @@ The objective is to organize useful webpages and articles you find across the we
Additionally, Linkwarden is designed with collaboration in mind, sharing links with the public and/or allowing multiple users to work together seamlessly.
> [!TIP]
> Our official [Cloud](https://linkwarden.app/#pricing) offering provides the simplest way to begin using Linkwarden and it's the preferred choice for many due to its time-saving benefits. <br> Your subscription supports our hosting infrastructure and ongoing development. <br> Alternatively, if you prefer [self-hosting](https://docs.linkwarden.app/self-hosting/installation) Linkwarden, no problem! You'll still have access to all the premium features.
> Our official [Cloud](https://linkwarden.app/#pricing) offering provides the simplest way to begin using Linkwarden and it's the preferred choice for many due to its time-saving benefits. <br> Your subscription supports our hosting infrastructure and ongoing development. <br> Alternatively, if you prefer self-hosting Linkwarden, you can do so by following our [Installation documentation](https://docs.linkwarden.app/self-hosting/installation).
<img src="./assets/dashboard.png" />
@@ -46,19 +52,11 @@ Additionally, Linkwarden is designed with collaboration in mind, sharing links w
<img src="./assets/light_dashboard.jpg" width="23%" />
</div>
<details>
<summary><b>A bit of a "history"</b></summary>
Linkwarden has been completely rebuilt and redesigned from ground up, so pretty much the only thing it has in common with its predecessor is the idea behind it - bookmark management.
**What happened to the old version?**
We've forked the old version from the current repository into [this repo](https://github.com/linkwarden/linkwarden-old).
</details>
## Features
- 📸 Auto capture a screenshot, PDF, single html file, and readable view of each webpage.
- 🏛️ Send your webpage to Wayback Machine ([archive.org](https://archive.org)) for a snapshot. (Optional)
- ✨ Local AI Tagging to automatically tag your links based on their content (Optional).
- 📂 Organize links by collection, sub-collection, name, description and multiple tags.
- 👥 Collaborate on gathering links in a collection.
- 🎛️ Customize the permissions of each member.
@@ -67,14 +65,20 @@ We've forked the old version from the current repository into [this repo](https:
- 🔍 Full text search, filter and sort for easy retrieval.
- 📱 Responsive design and supports most modern browsers.
- 🌓 Dark/Light mode support.
- 🧩 Browser extension, managed by the community. [Star it here!](https://github.com/linkwarden/browser-extension)
- 🧩 Browser extension. [Star it here!](https://github.com/linkwarden/browser-extension)
- 🔄 Browser Synchronization (using [Floccus](https://floccus.org)!)
- ⬇️ Import and export your bookmarks.
- 🔐 SSO integration. (Enterprise and Self-hosted users only)
- 📦 Installable Progressive Web App (PWA).
- 🍎 iOS Shortcut to save links to Linkwarden.
- 🍎 iOS Shortcut to save Links to Linkwarden.
- 🔑 API keys.
- ✅ Bulk actions.
- ✨ And so many more features!
- 👥 User administration.
- 🌐 Support for Other Languages (i18n).
- 📁 Image and PDF Uploads.
- 🎨 Custom Icons for Links and Collections.
- 🔔 RSS Feed Subscription.
- ✨ And many more features. (Literally!)
## Like what we're doing? Give us a Star ⭐
@@ -92,25 +96,39 @@ Join and follow us in the following platforms to stay up to date about the most
## Suggestions
We _usually_ go after the [popular suggestions](https://github.com/linkwarden/linkwarden/issues?q=is%3Aissue+is%3Aopen+sort%3Areactions-%2B1-desc). Feel free to open a [new issue](https://github.com/linkwarden/linkwarden/issues/new?assignees=&labels=enhancement&projects=&template=feature_request.md&title=) to suggest one - others might be interested too! :)
We _usually_ go after the [popular suggestions](https://github.com/linkwarden/linkwarden/issues?q=is%3Aissue%20is%3Aopen%20sort%3Areactions-%2B1-desc). Feel free to open a [new issue](https://github.com/linkwarden/linkwarden/issues/new?assignees=&labels=enhancement&projects=&template=feature_request.md&title=) to suggest one - others might be interested too! :)
## Roadmap
Make sure to check out our [public roadmap](https://github.com/orgs/linkwarden/projects/1).
## Docs
## Community Projects
For information on how to get started or to set up your own instance, please visit the [documentation](https://docs.linkwarden.app).
Here are some community-maintained projects that are built around Linkwarden:
- [My Links](https://apps.apple.com/ca/app/my-links-for-linkwarden/id6504573402) - iOS and MacOS Apps, maintained by [JGeek00](https://github.com/JGeek00).
- [LinkDroid](https://fossdroid.com/a/linkdroid-for-linkwarden.html) - Android App with share sheet integration, [source code](https://github.com/Dacid99/LinkDroid-for-Linkwarden).
- [LinkGuardian](https://github.com/Elbullazul/LinkGuardian) - An Android client for Linkwarden. Built with Kotlin and Jetpack compose.
- [StarWarden](https://github.com/rtuszik/starwarden) - A browser extension to save your starred GitHub repositories to Linkwarden.
## Development
If you want to contribute, Thanks! Start by checking our [public roadmap](https://github.com/orgs/linkwarden/projects/1), there you'll see a [README for contributers](https://github.com/orgs/linkwarden/projects/1?pane=issue&itemId=34708277) for the rest of the info on how to contribute and the main tech stack.
If you want to contribute, Thanks! Start by choosing one of our [popular suggestions](https://github.com/linkwarden/linkwarden/issues?q=is%3Aissue%20is%3Aopen%20sort%3Areactions-%2B1-desc), just please stay in touch with [@daniel31x13](https://github.com/daniel31x13) before starting.
# Translations
If you want to help us translate Linkwarden to your language, please check out our [Crowdin page](https://crowdin.com/project/linkwarden) and start translating. We would love to have your help!
To start translating a new language, please create an issue so we can set it up for you. New languages will be added once they reach at least 50% translation completion.
<a href="https://crowdin.com/project/linkwarden">
<img src="https://badges.crowdin.net/linkwarden/localized.svg" alt="Crowdin" /></a>
## Security
If you found a security vulnerability, please do **not** create a public issue, instead send an email to [security@linkwarden.app](mailto:security@linkwarden.app) stating the vulnerability. Thanks!
## Support
## Support <3
Other than using our official [Cloud](https://linkwarden.app/#pricing) offering, any [donations](https://opencollective.com/linkwarden) are highly appreciated as well!

2
apps/mobile/.env.sample Normal file
View File

@@ -0,0 +1,2 @@
LINKWARDEN_URL=
EXPO_PUBLIC_SHOW_LOGS=

39
apps/mobile/.gitignore vendored Normal file
View File

@@ -0,0 +1,39 @@
# Learn more https://docs.github.com/en/get-started/getting-started-with-git/ignoring-files
# dependencies
node_modules/
# Expo
.expo/
dist/
web-build/
expo-env.d.ts
# Native
*.orig.*
*.jks
*.p8
*.p12
*.key
*.mobileprovision
# Metro
.metro-health-check*
# debug
npm-debug.*
yarn-debug.*
yarn-error.*
# macOS
.DS_Store
*.pem
# local env files
.env*.local
# typescript
*.tsbuildinfo
app-example
.env

1
apps/mobile/.npmrc Normal file
View File

@@ -0,0 +1 @@
node-linker=hoisted

16
apps/mobile/android/.gitignore vendored Normal file
View File

@@ -0,0 +1,16 @@
# OSX
#
.DS_Store
# Android/IntelliJ
#
build/
.idea
.gradle
local.properties
*.iml
*.hprof
.cxx/
# Bundle artifacts
*.jsbundle

View File

@@ -0,0 +1,176 @@
apply plugin: "com.android.application"
apply plugin: "org.jetbrains.kotlin.android"
apply plugin: "com.facebook.react"
def projectRoot = rootDir.getAbsoluteFile().getParentFile().getAbsolutePath()
/**
* This is the configuration block to customize your React Native Android app.
* By default you don't need to apply any configuration, just uncomment the lines you need.
*/
react {
entryFile = file(["node", "-e", "require('expo/scripts/resolveAppEntry')", projectRoot, "android", "absolute"].execute(null, rootDir).text.trim())
reactNativeDir = new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim()).getParentFile().getAbsoluteFile()
hermesCommand = new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim()).getParentFile().getAbsolutePath() + "/sdks/hermesc/%OS-BIN%/hermesc"
codegenDir = new File(["node", "--print", "require.resolve('@react-native/codegen/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim()).getParentFile().getAbsoluteFile()
// Use Expo CLI to bundle the app, this ensures the Metro config
// works correctly with Expo projects.
cliFile = new File(["node", "--print", "require.resolve('@expo/cli', { paths: [require.resolve('expo/package.json')] })"].execute(null, rootDir).text.trim())
bundleCommand = "export:embed"
/* Folders */
// The root of your project, i.e. where "package.json" lives. Default is '../..'
// root = file("../../")
// The folder where the react-native NPM package is. Default is ../../node_modules/react-native
// reactNativeDir = file("../../node_modules/react-native")
// The folder where the react-native Codegen package is. Default is ../../node_modules/@react-native/codegen
// codegenDir = file("../../node_modules/@react-native/codegen")
/* Variants */
// The list of variants to that are debuggable. For those we're going to
// skip the bundling of the JS bundle and the assets. By default is just 'debug'.
// If you add flavors like lite, prod, etc. you'll have to list your debuggableVariants.
// debuggableVariants = ["liteDebug", "prodDebug"]
/* Bundling */
// A list containing the node command and its flags. Default is just 'node'.
// nodeExecutableAndArgs = ["node"]
//
// The path to the CLI configuration file. Default is empty.
// bundleConfig = file(../rn-cli.config.js)
//
// The name of the generated asset file containing your JS bundle
// bundleAssetName = "MyApplication.android.bundle"
//
// The entry file for bundle generation. Default is 'index.android.js' or 'index.js'
// entryFile = file("../js/MyApplication.android.js")
//
// A list of extra flags to pass to the 'bundle' commands.
// See https://github.com/react-native-community/cli/blob/main/docs/commands.md#bundle
// extraPackagerArgs = []
/* Hermes Commands */
// The hermes compiler command to run. By default it is 'hermesc'
// hermesCommand = "$rootDir/my-custom-hermesc/bin/hermesc"
//
// The list of flags to pass to the Hermes compiler. By default is "-O", "-output-source-map"
// hermesFlags = ["-O", "-output-source-map"]
/* Autolinking */
autolinkLibrariesWithApp()
}
/**
* Set this to true to Run Proguard on Release builds to minify the Java bytecode.
*/
def enableProguardInReleaseBuilds = (findProperty('android.enableProguardInReleaseBuilds') ?: false).toBoolean()
/**
* The preferred build flavor of JavaScriptCore (JSC)
*
* For example, to use the international variant, you can use:
* `def jscFlavor = 'org.webkit:android-jsc-intl:+'`
*
* The international variant includes ICU i18n library and necessary data
* allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that
* give correct results when using with locales other than en-US. Note that
* this variant is about 6MiB larger per architecture than default.
*/
def jscFlavor = 'org.webkit:android-jsc:+'
android {
ndkVersion rootProject.ext.ndkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
compileSdk rootProject.ext.compileSdkVersion
namespace 'com.anonymous.mobileapp'
defaultConfig {
applicationId 'com.anonymous.mobileapp'
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 1
versionName "1.0.0"
}
signingConfigs {
debug {
storeFile file('debug.keystore')
storePassword 'android'
keyAlias 'androiddebugkey'
keyPassword 'android'
}
}
buildTypes {
debug {
signingConfig signingConfigs.debug
}
release {
// Caution! In production, you need to generate your own keystore file.
// see https://reactnative.dev/docs/signed-apk-android.
signingConfig signingConfigs.debug
shrinkResources (findProperty('android.enableShrinkResourcesInReleaseBuilds')?.toBoolean() ?: false)
minifyEnabled enableProguardInReleaseBuilds
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
crunchPngs (findProperty('android.enablePngCrunchInReleaseBuilds')?.toBoolean() ?: true)
}
}
packagingOptions {
jniLibs {
useLegacyPackaging (findProperty('expo.useLegacyPackaging')?.toBoolean() ?: false)
}
}
androidResources {
ignoreAssetsPattern '!.svn:!.git:!.ds_store:!*.scc:!CVS:!thumbs.db:!picasa.ini:!*~'
}
}
// Apply static values from `gradle.properties` to the `android.packagingOptions`
// Accepts values in comma delimited lists, example:
// android.packagingOptions.pickFirsts=/LICENSE,**/picasa.ini
["pickFirsts", "excludes", "merges", "doNotStrip"].each { prop ->
// Split option: 'foo,bar' -> ['foo', 'bar']
def options = (findProperty("android.packagingOptions.$prop") ?: "").split(",");
// Trim all elements in place.
for (i in 0..<options.size()) options[i] = options[i].trim();
// `[] - ""` is essentially `[""].filter(Boolean)` removing all empty strings.
options -= ""
if (options.length > 0) {
println "android.packagingOptions.$prop += $options ($options.length)"
// Ex: android.packagingOptions.pickFirsts += '**/SCCS/**'
options.each {
android.packagingOptions[prop] += it
}
}
}
dependencies {
// The version of react-native is set by the React Native Gradle Plugin
implementation("com.facebook.react:react-android")
def isGifEnabled = (findProperty('expo.gif.enabled') ?: "") == "true";
def isWebpEnabled = (findProperty('expo.webp.enabled') ?: "") == "true";
def isWebpAnimatedEnabled = (findProperty('expo.webp.animated') ?: "") == "true";
if (isGifEnabled) {
// For animated gif support
implementation("com.facebook.fresco:animated-gif:${reactAndroidLibs.versions.fresco.get()}")
}
if (isWebpEnabled) {
// For webp support
implementation("com.facebook.fresco:webpsupport:${reactAndroidLibs.versions.fresco.get()}")
if (isWebpAnimatedEnabled) {
// Animated webp support
implementation("com.facebook.fresco:animated-webp:${reactAndroidLibs.versions.fresco.get()}")
}
}
if (hermesEnabled.toBoolean()) {
implementation("com.facebook.react:hermes-android")
} else {
implementation jscFlavor
}
}

Binary file not shown.

View File

@@ -0,0 +1,14 @@
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# react-native-reanimated
-keep class com.swmansion.reanimated.** { *; }
-keep class com.facebook.react.turbomodule.** { *; }
# Add any project specific keep options here:

View File

@@ -0,0 +1,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<application android:usesCleartextTraffic="true" tools:targetApi="28" tools:ignore="GoogleAppIndexingWarning" tools:replace="android:usesCleartextTraffic" />
</manifest>

View File

@@ -0,0 +1,33 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<queries>
<intent>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:scheme="https"/>
</intent>
</queries>
<application android:name=".MainApplication" android:label="@string/app_name" android:icon="@mipmap/ic_launcher" android:roundIcon="@mipmap/ic_launcher_round" android:allowBackup="true" android:theme="@style/AppTheme" android:supportsRtl="true" android:fullBackupContent="@xml/secure_store_backup_rules" android:dataExtractionRules="@xml/secure_store_data_extraction_rules">
<meta-data android:name="expo.modules.updates.ENABLED" android:value="false"/>
<meta-data android:name="expo.modules.updates.EXPO_UPDATES_CHECK_ON_LAUNCH" android:value="ALWAYS"/>
<meta-data android:name="expo.modules.updates.EXPO_UPDATES_LAUNCH_WAIT_MS" android:value="0"/>
<activity android:name=".MainActivity" android:configChanges="keyboard|keyboardHidden|orientation|screenSize|screenLayout|uiMode" android:launchMode="singleTask" android:windowSoftInputMode="adjustResize" android:theme="@style/Theme.App.SplashScreen" android:exported="true" android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:scheme="myapp"/>
<data android:scheme="com.anonymous.mobileapp"/>
<data android:scheme="exp+mobile-app"/>
</intent-filter>
</activity>
</application>
</manifest>

View File

@@ -0,0 +1,65 @@
package com.anonymous.mobileapp
import expo.modules.splashscreen.SplashScreenManager
import android.os.Build
import android.os.Bundle
import com.facebook.react.ReactActivity
import com.facebook.react.ReactActivityDelegate
import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.fabricEnabled
import com.facebook.react.defaults.DefaultReactActivityDelegate
import expo.modules.ReactActivityDelegateWrapper
class MainActivity : ReactActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
// Set the theme to AppTheme BEFORE onCreate to support
// coloring the background, status bar, and navigation bar.
// This is required for expo-splash-screen.
// setTheme(R.style.AppTheme);
// @generated begin expo-splashscreen - expo prebuild (DO NOT MODIFY) sync-f3ff59a738c56c9a6119210cb55f0b613eb8b6af
SplashScreenManager.registerOnActivity(this)
// @generated end expo-splashscreen
super.onCreate(null)
}
/**
* Returns the name of the main component registered from JavaScript. This is used to schedule
* rendering of the component.
*/
override fun getMainComponentName(): String = "main"
/**
* Returns the instance of the [ReactActivityDelegate]. We use [DefaultReactActivityDelegate]
* which allows you to enable New Architecture with a single boolean flags [fabricEnabled]
*/
override fun createReactActivityDelegate(): ReactActivityDelegate {
return ReactActivityDelegateWrapper(
this,
BuildConfig.IS_NEW_ARCHITECTURE_ENABLED,
object : DefaultReactActivityDelegate(
this,
mainComponentName,
fabricEnabled
){})
}
/**
* Align the back button behavior with Android S
* where moving root activities to background instead of finishing activities.
* @see <a href="https://developer.android.com/reference/android/app/Activity#onBackPressed()">onBackPressed</a>
*/
override fun invokeDefaultOnBackPressed() {
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.R) {
if (!moveTaskToBack(false)) {
// For non-root activities, use the default implementation to finish them.
super.invokeDefaultOnBackPressed()
}
return
}
// Use the default back button implementation on Android S
// because it's doing more than [Activity.moveTaskToBack] in fact.
super.invokeDefaultOnBackPressed()
}
}

View File

@@ -0,0 +1,57 @@
package com.anonymous.mobileapp
import android.app.Application
import android.content.res.Configuration
import com.facebook.react.PackageList
import com.facebook.react.ReactApplication
import com.facebook.react.ReactNativeHost
import com.facebook.react.ReactPackage
import com.facebook.react.ReactHost
import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.load
import com.facebook.react.defaults.DefaultReactNativeHost
import com.facebook.react.soloader.OpenSourceMergedSoMapping
import com.facebook.soloader.SoLoader
import expo.modules.ApplicationLifecycleDispatcher
import expo.modules.ReactNativeHostWrapper
class MainApplication : Application(), ReactApplication {
override val reactNativeHost: ReactNativeHost = ReactNativeHostWrapper(
this,
object : DefaultReactNativeHost(this) {
override fun getPackages(): List<ReactPackage> {
val packages = PackageList(this).packages
// Packages that cannot be autolinked yet can be added manually here, for example:
// packages.add(new MyReactNativePackage());
return packages
}
override fun getJSMainModuleName(): String = ".expo/.virtual-metro-entry"
override fun getUseDeveloperSupport(): Boolean = BuildConfig.DEBUG
override val isNewArchEnabled: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED
override val isHermesEnabled: Boolean = BuildConfig.IS_HERMES_ENABLED
}
)
override val reactHost: ReactHost
get() = ReactNativeHostWrapper.createReactHost(applicationContext, reactNativeHost)
override fun onCreate() {
super.onCreate()
SoLoader.init(this, OpenSourceMergedSoMapping)
if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
// If you opted-in for the New Architecture, we load the native entry point for this app.
load()
}
ApplicationLifecycleDispatcher.onApplicationCreate(this)
}
override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
ApplicationLifecycleDispatcher.onConfigurationChanged(this, newConfig)
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

View File

@@ -0,0 +1,6 @@
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/splashscreen_background"/>
<item>
<bitmap android:gravity="center" android:src="@drawable/splashscreen_logo"/>
</item>
</layer-list>

View File

@@ -0,0 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2014 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<inset xmlns:android="http://schemas.android.com/apk/res/android"
android:insetLeft="@dimen/abc_edit_text_inset_horizontal_material"
android:insetRight="@dimen/abc_edit_text_inset_horizontal_material"
android:insetTop="@dimen/abc_edit_text_inset_top_material"
android:insetBottom="@dimen/abc_edit_text_inset_bottom_material"
>
<selector>
<!--
This file is a copy of abc_edit_text_material (https://bit.ly/3k8fX7I).
The item below with state_pressed="false" and state_focused="false" causes a NullPointerException.
NullPointerException:tempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable(android.content.res.Resources)'
<item android:state_pressed="false" android:state_focused="false" android:drawable="@drawable/abc_textfield_default_mtrl_alpha"/>
For more info, see https://bit.ly/3CdLStv (react-native/pull/29452) and https://bit.ly/3nxOMoR.
-->
<item android:state_enabled="false" android:drawable="@drawable/abc_textfield_default_mtrl_alpha"/>
<item android:drawable="@drawable/abc_textfield_activated_mtrl_alpha"/>
</selector>
</inset>

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/iconBackground"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon>

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/iconBackground"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon>

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -0,0 +1 @@
<resources/>

View File

@@ -0,0 +1,6 @@
<resources>
<color name="splashscreen_background">#ffffff</color>
<color name="iconBackground">#ffffff</color>
<color name="colorPrimary">#023c69</color>
<color name="colorPrimaryDark">#ffffff</color>
</resources>

View File

@@ -0,0 +1,6 @@
<resources>
<string name="app_name">mobile-app</string>
<string name="expo_system_ui_user_interface_style" translatable="false">automatic</string>
<string name="expo_splash_screen_resize_mode" translatable="false">contain</string>
<string name="expo_splash_screen_status_bar_translucent" translatable="false">false</string>
</resources>

View File

@@ -0,0 +1,19 @@
<resources xmlns:tools="http://schemas.android.com/tools">
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:textColor">@android:color/black</item>
<item name="android:editTextStyle">@style/ResetEditText</item>
<item name="android:editTextBackground">@drawable/rn_edit_text_material</item>
<item name="colorPrimary">@color/colorPrimary</item>
<item name="android:statusBarColor">#ffffff</item>
</style>
<style name="ResetEditText" parent="@android:style/Widget.EditText">
<item name="android:padding">0dp</item>
<item name="android:textColorHint">#c8c8c8</item>
<item name="android:textColor">@android:color/black</item>
</style>
<style name="Theme.App.SplashScreen" parent="Theme.SplashScreen">
<item name="windowSplashScreenBackground">@color/splashscreen_background</item>
<item name="windowSplashScreenAnimatedIcon">@drawable/splashscreen_logo</item>
<item name="postSplashScreenTheme">@style/AppTheme</item>
</style>
</resources>

View File

@@ -0,0 +1,41 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
ext {
buildToolsVersion = findProperty('android.buildToolsVersion') ?: '35.0.0'
minSdkVersion = Integer.parseInt(findProperty('android.minSdkVersion') ?: '24')
compileSdkVersion = Integer.parseInt(findProperty('android.compileSdkVersion') ?: '35')
targetSdkVersion = Integer.parseInt(findProperty('android.targetSdkVersion') ?: '34')
kotlinVersion = findProperty('android.kotlinVersion') ?: '1.9.25'
ndkVersion = "26.1.10909125"
}
repositories {
google()
mavenCentral()
}
dependencies {
classpath('com.android.tools.build:gradle')
classpath('com.facebook.react:react-native-gradle-plugin')
classpath('org.jetbrains.kotlin:kotlin-gradle-plugin')
}
}
apply plugin: "com.facebook.react.rootproject"
allprojects {
repositories {
maven {
// All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
url(new File(['node', '--print', "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim(), '../android'))
}
maven {
// Android JSC is installed from npm
url(new File(['node', '--print', "require.resolve('jsc-android/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim(), '../dist'))
}
google()
mavenCentral()
maven { url 'https://www.jitpack.io' }
}
}

View File

@@ -0,0 +1,56 @@
# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
# Default value: -Xmx512m -XX:MaxMetaspaceSize=256m
org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
# AndroidX package structure to make it clearer which packages are bundled with the
# Android operating system, and which are packaged with your app's APK
# https://developer.android.com/topic/libraries/support-library/androidx-rn
android.useAndroidX=true
# Enable AAPT2 PNG crunching
android.enablePngCrunchInReleaseBuilds=true
# Use this property to specify which architecture you want to build.
# You can also override it from the CLI using
# ./gradlew <task> -PreactNativeArchitectures=x86_64
reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64
# Use this property to enable support to the new architecture.
# This will allow you to use TurboModules and the Fabric render in
# your application. You should enable this flag either if you want
# to write custom TurboModules/Fabric components OR use libraries that
# are providing them.
newArchEnabled=true
# Use this property to enable or disable the Hermes JS engine.
# If set to false, you will be using JSC instead.
hermesEnabled=true
# Enable GIF support in React Native images (~200 B increase)
expo.gif.enabled=true
# Enable webp support in React Native images (~85 KB increase)
expo.webp.enabled=true
# Enable animated webp support (~3.4 MB increase)
# Disabled by default because iOS doesn't support animated webp
expo.webp.animated=false
# Enable network inspector
EX_DEV_CLIENT_NETWORK_INSPECTOR=true
# Use legacy packaging to compress native libraries in the resulting APK.
expo.useLegacyPackaging=false

Binary file not shown.

View File

@@ -0,0 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

252
apps/mobile/android/gradlew vendored Executable file
View File

@@ -0,0 +1,252 @@
#!/bin/sh
#
# Copyright © 2015-2021 the original authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# SPDX-License-Identifier: Apache-2.0
#
##############################################################################
#
# Gradle start up script for POSIX generated by Gradle.
#
# Important for running:
#
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
# noncompliant, but you have some other compliant shell such as ksh or
# bash, then to run this script, type that shell name before the whole
# command line, like:
#
# ksh Gradle
#
# Busybox and similar reduced shells will NOT work, because this script
# requires all of these POSIX shell features:
# * functions;
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
# * compound commands having a testable exit status, especially «case»;
# * various built-in commands including «command», «set», and «ulimit».
#
# Important for patching:
#
# (2) This script targets any POSIX shell, so it avoids extensions provided
# by Bash, Ksh, etc; in particular arrays are avoided.
#
# The "traditional" practice of packing multiple parameters into a
# space-separated string is a well documented source of bugs and security
# problems, so this is (mostly) avoided, by progressively accumulating
# options in "$@", and eventually passing that to Java.
#
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
# see the in-line comments for details.
#
# There are tweaks for specific operating systems such as AIX, CygWin,
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
#
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
app_path=$0
# Need this for daisy-chained symlinks.
while
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
[ -h "$app_path" ]
do
ls=$( ls -ld "$app_path" )
link=${ls#*' -> '}
case $link in #(
/*) app_path=$link ;; #(
*) app_path=$APP_HOME$link ;;
esac
done
# This is normally unused
# shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s
' "$PWD" ) || exit
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum
warn () {
echo "$*"
} >&2
die () {
echo
echo "$*"
echo
exit 1
} >&2
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "$( uname )" in #(
CYGWIN* ) cygwin=true ;; #(
Darwin* ) darwin=true ;; #(
MSYS* | MINGW* ) msys=true ;; #(
NONSTOP* ) nonstop=true ;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD=$JAVA_HOME/jre/sh/java
else
JAVACMD=$JAVA_HOME/bin/java
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD=java
if ! command -v java >/dev/null 2>&1
then
die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
fi
# Increase the maximum file descriptors if we can.
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
case $MAX_FD in #(
'' | soft) :;; #(
*)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
fi
# Collect all arguments for the java command, stacking in reverse order:
# * args from the command line
# * the main class name
# * -classpath
# * -D...appname settings
# * --module-path (only if needed)
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
# For Cygwin or MSYS, switch paths to Windows format before running java
if "$cygwin" || "$msys" ; then
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
JAVACMD=$( cygpath --unix "$JAVACMD" )
# Now convert the arguments - kludge to limit ourselves to /bin/sh
for arg do
if
case $arg in #(
-*) false ;; # don't mess with options #(
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
[ -e "$t" ] ;; #(
*) false ;;
esac
then
arg=$( cygpath --path --ignore --mixed "$arg" )
fi
# Roll the args list around exactly as many times as the number of
# args, so each arg winds up back in the position where it started, but
# possibly modified.
#
# NB: a `for` loop captures its iteration list before it begins, so
# changing the positional parameters here affects neither the number of
# iterations, nor the values presented in `arg`.
shift # remove old arg
set -- "$@" "$arg" # push replacement arg
done
fi
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Collect all arguments for the java command:
# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
# and any embedded shellness will be escaped.
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
# treated as '${Hostname}' itself on the command line.
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \
org.gradle.wrapper.GradleWrapperMain \
"$@"
# Stop when "xargs" is not available.
if ! command -v xargs >/dev/null 2>&1
then
die "xargs is not available"
fi
# Use "xargs" to parse quoted args.
#
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
#
# In Bash we could simply go:
#
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
# set -- "${ARGS[@]}" "$@"
#
# but POSIX shell has neither arrays nor command substitution, so instead we
# post-process each arg (as a line of input to sed) to backslash-escape any
# character that might be a shell metacharacter, then use eval to reverse
# that process (while maintaining the separation between arguments), and wrap
# the whole thing up as a single "set" statement.
#
# This will of course break if any of these variables contains a newline or
# an unmatched quote.
#
eval "set -- $(
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
xargs -n1 |
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
tr '\n' ' '
)" '"$@"'
exec "$JAVACMD" "$@"

94
apps/mobile/android/gradlew.bat vendored Normal file
View File

@@ -0,0 +1,94 @@
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@rem SPDX-License-Identifier: Apache-2.0
@rem
@if "%DEBUG%"=="" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%"=="" set DIRNAME=.
@rem This is normally unused
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if %ERRORLEVEL% equ 0 goto execute
echo. 1>&2
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. 1>&2
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
echo. 1>&2
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. 1>&2
goto fail
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end
@rem End local scope for the variables with windows NT shell
if %ERRORLEVEL% equ 0 goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
set EXIT_CODE=%ERRORLEVEL%
if %EXIT_CODE% equ 0 set EXIT_CODE=1
if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
exit /b %EXIT_CODE%
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega

View File

@@ -0,0 +1,38 @@
pluginManagement {
includeBuild(new File(["node", "--print", "require.resolve('@react-native/gradle-plugin/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim()).getParentFile().toString())
}
plugins { id("com.facebook.react.settings") }
extensions.configure(com.facebook.react.ReactSettingsExtension) { ex ->
if (System.getenv('EXPO_USE_COMMUNITY_AUTOLINKING') == '1') {
ex.autolinkLibrariesFromCommand()
} else {
def command = [
'node',
'--no-warnings',
'--eval',
'require(require.resolve(\'expo-modules-autolinking\', { paths: [require.resolve(\'expo/package.json\')] }))(process.argv.slice(1))',
'react-native-config',
'--json',
'--platform',
'android'
].toList()
ex.autolinkLibrariesFromCommand(command)
}
}
rootProject.name = 'mobile-app'
dependencyResolutionManagement {
versionCatalogs {
reactAndroidLibs {
from(files(new File(["node", "--print", "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim(), "../gradle/libs.versions.toml")))
}
}
}
apply from: new File(["node", "--print", "require.resolve('expo/package.json')"].execute(null, rootDir).text.trim(), "../scripts/autolinking.gradle");
useExpoModules()
include ':app'
includeBuild(new File(["node", "--print", "require.resolve('@react-native/gradle-plugin/package.json', { paths: [require.resolve('react-native/package.json')] })"].execute(null, rootDir).text.trim()).getParentFile())

44
apps/mobile/app.json Normal file
View File

@@ -0,0 +1,44 @@
{
"expo": {
"name": "mobile-app",
"slug": "mobile-app",
"version": "1.0.0",
"orientation": "portrait",
"icon": "./assets/images/icon.png",
"scheme": "myapp",
"userInterfaceStyle": "automatic",
"newArchEnabled": true,
"ios": {
"supportsTablet": true,
"bundleIdentifier": "com.anonymous.mobile-app"
},
"android": {
"adaptiveIcon": {
"foregroundImage": "./assets/images/adaptive-icon.png",
"backgroundColor": "#ffffff"
},
"package": "com.anonymous.mobileapp"
},
"web": {
"bundler": "metro",
"output": "static",
"favicon": "./assets/images/favicon.png"
},
"plugins": [
"expo-router",
[
"expo-splash-screen",
{
"image": "./assets/images/splash-icon.png",
"imageWidth": 200,
"resizeMode": "contain",
"backgroundColor": "#ffffff"
}
],
"expo-secure-store"
],
"experiments": {
"typedRoutes": true
}
}
}

View File

@@ -0,0 +1,65 @@
import { Tabs, useRouter } from "expo-router";
import React from "react";
import { Platform, TouchableOpacity, useColorScheme } from "react-native";
import HapticTab from "@/components/HapticTab";
import { IconSymbol } from "@/components/ui/IconSymbol";
// import "react-native-reanimated";
import TabBarBackground from "@/components/ui/TabBarBackground";
export default function TabLayout() {
const colorScheme = useColorScheme();
const router = useRouter();
return (
<Tabs
screenOptions={{
tabBarBackground: TabBarBackground,
tabBarActiveTintColor: colorScheme === "dark" ? "white" : "black",
tabBarButton: HapticTab,
// headerShown: false,
tabBarStyle: Platform.select({
ios: {
position: "absolute",
},
default: {},
}),
}}
>
<Tabs.Screen
name="dashboard"
options={{
title: "Dashboard",
headerShown: false,
tabBarIcon: ({ color }) => (
<IconSymbol size={28} name="house.fill" color={color} />
),
}}
/>
<Tabs.Screen
name="links"
options={{
title: "Links",
headerSearchBarOptions: {
placeholder: "Search",
autoCapitalize: "none",
onChangeText: (e) => {
router.setParams({ search: e.nativeEvent.text });
},
},
tabBarIcon: ({ color }) => (
<IconSymbol size={28} name="link" color={color} />
),
}}
/>
<Tabs.Screen
name="settings"
options={{
title: "Settings",
tabBarIcon: ({ color }) => (
<IconSymbol size={28} name="gearshape.fill" color={color} />
),
}}
/>
</Tabs>
);
}

View File

@@ -0,0 +1,54 @@
import { Text, StyleSheet, TouchableOpacity } from "react-native";
import { IconSymbol } from "@/components/ui/IconSymbol";
import * as DropdownMenu from "zeego/dropdown-menu";
import { SafeAreaView } from "react-native-safe-area-context";
import { useState } from "react";
// import AddLink from "@/components/Modals/AddLink";
import ModalBase from "@/components/ModalBase";
export default function DashboardScreen() {
const [modalOpen, setModalOpen] = useState(false);
return (
<SafeAreaView className="flex-1 justify-center items-center">
<DropdownMenu.Root>
<DropdownMenu.Trigger>
<TouchableOpacity>
<IconSymbol size={20} name="plus" color={""} />
</TouchableOpacity>
</DropdownMenu.Trigger>
<DropdownMenu.Content>
<DropdownMenu.Item key="new-link" onSelect={() => setModalOpen(true)}>
<DropdownMenu.ItemTitle>New Link</DropdownMenu.ItemTitle>
</DropdownMenu.Item>
<DropdownMenu.Item
key="new-collection"
onSelect={() => alert("Item 2 selected")}
>
<DropdownMenu.ItemTitle>New Collection</DropdownMenu.ItemTitle>
</DropdownMenu.Item>
<DropdownMenu.Item
key="upload-file"
onSelect={() => alert("Item 3 selected")}
>
<DropdownMenu.ItemTitle>Upload File</DropdownMenu.ItemTitle>
</DropdownMenu.Item>
</DropdownMenu.Content>
</DropdownMenu.Root>
<Text>Dashboard</Text>
{/* <TouchableOpacity>
<IconSymbol size={20} name="plus" color={""} />
</TouchableOpacity> */}
<ModalBase
isVisible={modalOpen}
onClose={() => {
setModalOpen(false);
}}
>
<Text>Hi</Text>
</ModalBase>
{/* <AddLink isVisible={modalOpen} onClose={() => setModalOpen(false)} /> */}
</SafeAreaView>
);
}

View File

@@ -0,0 +1,61 @@
import { useLinks } from "@linkwarden/router/links";
import { View, StyleSheet, FlatList, Platform } from "react-native";
import useAuthStore from "@/store/auth";
import LinkListing from "@/components/LinkListing";
import { useLocalSearchParams } from "expo-router";
import React from "react";
import { LinkIncludingShortenedCollectionAndTags } from "@linkwarden/types";
const RenderItem = React.memo(
({ item }: { item: LinkIncludingShortenedCollectionAndTags }) => {
return <LinkListing link={item} />;
}
);
export default function LinksScreen() {
const { auth } = useAuthStore();
const { search } = useLocalSearchParams<{ search?: string }>();
const { links, data } = useLinks(
{
sort: 0,
searchQueryString: search ?? search,
},
auth
);
return (
<View style={styles.container}>
<FlatList
ListHeaderComponent={() => <></>}
data={links || []}
onRefresh={() => data.refetch()}
refreshing={data.isRefetching}
initialNumToRender={4}
keyExtractor={(item) => item.id?.toString() || ""}
renderItem={({ item }) => (
<RenderItem item={item} key={item.id?.toString()} />
)}
onEndReached={() => data.fetchNextPage()}
onEndReachedThreshold={0.5}
ItemSeparatorComponent={() => (
<View
style={{
height: 1,
backgroundColor: "#eee",
}}
/>
)}
/>
</View>
);
}
const styles = StyleSheet.create({
container: Platform.select({
ios: {
paddingBottom: 83,
},
default: {},
}),
});

View File

@@ -0,0 +1,21 @@
import useAuthStore from "@/store/auth";
import { View, Text, StyleSheet, Button } from "react-native";
export default function SettingsScreen() {
const { signOut } = useAuthStore();
return (
<View style={styles.container}>
<Text>Settings</Text>
<Button title="Sign out" onPress={() => signOut()} />
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: "center",
alignItems: "center",
},
});

View File

@@ -0,0 +1,20 @@
import { Link, Stack } from "expo-router";
import { View, StyleSheet } from "react-native";
export default function NotFoundScreen() {
return (
<>
<Stack.Screen options={{ title: "Oops! This screen doesn't exist." }} />
<View style={styles.container}>
<Link href="/">Go to home screen</Link>
</View>
</>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: "center",
alignItems: "center",
},
});

View File

@@ -0,0 +1,52 @@
import { Stack } from "expo-router";
import { QueryClient } from "@tanstack/react-query";
import { PersistQueryClientProvider } from "@tanstack/react-query-persist-client";
import { mmkvPersister } from "@/lib/queryPersister";
import { useState } from "react";
import "../styles/global.css";
const queryClient = new QueryClient({
defaultOptions: {
queries: {
staleTime: 1000 * 60 * 60 * 24, // never refetch for 24h
refetchOnMount: false,
refetchOnWindowFocus: false,
refetchOnReconnect: false,
},
},
});
export default function RootLayout() {
const [isLoading, setIsLoading] = useState(true);
return (
<PersistQueryClientProvider
client={queryClient}
persistOptions={{
persister: mmkvPersister,
maxAge: Infinity,
}}
onSuccess={() => setIsLoading(false)}
>
{!isLoading && (
<Stack
screenOptions={{
headerShown: false,
}}
>
{/* <Stack.Screen name="(tabs)" /> */}
<Stack.Screen
name="links/[id]"
options={{
headerBackTitle: "Back",
headerShown: true,
headerTitle: "",
}}
/>
<Stack.Screen name="login" />
<Stack.Screen name="+not-found" />
</Stack>
)}
</PersistQueryClientProvider>
);
}

26
apps/mobile/app/index.tsx Normal file
View File

@@ -0,0 +1,26 @@
import useAuthStore from "@/store/auth";
import { Redirect, router } from "expo-router";
import { useEffect } from "react";
import { View, Text, StyleSheet, Button } from "react-native";
export default function HomeScreen() {
const { setAuth, auth } = useAuthStore();
useEffect(() => {
setAuth();
}, []);
if (auth.session) {
return <Redirect href="/dashboard" />;
} else {
return <Redirect href="/login" />;
}
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: "center",
alignItems: "center",
},
});

View File

@@ -0,0 +1,177 @@
import React, { useEffect, useMemo, useState } from "react";
import {
View,
ActivityIndicator,
Text,
ScrollView,
TouchableOpacity,
} from "react-native";
import { WebView } from "react-native-webview";
import * as FileSystem from "expo-file-system";
import NetInfo from "@react-native-community/netinfo";
import useAuthStore from "@/store/auth";
import { useLocalSearchParams, useRouter } from "expo-router";
import { useUser } from "@linkwarden/router/user";
import { generateLinkHref } from "@linkwarden/lib/generateLinkHref";
import { useWindowDimensions } from "react-native";
import RenderHtml from "@linkwarden/react-native-render-html";
import ElementNotSupported from "@/components/ElementNotSupported";
import { decode } from "html-entities";
import { IconSymbol } from "@/components/ui/IconSymbol";
import { useLinks } from "@linkwarden/router/links";
const CACHE_DIR = FileSystem.documentDirectory + "archivedData/readable/";
const htmlPath = (id: string) => `${CACHE_DIR}link_${id}.html`;
async function ensureCacheDir() {
const info = await FileSystem.getInfoAsync(CACHE_DIR);
if (!info.exists) {
await FileSystem.makeDirectoryAsync(CACHE_DIR, { intermediates: true });
}
}
export default function LinkScreen() {
const { auth } = useAuthStore();
const { id, format } = useLocalSearchParams();
const { data: user } = useUser(auth);
const [url, setUrl] = useState<string>();
const [htmlContent, setHtmlContent] = useState<string>("");
const [isLoading, setIsLoading] = useState(true);
const { width } = useWindowDimensions();
const router = useRouter();
const { links } = useLinks(
{
sort: 0,
},
auth
);
const link = useMemo(() => {
return links?.find((link) => link.id === Number(id));
}, [links, id]);
useEffect(() => {
async function loadCacheOrFetch() {
await ensureCacheDir();
const htmlFile = htmlPath(id as string);
const [htmlInfo] = await Promise.all([FileSystem.getInfoAsync(htmlFile)]);
if (format === "3" && htmlInfo.exists) {
const rawHtml = await FileSystem.readAsStringAsync(htmlFile);
setHtmlContent(rawHtml);
setIsLoading(false);
}
const net = await NetInfo.fetch();
if (net.isConnected) {
await fetchLinkData();
}
}
if (user && user[0]?.id && !url) {
loadCacheOrFetch();
}
}, [user, url]);
async function fetchLinkData() {
if (link?.id && format === "3") {
const apiUrl = `${auth.instance}/api/v1/archives/${link.id}?format=${format}`;
setUrl(apiUrl);
try {
const response = await fetch(apiUrl, {
headers: { Authorization: `Bearer ${auth.session}` },
});
const html = (await response.json()).content;
setHtmlContent(html);
await FileSystem.writeAsStringAsync(htmlPath(id as string), html, {
encoding: FileSystem.EncodingType.UTF8,
});
} catch (e) {
console.error("Failed to fetch HTML content", e);
} finally {
setIsLoading(false);
}
} else if (link?.id && !format) {
setUrl(generateLinkHref(link, user[0], auth.instance, true));
} else if (link?.id && format) {
setUrl(`${auth.instance}/api/v1/archives/${link.id}?format=${format}`);
}
}
return (
<>
{format === "3" && htmlContent ? (
<ScrollView
className="flex-1 bg-white"
contentContainerClassName="p-4"
nestedScrollEnabled
>
<Text className="text-2xl font-bold mb-2.5">
{decode(link?.name || link?.description || link?.url || "")}
</Text>
<TouchableOpacity
className="flex-row items-center gap-1 mb-2.5 pr-5"
onPress={() => router.replace(`/links/${id}`)}
>
<IconSymbol name="link" size={16} color="gray" />
<Text className="text-base text-gray-500 flex-1" numberOfLines={1}>
{link?.url}
</Text>
</TouchableOpacity>
<View className="flex-row items-center gap-1 mb-2.5">
<IconSymbol name="calendar" size={16} color="gray" />
<Text className="text-base text-gray-500">
{new Date(
(link?.importDate || link?.createdAt) as string
).toLocaleString("en-US", {
year: "numeric",
month: "short",
day: "numeric",
})}
</Text>
</View>
<View className="border-t border-gray-200 mt-2.5 mb-5" />
<RenderHtml
contentWidth={width}
source={{ html: htmlContent }}
renderers={{
table: () => (
<ElementNotSupported
onPress={() => router.replace(`/links/${id}`)}
/>
),
}}
tagsStyles={{
p: { fontSize: 16, lineHeight: 24, marginVertical: 10 },
}}
/>
</ScrollView>
) : (
<View className="flex-1 bg-white">
{url && (
<WebView
className={isLoading ? "opacity-0" : "flex-1"}
source={{
uri: url,
headers: { Authorization: `Bearer ${auth.session}` },
}}
onLoadEnd={() => setIsLoading(false)}
/>
)}
</View>
)}
{isLoading && (
<View className="absolute inset-0 flex-1 justify-center items-center bg-white p-5">
<ActivityIndicator size="large" color="gray" />
<Text className="text-base mt-2.5 text-gray-500">Loading...</Text>
</View>
)}
</>
);
}

85
apps/mobile/app/login.tsx Normal file
View File

@@ -0,0 +1,85 @@
import useAuthStore from "@/store/auth";
import { Link } from "expo-router";
import { useState } from "react";
import {
View,
Text,
StyleSheet,
TextInput,
TouchableOpacity,
} from "react-native";
export default function HomeScreen() {
const { signIn } = useAuthStore();
const [form, setForm] = useState({
user: "",
password: "",
instance: "",
});
return (
<View style={styles.container}>
<Text>Login</Text>
<View
style={{
flexDirection: "column",
justifyContent: "space-between",
marginVertical: 10,
gap: 10,
}}
>
<TextInput
style={{
height: 40,
width: 250,
borderRadius: 5,
padding: 10,
borderColor: "gray",
borderWidth: 1,
}}
placeholder="Username"
value={form.user}
onChangeText={(text) => setForm({ ...form, user: text })}
/>
<TextInput
style={{
height: 40,
width: 250,
borderRadius: 5,
padding: 10,
borderColor: "gray",
borderWidth: 1,
}}
placeholder="Password"
secureTextEntry
value={form.password}
onChangeText={(text) => setForm({ ...form, password: text })}
/>
<TouchableOpacity
style={{
backgroundColor: "#000000",
padding: 10,
borderRadius: 5,
}}
onPress={() =>
signIn(
form.user,
form.password,
form.instance ? form.instance : undefined
)
}
>
<Text style={{ color: "#fff", textAlign: "center" }}>Login</Text>
</TouchableOpacity>
</View>
</View>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: "center",
alignItems: "center",
},
});

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View File

@@ -0,0 +1,9 @@
module.exports = function (api) {
api.cache(true);
return {
presets: [
["babel-preset-expo", { jsxImportSource: "nativewind" }],
"nativewind/babel",
],
};
};

View File

@@ -0,0 +1,18 @@
import { View, Text, Button } from "react-native";
export default function ElementNotSupported({
message = "This element is currently not supported in this view.",
buttonTitle = "Open original",
onPress,
}: {
message?: string;
buttonTitle?: string;
onPress: () => void;
}) {
return (
<View className="border-y border-gray-200 my-2 py-5 flex justify-center items-center">
<Text>{message}</Text>
<Button onPress={onPress} title={buttonTitle} />
</View>
);
}

View File

@@ -0,0 +1,18 @@
import { BottomTabBarButtonProps } from "@react-navigation/bottom-tabs";
import { PlatformPressable } from "@react-navigation/elements";
import * as Haptics from "expo-haptics";
export default function HapticTab(props: BottomTabBarButtonProps) {
return (
<PlatformPressable
{...props}
onPressIn={(ev) => {
if (process.env.EXPO_OS === "ios") {
// Add a soft haptic feedback when pressing down on the tabs.
Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light);
}
props.onPressIn?.(ev);
}}
/>
);
}

View File

@@ -0,0 +1,192 @@
import { View, Text, Image, Pressable, Platform } from "react-native";
import { decode } from "html-entities";
import { LinkIncludingShortenedCollectionAndTags } from "@linkwarden/types";
import { IconSymbol } from "@/components/ui/IconSymbol";
import { ArchivedFormat } from "@linkwarden/types";
import {
atLeastOneFormatAvailable,
formatAvailable,
} from "@linkwarden/lib/formatStats";
import useAuthStore from "@/store/auth";
import { useRouter } from "expo-router";
import * as ContextMenu from "zeego/context-menu";
type Props = {
link: LinkIncludingShortenedCollectionAndTags;
};
const LinkListing = ({ link }: Props) => {
const { auth } = useAuthStore();
const router = useRouter();
let shortendURL;
try {
if (link.url) {
shortendURL = new URL(link.url).host.toLowerCase();
}
} catch (error) {
console.log(error);
}
return (
<ContextMenu.Root
onOpenChange={() => {
/* track open/close if needed */
}}
>
<ContextMenu.Trigger asChild>
<Pressable
className={`p-5 flex-row justify-between bg-white ${
Platform.OS === "android" ? "active:bg-white" : "active:bg-gray-200"
}`}
onPress={() => router.push(`/links/${link.id}`)}
android_ripple={{ color: "#ddd", borderless: false }}
>
<View className="flex-row justify-between">
<View className="w-[70%] flex-col justify-between">
<Text numberOfLines={2} className="font-medium text-lg">
{decode(link.name || link.description || link.url)}
</Text>
{shortendURL && (
<Text numberOfLines={1} className="mt-1.5 font-light text-sm">
{shortendURL}
</Text>
)}
<View className="flex flex-row gap-1 items-center mt-1.5 pr-1.5 self-start rounded-md">
<IconSymbol
name="folder.fill"
size={16}
color={link.collection.color || ""}
/>
<Text numberOfLines={1} className="font-light text-xs">
{link.collection.name}
</Text>
</View>
</View>
<View className="flex-col items-end">
<View className="rounded-lg overflow-hidden relative">
{formatAvailable(link, "preview") ? (
<Image
source={{
uri: `${auth.instance}/api/v1/archives/${link.id}?format=${ArchivedFormat.jpeg}&preview=true&updatedAt=${link.updatedAt}`,
headers: {
Authorization: `Bearer ${auth.session}`,
},
}}
className="rounded-md h-[60px] w-[90px] object-cover scale-105"
/>
) : (
<View className="h-[60px] w-[90px]" />
)}
</View>
<View className="flex flex-row gap-1 items-center mt-5 self-start">
<IconSymbol name="calendar" size={16} color="gray" />
<Text numberOfLines={1} className="font-light text-xs">
{new Date(link.createdAt as string).toLocaleString("en-US", {
year: "numeric",
month: "short",
day: "numeric",
})}
</Text>
</View>
</View>
</View>
</Pressable>
</ContextMenu.Trigger>
<ContextMenu.Content avoidCollisions>
<ContextMenu.Item
key="open-link"
onSelect={() => router.push(`/links/${link.id}`)}
>
<ContextMenu.ItemTitle>Open Link</ContextMenu.ItemTitle>
</ContextMenu.Item>
{link.url && atLeastOneFormatAvailable(link) && (
<ContextMenu.Sub>
<ContextMenu.SubTrigger key="preserved-formats">
<ContextMenu.ItemTitle>Preserved Formats</ContextMenu.ItemTitle>
</ContextMenu.SubTrigger>
<ContextMenu.SubContent>
{formatAvailable(link, "monolith") && (
<ContextMenu.Item
key="preserved-formats-webpage"
onSelect={() =>
router.push(
`/links/${link.id}?format=${ArchivedFormat.monolith}`
)
}
>
<ContextMenu.ItemTitle>Webpage</ContextMenu.ItemTitle>
</ContextMenu.Item>
)}
{formatAvailable(link, "image") && (
<ContextMenu.Item
key="preserved-formats-screenshot"
onSelect={() =>
router.push(
`/links/${link.id}?format=${
link.image?.endsWith(".png")
? ArchivedFormat.png
: ArchivedFormat.jpeg
}`
)
}
>
<ContextMenu.ItemTitle>Screenshot</ContextMenu.ItemTitle>
</ContextMenu.Item>
)}
{formatAvailable(link, "pdf") && (
<ContextMenu.Item
key="preserved-formats-pdf"
onSelect={() =>
router.push(
`/links/${link.id}?format=${ArchivedFormat.pdf}`
)
}
>
<ContextMenu.ItemTitle>PDF</ContextMenu.ItemTitle>
</ContextMenu.Item>
)}
{formatAvailable(link, "readable") && (
<ContextMenu.Item
key="preserved-formats-readable"
onSelect={() =>
router.push(
`/links/${link.id}?format=${ArchivedFormat.readability}`
)
}
>
<ContextMenu.ItemTitle>Readable</ContextMenu.ItemTitle>
</ContextMenu.Item>
)}
</ContextMenu.SubContent>
</ContextMenu.Sub>
)}
<ContextMenu.Item
key="copy-url"
onSelect={() => {
/* copy URL */
}}
>
<ContextMenu.ItemTitle>Copy URL</ContextMenu.ItemTitle>
</ContextMenu.Item>
<ContextMenu.Item
key="delete-link"
onSelect={() => {
/* delete link */
}}
>
<ContextMenu.ItemTitle>Delete</ContextMenu.ItemTitle>
</ContextMenu.Item>
</ContextMenu.Content>
</ContextMenu.Root>
);
};
export default LinkListing;

View File

@@ -0,0 +1,32 @@
import { Modal, View, Text, TouchableOpacity, Platform } from "react-native";
import { PropsWithChildren } from "react";
import { IconSymbol } from "./ui/IconSymbol";
type Props = PropsWithChildren<{
isVisible: boolean;
onClose: () => void;
children?: React.ReactNode;
}>;
export default function ModalBase({ isVisible, children, onClose }: Props) {
return (
<Modal
animationType="slide"
visible={isVisible}
onRequestClose={onClose}
transparent={false}
presentationStyle={Platform.OS === "ios" ? "formSheet" : "overFullScreen"}
>
<TouchableOpacity onPress={onClose} className="absolute top-5 right-5">
<IconSymbol name="xmark" size={16} color="" />
</TouchableOpacity>
{/* Overlay */}
<View className="flex-1 justify-center items-center">
{/* Modal content */}
<View className="bg-white rounded-2xl p-8 mx-5 items-center shadow-lg w-full">
{children}
</View>
</View>
</Modal>
);
}

View File

@@ -0,0 +1,17 @@
import { PropsWithChildren } from "react";
import { IconSymbol } from "../ui/IconSymbol";
import ModalBase from "../ModalBase";
import { Text } from "react-native";
type Props = PropsWithChildren<{
isVisible: boolean;
onClose: () => void;
}>;
export default function AddLink({ isVisible, onClose }: Props) {
return (
// <ModalBase isVisible={isVisible} onClose={onClose}>
<Text>Hi</Text>
// </ModalBase>
);
}

View File

@@ -0,0 +1,32 @@
import { SymbolView, SymbolViewProps, SymbolWeight } from "expo-symbols";
import { StyleProp, ViewStyle } from "react-native";
export function IconSymbol({
name,
size = 24,
color,
style,
weight = "regular",
}: {
name: SymbolViewProps["name"];
size?: number;
color: string;
style?: StyleProp<ViewStyle>;
weight?: SymbolWeight;
}) {
return (
<SymbolView
weight={weight}
tintColor={color}
resizeMode="scaleAspectFit"
name={name}
style={[
{
width: size,
height: size,
},
style,
]}
/>
);
}

View File

@@ -0,0 +1,50 @@
// This file is a fallback for using MaterialIcons on Android and web.
import MaterialIcons from "@expo/vector-icons/MaterialIcons";
import { SymbolWeight } from "expo-symbols";
import React from "react";
import { OpaqueColorValue, StyleProp, TextStyle } from "react-native";
// Add your SFSymbol to MaterialIcons mappings here.
const MAPPING = {
// See MaterialIcons here: https://icons.expo.fyi
// See SF Symbols in the SF Symbols app on Mac.
"house.fill": "home",
"paperplane.fill": "send",
"chevron.left.forwardslash.chevron.right": "code",
"chevron.right": "chevron-right",
} as Partial<
Record<
import("expo-symbols").SymbolViewProps["name"],
React.ComponentProps<typeof MaterialIcons>["name"]
>
>;
export type IconSymbolName = keyof typeof MAPPING;
/**
* An icon component that uses native SFSymbols on iOS, and MaterialIcons on Android and web. This ensures a consistent look across platforms, and optimal resource usage.
*
* Icon `name`s are based on SFSymbols and require manual mapping to MaterialIcons.
*/
export function IconSymbol({
name,
size = 24,
color,
style,
}: {
name: IconSymbolName;
size?: number;
color: string | OpaqueColorValue;
style?: StyleProp<TextStyle>;
weight?: SymbolWeight;
}) {
return (
<MaterialIcons
color={color}
size={size}
name={MAPPING[name]}
style={style}
/>
);
}

View File

@@ -0,0 +1,22 @@
import { useBottomTabBarHeight } from "@react-navigation/bottom-tabs";
import { BlurView } from "expo-blur";
import { StyleSheet } from "react-native";
import { useSafeAreaInsets } from "react-native-safe-area-context";
export default function BlurTabBarBackground() {
return (
<BlurView
// System chrome material automatically adapts to the system's theme
// and matches the native tab bar appearance on iOS.
tint="systemChromeMaterial"
intensity={100}
style={StyleSheet.absoluteFill}
/>
);
}
export function useBottomTabOverflow() {
const tabHeight = useBottomTabBarHeight();
const { bottom } = useSafeAreaInsets();
return tabHeight - bottom;
}

View File

@@ -0,0 +1,6 @@
// This is a shim for web and Android where the tab bar is generally opaque.
export default undefined;
export function useBottomTabOverflow() {
return 0;
}

30
apps/mobile/ios/.gitignore vendored Normal file
View File

@@ -0,0 +1,30 @@
# OSX
#
.DS_Store
# Xcode
#
build/
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata
*.xccheckout
*.moved-aside
DerivedData
*.hmap
*.ipa
*.xcuserstate
project.xcworkspace
.xcode.env.local
# Bundle artifacts
*.jsbundle
# CocoaPods
/Pods/

View File

@@ -0,0 +1,11 @@
# This `.xcode.env` file is versioned and is used to source the environment
# used when running script phases inside Xcode.
# To customize your local environment, you can create an `.xcode.env.local`
# file that is not versioned.
# NODE_BINARY variable contains the PATH to the node executable.
#
# Customize the NODE_BINARY variable here.
# For example, to use nvm with brew, add the following line
# . "$(brew --prefix nvm)/nvm.sh" --no-use
export NODE_BINARY=$(command -v node)

66
apps/mobile/ios/Podfile Normal file
View File

@@ -0,0 +1,66 @@
require File.join(File.dirname(`node --print "require.resolve('expo/package.json')"`), "scripts/autolinking")
require File.join(File.dirname(`node --print "require.resolve('react-native/package.json')"`), "scripts/react_native_pods")
require 'json'
podfile_properties = JSON.parse(File.read(File.join(__dir__, 'Podfile.properties.json'))) rescue {}
ENV['RCT_NEW_ARCH_ENABLED'] = podfile_properties['newArchEnabled'] == 'true' ? '1' : '0'
ENV['EX_DEV_CLIENT_NETWORK_INSPECTOR'] = podfile_properties['EX_DEV_CLIENT_NETWORK_INSPECTOR']
platform :ios, podfile_properties['ios.deploymentTarget'] || '15.1'
install! 'cocoapods',
:deterministic_uuids => false
prepare_react_native_project!
target 'mobileapp' do
use_expo_modules!
if ENV['EXPO_USE_COMMUNITY_AUTOLINKING'] == '1'
config_command = ['node', '-e', "process.argv=['', '', 'config'];require('@react-native-community/cli').run()"];
else
config_command = [
'node',
'--no-warnings',
'--eval',
'require(require.resolve(\'expo-modules-autolinking\', { paths: [require.resolve(\'expo/package.json\')] }))(process.argv.slice(1))',
'react-native-config',
'--json',
'--platform',
'ios'
]
end
config = use_native_modules!(config_command)
use_frameworks! :linkage => podfile_properties['ios.useFrameworks'].to_sym if podfile_properties['ios.useFrameworks']
use_frameworks! :linkage => ENV['USE_FRAMEWORKS'].to_sym if ENV['USE_FRAMEWORKS']
use_react_native!(
:path => config[:reactNativePath],
:hermes_enabled => podfile_properties['expo.jsEngine'] == nil || podfile_properties['expo.jsEngine'] == 'hermes',
# An absolute path to your application root.
:app_path => "#{Pod::Config.instance.installation_root}/..",
:privacy_file_aggregation_enabled => podfile_properties['apple.privacyManifestAggregationEnabled'] != 'false',
)
post_install do |installer|
react_native_post_install(
installer,
config[:reactNativePath],
:mac_catalyst_enabled => false,
:ccache_enabled => podfile_properties['apple.ccacheEnabled'] == 'true',
)
# This is necessary for Xcode 14, because it signs resource bundles by default
# when building for devices.
installer.target_installation_results.pod_target_installation_results
.each do |pod_name, target_installation_result|
target_installation_result.resource_bundle_targets.each do |resource_bundle_target|
resource_bundle_target.build_configurations.each do |config|
config.build_settings['CODE_SIGNING_ALLOWED'] = 'NO'
end
end
end
end
end

2577
apps/mobile/ios/Podfile.lock Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,5 @@
{
"expo.jsEngine": "hermes",
"EX_DEV_CLIENT_NETWORK_INSPECTOR": "true",
"newArchEnabled": "true"
}

View File

@@ -0,0 +1,544 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.mm */; };
13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
3E461D99554A48A4959DE609 /* SplashScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */; };
96905EF65AED1B983A6B3ABC /* libPods-mobileapp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 58EEBF8E8E6FB1BC6CAF49B5 /* libPods-mobileapp.a */; };
98F5742C729033F29C656840 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = E49C0DC702346D367B33AAEF /* PrivacyInfo.xcprivacy */; };
B18059E884C0ABDD17F3DC3D /* ExpoModulesProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */; };
BB2F792D24A3F905000567C9 /* Expo.plist in Resources */ = {isa = PBXBuildFile; fileRef = BB2F792C24A3F905000567C9 /* Expo.plist */; };
DD111B9AA6FE4075B8E1E6D2 /* noop-file.swift in Sources */ = {isa = PBXBuildFile; fileRef = 588141A975DE4C1BBF1048E5 /* noop-file.swift */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
13B07F961A680F5B00A75B9A /* mobileapp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = mobileapp.app; sourceTree = BUILT_PRODUCTS_DIR; };
13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = mobileapp/AppDelegate.h; sourceTree = "<group>"; };
13B07FB01A68108700A75B9A /* AppDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = AppDelegate.mm; path = mobileapp/AppDelegate.mm; sourceTree = "<group>"; };
13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = mobileapp/Images.xcassets; sourceTree = "<group>"; };
13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = mobileapp/Info.plist; sourceTree = "<group>"; };
13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = mobileapp/main.m; sourceTree = "<group>"; };
51E9021565CB454F93B79E34 /* mobileapp-Bridging-Header.h */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.c.h; name = "mobileapp-Bridging-Header.h"; path = "mobileapp/mobileapp-Bridging-Header.h"; sourceTree = "<group>"; };
588141A975DE4C1BBF1048E5 /* noop-file.swift */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 4; includeInIndex = 0; lastKnownFileType = sourcecode.swift; name = "noop-file.swift"; path = "mobileapp/noop-file.swift"; sourceTree = "<group>"; };
58EEBF8E8E6FB1BC6CAF49B5 /* libPods-mobileapp.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-mobileapp.a"; sourceTree = BUILT_PRODUCTS_DIR; };
6C2E3173556A471DD304B334 /* Pods-mobileapp.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-mobileapp.debug.xcconfig"; path = "Target Support Files/Pods-mobileapp/Pods-mobileapp.debug.xcconfig"; sourceTree = "<group>"; };
7A4D352CD337FB3A3BF06240 /* Pods-mobileapp.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-mobileapp.release.xcconfig"; path = "Target Support Files/Pods-mobileapp/Pods-mobileapp.release.xcconfig"; sourceTree = "<group>"; };
AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = SplashScreen.storyboard; path = mobileapp/SplashScreen.storyboard; sourceTree = "<group>"; };
BB2F792C24A3F905000567C9 /* Expo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Expo.plist; sourceTree = "<group>"; };
E49C0DC702346D367B33AAEF /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; includeInIndex = 1; name = PrivacyInfo.xcprivacy; path = mobileapp/PrivacyInfo.xcprivacy; sourceTree = "<group>"; };
ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; };
FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ExpoModulesProvider.swift; path = "Pods/Target Support Files/Pods-mobileapp/ExpoModulesProvider.swift"; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
13B07F8C1A680F5B00A75B9A /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
96905EF65AED1B983A6B3ABC /* libPods-mobileapp.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
13B07FAE1A68108700A75B9A /* mobileapp */ = {
isa = PBXGroup;
children = (
BB2F792B24A3F905000567C9 /* Supporting */,
13B07FAF1A68108700A75B9A /* AppDelegate.h */,
13B07FB01A68108700A75B9A /* AppDelegate.mm */,
13B07FB51A68108700A75B9A /* Images.xcassets */,
13B07FB61A68108700A75B9A /* Info.plist */,
13B07FB71A68108700A75B9A /* main.m */,
AA286B85B6C04FC6940260E9 /* SplashScreen.storyboard */,
588141A975DE4C1BBF1048E5 /* noop-file.swift */,
51E9021565CB454F93B79E34 /* mobileapp-Bridging-Header.h */,
E49C0DC702346D367B33AAEF /* PrivacyInfo.xcprivacy */,
);
name = mobileapp;
sourceTree = "<group>";
};
2D16E6871FA4F8E400B85C8A /* Frameworks */ = {
isa = PBXGroup;
children = (
ED297162215061F000B7C4FE /* JavaScriptCore.framework */,
58EEBF8E8E6FB1BC6CAF49B5 /* libPods-mobileapp.a */,
);
name = Frameworks;
sourceTree = "<group>";
};
832341AE1AAA6A7D00B99B32 /* Libraries */ = {
isa = PBXGroup;
children = (
);
name = Libraries;
sourceTree = "<group>";
};
83CBB9F61A601CBA00E9B192 = {
isa = PBXGroup;
children = (
13B07FAE1A68108700A75B9A /* mobileapp */,
832341AE1AAA6A7D00B99B32 /* Libraries */,
83CBBA001A601CBA00E9B192 /* Products */,
2D16E6871FA4F8E400B85C8A /* Frameworks */,
D65327D7A22EEC0BE12398D9 /* Pods */,
D7E4C46ADA2E9064B798F356 /* ExpoModulesProviders */,
);
indentWidth = 2;
sourceTree = "<group>";
tabWidth = 2;
usesTabs = 0;
};
83CBBA001A601CBA00E9B192 /* Products */ = {
isa = PBXGroup;
children = (
13B07F961A680F5B00A75B9A /* mobileapp.app */,
);
name = Products;
sourceTree = "<group>";
};
92DBD88DE9BF7D494EA9DA96 /* mobileapp */ = {
isa = PBXGroup;
children = (
FAC715A2D49A985799AEE119 /* ExpoModulesProvider.swift */,
);
name = mobileapp;
sourceTree = "<group>";
};
BB2F792B24A3F905000567C9 /* Supporting */ = {
isa = PBXGroup;
children = (
BB2F792C24A3F905000567C9 /* Expo.plist */,
);
name = Supporting;
path = mobileapp/Supporting;
sourceTree = "<group>";
};
D65327D7A22EEC0BE12398D9 /* Pods */ = {
isa = PBXGroup;
children = (
6C2E3173556A471DD304B334 /* Pods-mobileapp.debug.xcconfig */,
7A4D352CD337FB3A3BF06240 /* Pods-mobileapp.release.xcconfig */,
);
path = Pods;
sourceTree = "<group>";
};
D7E4C46ADA2E9064B798F356 /* ExpoModulesProviders */ = {
isa = PBXGroup;
children = (
92DBD88DE9BF7D494EA9DA96 /* mobileapp */,
);
name = ExpoModulesProviders;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
13B07F861A680F5B00A75B9A /* mobileapp */ = {
isa = PBXNativeTarget;
buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "mobileapp" */;
buildPhases = (
08A4A3CD28434E44B6B9DE2E /* [CP] Check Pods Manifest.lock */,
33C9CB6682BF7BB3053F48FC /* [Expo] Configure project */,
13B07F871A680F5B00A75B9A /* Sources */,
13B07F8C1A680F5B00A75B9A /* Frameworks */,
13B07F8E1A680F5B00A75B9A /* Resources */,
00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */,
800E24972A6A228C8D4807E9 /* [CP] Copy Pods Resources */,
3C1F4EFB27CCA985BA2789D2 /* [CP] Embed Pods Frameworks */,
);
buildRules = (
);
dependencies = (
);
name = mobileapp;
productName = mobileapp;
productReference = 13B07F961A680F5B00A75B9A /* mobileapp.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
83CBB9F71A601CBA00E9B192 /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 1130;
TargetAttributes = {
13B07F861A680F5B00A75B9A = {
LastSwiftMigration = 1250;
};
};
};
buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "mobileapp" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = 83CBB9F61A601CBA00E9B192;
productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
13B07F861A680F5B00A75B9A /* mobileapp */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
13B07F8E1A680F5B00A75B9A /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
BB2F792D24A3F905000567C9 /* Expo.plist in Resources */,
13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */,
3E461D99554A48A4959DE609 /* SplashScreen.storyboard in Resources */,
98F5742C729033F29C656840 /* PrivacyInfo.xcprivacy in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "Bundle React Native code and images";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "if [[ -f \"$PODS_ROOT/../.xcode.env\" ]]; then\n source \"$PODS_ROOT/../.xcode.env\"\nfi\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.local\"\nfi\n\n# The project root by default is one level up from the ios directory\nexport PROJECT_ROOT=\"$PROJECT_DIR\"/..\n\nif [[ \"$CONFIGURATION\" = *Debug* ]]; then\n export SKIP_BUNDLING=1\nfi\nif [[ -z \"$ENTRY_FILE\" ]]; then\n # Set the entry JS file using the bundler's entry resolution.\n export ENTRY_FILE=\"$(\"$NODE_BINARY\" -e \"require('expo/scripts/resolveAppEntry')\" \"$PROJECT_ROOT\" ios absolute | tail -n 1)\"\nfi\n\nif [[ -z \"$CLI_PATH\" ]]; then\n # Use Expo CLI\n export CLI_PATH=\"$(\"$NODE_BINARY\" --print \"require.resolve('@expo/cli', { paths: [require.resolve('expo/package.json')] })\")\"\nfi\nif [[ -z \"$BUNDLE_COMMAND\" ]]; then\n # Default Expo CLI command for bundling\n export BUNDLE_COMMAND=\"export:embed\"\nfi\n\n# Source .xcode.env.updates if it exists to allow\n# SKIP_BUNDLING to be unset if needed\nif [[ -f \"$PODS_ROOT/../.xcode.env.updates\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.updates\"\nfi\n# Source local changes to allow overrides\n# if needed\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.local\"\nfi\n\n`\"$NODE_BINARY\" --print \"require('path').dirname(require.resolve('react-native/package.json')) + '/scripts/react-native-xcode.sh'\"`\n\n";
};
08A4A3CD28434E44B6B9DE2E /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-mobileapp-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
33C9CB6682BF7BB3053F48FC /* [Expo] Configure project */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
);
name = "[Expo] Configure project";
outputFileListPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "# This script configures Expo modules and generates the modules provider file.\nbash -l -c \"./Pods/Target\\ Support\\ Files/Pods-mobileapp/expo-configure-project.sh\"\n";
};
3C1F4EFB27CCA985BA2789D2 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-mobileapp/Pods-mobileapp-frameworks.sh",
"${PODS_XCFRAMEWORKS_BUILD_DIR}/hermes-engine/Pre-built/hermes.framework/hermes",
);
name = "[CP] Embed Pods Frameworks";
outputPaths = (
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-mobileapp/Pods-mobileapp-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
800E24972A6A228C8D4807E9 /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-mobileapp/Pods-mobileapp-resources.sh",
"${PODS_CONFIGURATION_BUILD_DIR}/EXConstants/EXConstants.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/EXConstants/ExpoConstants_privacy.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/ExpoFileSystem/ExpoFileSystem_privacy.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/ExpoSystemUI/ExpoSystemUI_privacy.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/RCT-Folly/RCT-Folly_privacy.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/React-Core/React-Core_privacy.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/React-cxxreact/React-cxxreact_privacy.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/boost/boost_privacy.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/expo-dev-launcher/EXDevLauncher.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/expo-dev-menu/EXDevMenu.bundle",
"${PODS_CONFIGURATION_BUILD_DIR}/glog/glog_privacy.bundle",
);
name = "[CP] Copy Pods Resources";
outputPaths = (
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EXConstants.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoConstants_privacy.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoFileSystem_privacy.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/ExpoSystemUI_privacy.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/RCT-Folly_privacy.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/React-Core_privacy.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/React-cxxreact_privacy.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/boost_privacy.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EXDevLauncher.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EXDevMenu.bundle",
"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/glog_privacy.bundle",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-mobileapp/Pods-mobileapp-resources.sh\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
13B07F871A680F5B00A75B9A /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
13B07FBC1A68108700A75B9A /* AppDelegate.mm in Sources */,
13B07FC11A68108700A75B9A /* main.m in Sources */,
B18059E884C0ABDD17F3DC3D /* ExpoModulesProvider.swift in Sources */,
DD111B9AA6FE4075B8E1E6D2 /* noop-file.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin XCBuildConfiguration section */
13B07F941A680F5B00A75B9A /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 6C2E3173556A471DD304B334 /* Pods-mobileapp.debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = mobileapp/mobileapp.entitlements;
CURRENT_PROJECT_VERSION = 1;
ENABLE_BITCODE = NO;
GCC_PREPROCESSOR_DEFINITIONS = (
"$(inherited)",
"FB_SONARKIT_ENABLED=1",
);
INFOPLIST_FILE = mobileapp/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 15.1;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
MARKETING_VERSION = 1.0;
OTHER_LDFLAGS = (
"$(inherited)",
"-ObjC",
"-lc++",
);
OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_DEBUG";
PRODUCT_BUNDLE_IDENTIFIER = "com.anonymous.mobile-app";
PRODUCT_NAME = mobileapp;
SWIFT_OBJC_BRIDGING_HEADER = "mobileapp/mobileapp-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
VERSIONING_SYSTEM = "apple-generic";
};
name = Debug;
};
13B07F951A680F5B00A75B9A /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7A4D352CD337FB3A3BF06240 /* Pods-mobileapp.release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_ENTITLEMENTS = mobileapp/mobileapp.entitlements;
CURRENT_PROJECT_VERSION = 1;
INFOPLIST_FILE = mobileapp/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 15.1;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
MARKETING_VERSION = 1.0;
OTHER_LDFLAGS = (
"$(inherited)",
"-ObjC",
"-lc++",
);
OTHER_SWIFT_FLAGS = "$(inherited) -D EXPO_CONFIGURATION_RELEASE";
PRODUCT_BUNDLE_IDENTIFIER = "com.anonymous.mobile-app";
PRODUCT_NAME = mobileapp;
SWIFT_OBJC_BRIDGING_HEADER = "mobileapp/mobileapp-Bridging-Header.h";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
VERSIONING_SYSTEM = "apple-generic";
};
name = Release;
};
83CBBA201A601CBA00E9B192 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_CXX_LANGUAGE_STANDARD = "c++20";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 15.1;
LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)";
LIBRARY_SEARCH_PATHS = "$(SDKROOT)/usr/lib/swift\"$(inherited)\"";
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
OTHER_LDFLAGS = (
"$(inherited)",
" ",
);
REACT_NATIVE_PATH = "${PODS_ROOT}/../../../../node_modules/react-native";
SDKROOT = iphoneos;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG";
USE_HERMES = true;
};
name = Debug;
};
83CBBA211A601CBA00E9B192 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_CXX_LANGUAGE_STANDARD = "c++20";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = YES;
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 15.1;
LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)";
LIBRARY_SEARCH_PATHS = "$(SDKROOT)/usr/lib/swift\"$(inherited)\"";
MTL_ENABLE_DEBUG_INFO = NO;
OTHER_LDFLAGS = (
"$(inherited)",
" ",
);
REACT_NATIVE_PATH = "${PODS_ROOT}/../../../../node_modules/react-native";
SDKROOT = iphoneos;
USE_HERMES = true;
VALIDATE_PRODUCT = YES;
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "mobileapp" */ = {
isa = XCConfigurationList;
buildConfigurations = (
13B07F941A680F5B00A75B9A /* Debug */,
13B07F951A680F5B00A75B9A /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "mobileapp" */ = {
isa = XCConfigurationList;
buildConfigurations = (
83CBBA201A601CBA00E9B192 /* Debug */,
83CBBA211A601CBA00E9B192 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */;
}

View File

@@ -0,0 +1,88 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1130"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "13B07F861A680F5B00A75B9A"
BuildableName = "mobileapp.app"
BlueprintName = "mobileapp"
ReferencedContainer = "container:mobileapp.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<Testables>
<TestableReference
skipped = "NO">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "00E356ED1AD99517003FC87E"
BuildableName = "mobileappTests.xctest"
BlueprintName = "mobileappTests"
ReferencedContainer = "container:mobileapp.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "13B07F861A680F5B00A75B9A"
BuildableName = "mobileapp.app"
BlueprintName = "mobileapp"
ReferencedContainer = "container:mobileapp.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "13B07F861A680F5B00A75B9A"
BuildableName = "mobileapp.app"
BlueprintName = "mobileapp"
ReferencedContainer = "container:mobileapp.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:mobileapp.xcodeproj">
</FileRef>
<FileRef
location = "group:Pods/Pods.xcodeproj">
</FileRef>
</Workspace>

View File

@@ -0,0 +1,7 @@
#import <RCTAppDelegate.h>
#import <UIKit/UIKit.h>
#import <Expo/Expo.h>
@interface AppDelegate : EXAppDelegateWrapper
@end

View File

@@ -0,0 +1,62 @@
#import "AppDelegate.h"
#import <React/RCTBundleURLProvider.h>
#import <React/RCTLinkingManager.h>
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.moduleName = @"main";
// You can add your custom initial props in the dictionary below.
// They will be passed down to the ViewController used by React Native.
self.initialProps = @{};
return [super application:application didFinishLaunchingWithOptions:launchOptions];
}
- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
{
return [self bundleURL];
}
- (NSURL *)bundleURL
{
#if DEBUG
return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@".expo/.virtual-metro-entry"];
#else
return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
#endif
}
// Linking API
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
return [super application:application openURL:url options:options] || [RCTLinkingManager application:application openURL:url options:options];
}
// Universal Links
- (BOOL)application:(UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity restorationHandler:(nonnull void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler {
BOOL result = [RCTLinkingManager application:application continueUserActivity:userActivity restorationHandler:restorationHandler];
return [super application:application continueUserActivity:userActivity restorationHandler:restorationHandler] || result;
}
// Explicitly define remote notification delegates to ensure compatibility with some third-party libraries
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
return [super application:application didRegisterForRemoteNotificationsWithDeviceToken:deviceToken];
}
// Explicitly define remote notification delegates to ensure compatibility with some third-party libraries
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
{
return [super application:application didFailToRegisterForRemoteNotificationsWithError:error];
}
// Explicitly define remote notification delegates to ensure compatibility with some third-party libraries
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
return [super application:application didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler];
}
@end

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

View File

@@ -0,0 +1,14 @@
{
"images": [
{
"filename": "App-Icon-1024x1024@1x.png",
"idiom": "universal",
"platform": "ios",
"size": "1024x1024"
}
],
"info": {
"version": 1,
"author": "expo"
}
}

View File

@@ -0,0 +1,6 @@
{
"info" : {
"version" : 1,
"author" : "expo"
}
}

View File

@@ -0,0 +1,20 @@
{
"colors": [
{
"color": {
"components": {
"alpha": "1.000",
"blue": "1.00000000000000",
"green": "1.00000000000000",
"red": "1.00000000000000"
},
"color-space": "srgb"
},
"idiom": "universal"
}
],
"info": {
"version": 1,
"author": "expo"
}
}

View File

@@ -0,0 +1,23 @@
{
"images": [
{
"idiom": "universal",
"filename": "image.png",
"scale": "1x"
},
{
"idiom": "universal",
"filename": "image@2x.png",
"scale": "2x"
},
{
"idiom": "universal",
"filename": "image@3x.png",
"scale": "3x"
}
],
"info": {
"version": 1,
"author": "expo"
}
}

Some files were not shown because too many files have changed in this diff Show More