├── .node-version ├── .eslintignore ├── .gitattributes ├── ios ├── rn3 │ ├── de.lproj │ │ └── BootSplash.strings │ ├── en.lproj │ │ └── BootSplash.strings │ ├── es.lproj │ │ └── BootSplash.strings │ ├── fi.lproj │ │ └── BootSplash.strings │ ├── fr.lproj │ │ └── BootSplash.strings │ ├── hi.lproj │ │ └── BootSplash.strings │ ├── it.lproj │ │ └── BootSplash.strings │ ├── ja.lproj │ │ └── BootSplash.strings │ ├── ko-KR.lproj │ │ └── BootSplash.strings │ ├── nl.lproj │ │ └── BootSplash.strings │ ├── pl.lproj │ │ └── BootSplash.strings │ ├── pt-BR.lproj │ │ └── BootSplash.strings │ ├── ru.lproj │ │ └── BootSplash.strings │ ├── sv.lproj │ │ └── BootSplash.strings │ ├── tr.lproj │ │ └── BootSplash.strings │ ├── zh-Hans.lproj │ │ └── BootSplash.strings │ ├── zh-Hant.lproj │ │ └── BootSplash.strings │ ├── Images.xcassets │ │ ├── Contents.json │ │ ├── AppIcon.appiconset │ │ │ ├── ios20.png │ │ │ ├── ios29.png │ │ │ ├── ios40.png │ │ │ ├── ios50.png │ │ │ ├── ios57.png │ │ │ ├── ios58.png │ │ │ ├── ios60.png │ │ │ ├── ios72.png │ │ │ ├── ios76.png │ │ │ ├── ios80.png │ │ │ ├── ios87.png │ │ │ ├── ios100.png │ │ │ ├── ios1024.png │ │ │ ├── ios114.png │ │ │ ├── ios120.png │ │ │ ├── ios144.png │ │ │ ├── ios152.png │ │ │ ├── ios167.png │ │ │ └── ios180.png │ │ ├── background.imageset │ │ │ ├── black.png │ │ │ ├── white.png │ │ │ └── Contents.json │ │ ├── backButton.imageset │ │ │ ├── backButton.pdf │ │ │ └── Contents.json │ │ └── splashLogo.imageset │ │ │ ├── splash-logo-dark.pdf │ │ │ ├── splash-logo-light.pdf │ │ │ └── Contents.json │ ├── AppDelegate.h │ ├── main.m │ └── rn3.entitlements ├── Config.xcconfig ├── Modules │ ├── NativeBridge.h │ ├── iPadDropView.h │ ├── iPadDragView.h │ ├── iPadDragViewManager.h │ ├── iPadDropViewManager.h │ ├── iPadDragItem.h │ ├── iPadDropViewManager.m │ ├── NativeBridge.m │ └── iPadDragItem.m ├── File.swift ├── rn3-Bridging-Header.h ├── extension-Bridging-Header.h ├── extension │ ├── ShareViewController.h │ └── extension.entitlements ├── rn3.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── safari-extension │ ├── SafariWebExtensionHandler.h │ ├── Info.plist │ └── SafariWebExtensionHandler.m └── .xcode.env ├── src ├── data │ ├── TODO.md │ ├── reducers │ │ ├── notes.md │ │ ├── index.js │ │ ├── tags │ │ │ ├── recent.js │ │ │ └── index.js │ │ ├── bookmarks │ │ │ ├── html.js │ │ │ └── recent.js │ │ └── collections │ │ │ └── defaults.js │ ├── constants │ │ ├── rate.js │ │ ├── config.js │ │ ├── covers.js │ │ ├── backups.js │ │ ├── filters.js │ │ ├── predictions.js │ │ ├── import.js │ │ ├── app.js │ │ └── tags.js │ ├── selectors │ │ ├── filters │ │ │ ├── index.js │ │ │ ├── items.js │ │ │ └── search.js │ │ ├── oauth │ │ │ ├── index.js │ │ │ ├── connections.js │ │ │ └── my.js │ │ ├── tags │ │ │ ├── index.js │ │ │ ├── items.js │ │ │ └── search.js │ │ ├── search │ │ │ ├── index.js │ │ │ └── recent.js │ │ ├── bookmarks │ │ │ ├── index.js │ │ │ ├── html.js │ │ │ └── draft.js │ │ └── collections │ │ │ ├── index.js │ │ │ ├── groups.js │ │ │ ├── selectMode.js │ │ │ ├── drafts.js │ │ │ └── sharing.js │ ├── helpers │ │ ├── filters │ │ │ ├── index.js │ │ │ └── blankSpace.js │ │ ├── oauth │ │ │ ├── index.js │ │ │ ├── blankClient.js │ │ │ └── normalizeClient.js │ │ ├── tags │ │ │ ├── index.js │ │ │ ├── normalizeTags.js │ │ │ ├── normalizeTag.js │ │ │ └── blankSpace.js │ │ ├── defaults.js │ │ ├── bookmarks │ │ │ ├── queryIsEqual.js │ │ │ ├── normalizeRecentSearch.js │ │ │ ├── getUrl.js │ │ │ └── blankSpace.js │ │ └── user.js │ ├── actions │ │ ├── backups.js │ │ ├── covers.js │ │ ├── bookmarks │ │ │ ├── recent.js │ │ │ ├── html.js │ │ │ ├── index.js │ │ │ ├── highlights.js │ │ │ └── draft.js │ │ ├── filters.js │ │ ├── rate.js │ │ ├── predictions.js │ │ ├── config.js │ │ ├── tags.js │ │ └── import.js │ ├── modules │ │ ├── format │ │ │ ├── domain.js │ │ │ ├── cache_url.js │ │ │ ├── favicon.js │ │ │ ├── iframeable_url.js │ │ │ ├── screenshot.js │ │ │ ├── url.js │ │ │ └── thumb.js │ │ ├── user │ │ │ └── isPro.js │ │ └── error.js │ ├── utils │ │ ├── wrapFunc.js │ │ └── authStatus.js │ ├── README.md │ └── sagas │ │ ├── tags │ │ ├── index.js │ │ └── items.js │ │ ├── collections │ │ └── index.js │ │ ├── bookmarks │ │ ├── index.js │ │ └── html.js │ │ ├── backups.js │ │ └── covers.js ├── screens │ ├── tag │ │ ├── index.js │ │ └── edit │ │ │ └── form.js │ ├── settings │ │ ├── pro │ │ │ ├── purchase │ │ │ │ ├── skus.js │ │ │ │ └── style.js │ │ │ ├── index.js │ │ │ └── item.js │ │ ├── files │ │ │ ├── assets │ │ │ │ ├── empty.png │ │ │ │ ├── empty@2x.png │ │ │ │ └── empty@3x.png │ │ │ ├── style.js │ │ │ └── item.js │ │ ├── appearance │ │ │ ├── themes.js │ │ │ └── item.js │ │ ├── share_extension │ │ │ ├── options.js │ │ │ └── item.js │ │ ├── profile │ │ │ ├── index.js │ │ │ └── item.js │ │ ├── backups │ │ │ ├── index.js │ │ │ └── item.js │ │ ├── index.js │ │ ├── logout │ │ │ └── item.js │ │ ├── support │ │ │ └── item.js │ │ ├── help │ │ │ └── item.js │ │ ├── better │ │ │ └── item.js │ │ ├── language │ │ │ └── item.js │ │ ├── desktop │ │ │ └── item.js │ │ ├── import │ │ │ └── item.js │ │ └── browser │ │ │ └── item.js │ ├── collection │ │ ├── cover │ │ │ ├── config.js │ │ │ ├── style.js │ │ │ ├── item │ │ │ │ ├── defaultSource.dark.png │ │ │ │ ├── defaultSource.light.png │ │ │ │ ├── index.js │ │ │ │ └── style.js │ │ │ └── items │ │ │ │ ├── empty.style.js │ │ │ │ ├── style.js │ │ │ │ └── empty.js │ │ ├── sharing │ │ │ └── home │ │ │ │ ├── assets │ │ │ │ ├── empty.png │ │ │ │ ├── empty@2x.png │ │ │ │ └── empty@3x.png │ │ │ │ └── style.js │ │ ├── index.js │ │ ├── view │ │ │ └── options.js │ │ ├── sort │ │ │ └── options.js │ │ └── edit │ │ │ └── remove.js │ ├── bookmarks │ │ └── index.js │ ├── group │ │ ├── index.js │ │ └── edit │ │ │ ├── add.js │ │ │ ├── collapse.js │ │ │ ├── sort.js │ │ │ └── index.js │ ├── extension │ │ ├── index.js │ │ ├── init │ │ │ └── auth.js │ │ └── auth │ │ │ ├── style.js │ │ │ └── index.js │ ├── auth │ │ ├── home │ │ │ ├── assets │ │ │ │ ├── logoBig.png │ │ │ │ ├── logoBig@2x.png │ │ │ │ └── logoBig@3x.png │ │ │ ├── style.js │ │ │ └── jwt.js │ │ ├── index.js │ │ └── register │ │ │ └── style.js │ ├── bookmark │ │ ├── edit │ │ │ ├── style.js │ │ │ ├── item │ │ │ │ ├── note.style.js │ │ │ │ ├── title.style.js │ │ │ │ ├── cover.style.js │ │ │ │ ├── excerpt.style.js │ │ │ │ ├── index.style.js │ │ │ │ ├── path.js │ │ │ │ ├── tags.js │ │ │ │ ├── note.js │ │ │ │ ├── title.js │ │ │ │ ├── important.js │ │ │ │ └── highlights.js │ │ │ ├── disabled │ │ │ │ ├── style.js │ │ │ │ └── index.js │ │ │ ├── date.js │ │ │ ├── indicators │ │ │ │ ├── broken.js │ │ │ │ └── index.js │ │ │ └── actions │ │ │ │ ├── copy.js │ │ │ │ ├── share.js │ │ │ │ ├── select.js │ │ │ │ ├── cache.js │ │ │ │ └── index.js │ │ ├── index.js │ │ ├── highlights │ │ │ └── index.js │ │ └── add │ │ │ └── extension.js │ ├── space │ │ ├── search │ │ │ ├── header │ │ │ │ ├── field.style.js │ │ │ │ ├── style.js │ │ │ │ ├── index.js │ │ │ │ └── menu.js │ │ │ ├── menu │ │ │ │ ├── style.js │ │ │ │ ├── section │ │ │ │ │ └── index.js │ │ │ │ ├── empty.js │ │ │ │ └── useMenuItems.js │ │ │ ├── useSpaceId.js │ │ │ ├── style.js │ │ │ ├── bookmarks │ │ │ │ └── index.js │ │ │ ├── useQuery.js │ │ │ └── load.js │ │ ├── index.js │ │ └── fab.js │ ├── browser │ │ ├── index.js │ │ ├── auto.js │ │ ├── chrome.js │ │ └── system.js │ └── create │ │ ├── types │ │ └── index.js │ │ └── loading │ │ ├── style.js │ │ └── index.js ├── local │ ├── actions │ │ ├── index.js │ │ ├── extension.js │ │ └── app.js │ ├── constants │ │ ├── index.js │ │ ├── extension.js │ │ └── app.js │ └── reducers │ │ ├── index.js │ │ ├── extension.js │ │ └── app.js ├── modules │ ├── format │ │ ├── number │ │ │ ├── index.js │ │ │ ├── compact.js │ │ │ └── fileSize.js │ │ ├── date │ │ │ ├── index.js │ │ │ ├── parse.js │ │ │ ├── locale.js │ │ │ └── month.js │ │ ├── url │ │ │ └── external.js │ │ └── subscription.js │ ├── fcm.js │ ├── native.js │ ├── extension │ │ ├── index.js │ │ └── useData.js │ ├── translate │ │ └── component.js │ ├── appearance │ │ └── size.js │ ├── view.js │ └── ipad │ │ ├── DragView.js │ │ └── DropView.js ├── co │ ├── collections │ │ ├── items │ │ │ ├── buttons.js │ │ │ ├── assets │ │ │ │ ├── emptyCollections.png │ │ │ │ ├── emptyCollections@2x.png │ │ │ │ └── emptyCollections@3x.png │ │ │ ├── style.js │ │ │ └── found.js │ │ ├── item │ │ │ └── icon │ │ │ │ └── defaultSource.png │ │ └── group │ │ │ ├── style.js │ │ │ └── index.js │ ├── button │ │ ├── index.js │ │ └── buttons.js │ ├── list │ │ ├── swipeable │ │ │ └── context.js │ │ ├── sections │ │ │ └── basic │ │ │ │ └── index.js │ │ └── flat │ │ │ └── sortable │ │ │ └── component │ │ │ ├── useHover │ │ │ └── index.js │ │ │ └── useSelected │ │ │ └── index.js │ ├── bookmarks │ │ ├── items │ │ │ └── empty │ │ │ │ ├── assets │ │ │ │ ├── noBookmarks.png │ │ │ │ ├── noBookmarks@2x.png │ │ │ │ └── noBookmarks@3x.png │ │ │ │ └── index.js │ │ ├── item │ │ │ ├── view │ │ │ │ └── cover │ │ │ │ │ ├── defaultSource.dark.png │ │ │ │ │ ├── defaultSource.light.png │ │ │ │ │ └── index.js │ │ │ └── share.js │ │ ├── header │ │ │ └── style.js │ │ ├── selectMode │ │ │ ├── working.js │ │ │ ├── working.style.js │ │ │ ├── actions.style.js │ │ │ ├── action.js │ │ │ └── action.style.js │ │ ├── utils │ │ │ └── color.js │ │ └── footer │ │ │ ├── style.js │ │ │ ├── view.js │ │ │ └── index.js │ ├── native │ │ ├── index.js │ │ ├── ActivityIndicator.js │ │ ├── ProgressView.js │ │ └── KeyboardAvoidingView.js │ ├── navigation │ │ ├── header │ │ │ ├── index.js │ │ │ ├── buttons │ │ │ │ └── style.js │ │ │ └── title │ │ │ │ └── index.js │ │ ├── withNavigation.js │ │ ├── container.js │ │ └── stack.js │ ├── alert │ │ ├── index.js │ │ ├── info.js │ │ ├── warning.js │ │ └── error.js │ ├── tags │ │ ├── item │ │ │ └── style.js │ │ └── picker │ │ │ ├── style.js │ │ │ └── all │ │ │ ├── header.js │ │ │ ├── empty.js │ │ │ └── section.js │ ├── user │ │ └── avatar │ │ │ ├── style.js │ │ │ └── index.js │ ├── highlights │ │ ├── text │ │ │ ├── index.js │ │ │ └── style.js │ │ ├── items │ │ │ └── style.js │ │ ├── item │ │ │ ├── index.js │ │ │ └── style.js │ │ └── webview │ │ │ └── messaging.js │ ├── segmented │ │ ├── style.js │ │ └── index.js │ ├── filters │ │ └── item │ │ │ └── index.js │ ├── form │ │ └── toggle │ │ │ ├── style.js │ │ │ └── index.js │ └── style │ │ ├── animation.js │ │ ├── empty.js │ │ └── item.js ├── assets │ ├── fonts │ │ └── remixicon.ttf │ ├── images │ │ └── icon_64.png │ ├── languages │ │ └── index.json │ └── browsers.js └── push-notifications.js ├── etc ├── screenshots │ └── ios │ │ ├── 5.8 │ │ ├── 1.png │ │ ├── 2.png │ │ ├── 3.png │ │ ├── 4.png │ │ └── 5.png │ │ ├── 6.5 │ │ ├── 1.png │ │ ├── 2.png │ │ ├── 3.png │ │ ├── 4.png │ │ └── 5.png │ │ ├── 12.9 │ │ ├── 0x0ss.jpg │ │ ├── 0x0ss-1.jpg │ │ ├── 0x0ss-2.jpg │ │ ├── 0x0ss-3.jpg │ │ └── 0x0ss-4.jpg │ │ └── 5.5 │ │ ├── 0x0ss-1.jpg │ │ ├── 0x0ss-2.jpg │ │ ├── 0x0ss-3.jpg │ │ ├── 0x0ss-4.jpg │ │ └── 0x0ss.jpg └── benchmarks │ └── new-collections-memory.md ├── android ├── app │ ├── src │ │ ├── main │ │ │ ├── ic_launcher-web.png │ │ │ ├── ic_foreground-web.png │ │ │ ├── assets │ │ │ │ └── fonts │ │ │ │ │ └── remixicon.ttf │ │ │ ├── ic_launcher-playstore.png │ │ │ ├── res │ │ │ │ ├── mipmap-hdpi │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ ├── ic_launcher_round.png │ │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-mdpi │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ ├── ic_launcher_round.png │ │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-xhdpi │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ ├── ic_launcher_round.png │ │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ ├── ic_launcher_round.png │ │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ ├── ic_launcher_round.png │ │ │ │ │ └── ic_launcher_foreground.png │ │ │ │ ├── drawable-hdpi │ │ │ │ │ └── ic_notification.png │ │ │ │ ├── drawable-mdpi │ │ │ │ │ └── ic_notification.png │ │ │ │ ├── drawable-xhdpi │ │ │ │ │ └── ic_notification.png │ │ │ │ ├── drawable-xxhdpi │ │ │ │ │ └── ic_notification.png │ │ │ │ ├── values │ │ │ │ │ ├── ic_launcher_background.xml │ │ │ │ │ ├── colors.xml │ │ │ │ │ └── strings.xml │ │ │ │ ├── values-v27 │ │ │ │ │ └── colors.xml │ │ │ │ ├── mipmap-anydpi-v26 │ │ │ │ │ ├── ic_launcher_round.xml │ │ │ │ │ └── ic_launcher.xml │ │ │ │ ├── values-night │ │ │ │ │ └── colors.xml │ │ │ │ ├── layout │ │ │ │ │ └── empty.xml │ │ │ │ └── drawable-anydpi │ │ │ │ │ └── ic_notification.xml │ │ │ └── java │ │ │ │ └── io │ │ │ │ └── raindrop │ │ │ │ └── raindropio │ │ │ │ ├── extension │ │ │ │ └── ExtensionPackage.kt │ │ │ │ ├── fcm │ │ │ │ └── FCMPackage.kt │ │ │ │ └── nativebridge │ │ │ │ └── NativeBridgePackage.kt │ │ ├── release │ │ │ └── AndroidManifest.xml │ │ └── debug │ │ │ └── AndroidManifest.xml │ └── proguard-rules.pro ├── gradle │ └── wrapper │ │ ├── gradle-wrapper.jar │ │ └── gradle-wrapper.properties └── settings.gradle ├── react-native.config.js ├── .env.example ├── index.android.js ├── index.ios.js ├── TODO.md ├── metro.config.js ├── jsconfig.json ├── .eslintrc.json └── babel.config.js /.node-version: -------------------------------------------------------------------------------- 1 | 18 -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | node_modules/ -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | *.pbxproj -text 2 | -------------------------------------------------------------------------------- /ios/rn3/de.lproj/BootSplash.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/rn3/en.lproj/BootSplash.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/rn3/es.lproj/BootSplash.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/rn3/fi.lproj/BootSplash.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/rn3/fr.lproj/BootSplash.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/rn3/hi.lproj/BootSplash.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/rn3/it.lproj/BootSplash.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/rn3/ja.lproj/BootSplash.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/rn3/ko-KR.lproj/BootSplash.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/rn3/nl.lproj/BootSplash.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/rn3/pl.lproj/BootSplash.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/rn3/pt-BR.lproj/BootSplash.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/rn3/ru.lproj/BootSplash.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/rn3/sv.lproj/BootSplash.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/rn3/tr.lproj/BootSplash.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/Config.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "tmp.xcconfig" 2 | -------------------------------------------------------------------------------- /ios/rn3/zh-Hans.lproj/BootSplash.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /ios/rn3/zh-Hant.lproj/BootSplash.strings: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/data/TODO.md: -------------------------------------------------------------------------------- 1 | - draftLoad can override unsaved changes -------------------------------------------------------------------------------- /src/data/reducers/notes.md: -------------------------------------------------------------------------------- 1 | - Every reducer should have 'RESET' action -------------------------------------------------------------------------------- /src/screens/tag/index.js: -------------------------------------------------------------------------------- 1 | export { default as Edit } from './edit' -------------------------------------------------------------------------------- /src/data/constants/rate.js: -------------------------------------------------------------------------------- 1 | export const 2 | RATE_LOAD = 'RATE_LOAD' -------------------------------------------------------------------------------- /src/local/actions/index.js: -------------------------------------------------------------------------------- 1 | export * from './app' 2 | export * from './extension' -------------------------------------------------------------------------------- /src/local/constants/index.js: -------------------------------------------------------------------------------- 1 | export * from './app' 2 | export * from './extension' -------------------------------------------------------------------------------- /src/data/selectors/filters/index.js: -------------------------------------------------------------------------------- 1 | export * from './items' 2 | export * from './search' -------------------------------------------------------------------------------- /src/data/selectors/oauth/index.js: -------------------------------------------------------------------------------- 1 | export * from './connections' 2 | export * from './my' -------------------------------------------------------------------------------- /src/screens/settings/pro/purchase/skus.js: -------------------------------------------------------------------------------- 1 | export default ['promonthly1', 'proannual1'] -------------------------------------------------------------------------------- /src/data/constants/config.js: -------------------------------------------------------------------------------- 1 | export const 2 | CONFIG_ACKNOWLEDGE = 'CONFIG_ACKNOWLEDGE' -------------------------------------------------------------------------------- /src/modules/format/number/index.js: -------------------------------------------------------------------------------- 1 | export * from './compact' 2 | export * from './fileSize' -------------------------------------------------------------------------------- /src/data/helpers/filters/index.js: -------------------------------------------------------------------------------- 1 | export * from './blankSpace' 2 | export * from './normalizeItems' -------------------------------------------------------------------------------- /src/data/helpers/oauth/index.js: -------------------------------------------------------------------------------- 1 | export * from './blankClient' 2 | export * from './normalizeClient' -------------------------------------------------------------------------------- /src/co/collections/items/buttons.js: -------------------------------------------------------------------------------- 1 | import add from 'co/screen/buttons/add' 2 | 3 | export default add -------------------------------------------------------------------------------- /src/screens/collection/cover/config.js: -------------------------------------------------------------------------------- 1 | export const itemHeight = 64 2 | export const iconHeight = 32 -------------------------------------------------------------------------------- /etc/screenshots/ios/5.8/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/etc/screenshots/ios/5.8/1.png -------------------------------------------------------------------------------- /etc/screenshots/ios/5.8/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/etc/screenshots/ios/5.8/2.png -------------------------------------------------------------------------------- /etc/screenshots/ios/5.8/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/etc/screenshots/ios/5.8/3.png -------------------------------------------------------------------------------- /etc/screenshots/ios/5.8/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/etc/screenshots/ios/5.8/4.png -------------------------------------------------------------------------------- /etc/screenshots/ios/5.8/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/etc/screenshots/ios/5.8/5.png -------------------------------------------------------------------------------- /etc/screenshots/ios/6.5/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/etc/screenshots/ios/6.5/1.png -------------------------------------------------------------------------------- /etc/screenshots/ios/6.5/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/etc/screenshots/ios/6.5/2.png -------------------------------------------------------------------------------- /etc/screenshots/ios/6.5/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/etc/screenshots/ios/6.5/3.png -------------------------------------------------------------------------------- /etc/screenshots/ios/6.5/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/etc/screenshots/ios/6.5/4.png -------------------------------------------------------------------------------- /etc/screenshots/ios/6.5/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/etc/screenshots/ios/6.5/5.png -------------------------------------------------------------------------------- /src/assets/fonts/remixicon.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/src/assets/fonts/remixicon.ttf -------------------------------------------------------------------------------- /src/assets/images/icon_64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/src/assets/images/icon_64.png -------------------------------------------------------------------------------- /src/modules/format/date/index.js: -------------------------------------------------------------------------------- 1 | export * from './parse' 2 | export * from './short' 3 | export * from './month' -------------------------------------------------------------------------------- /src/screens/bookmarks/index.js: -------------------------------------------------------------------------------- 1 | export { default as Move } from './move' 2 | export { default as Tag } from './tag' -------------------------------------------------------------------------------- /src/screens/group/index.js: -------------------------------------------------------------------------------- 1 | export { default as Edit } from './edit' 2 | export { default as Add } from './add' -------------------------------------------------------------------------------- /src/screens/extension/index.js: -------------------------------------------------------------------------------- 1 | export { default as Init } from './init' 2 | export { default as Auth } from './auth' -------------------------------------------------------------------------------- /etc/screenshots/ios/12.9/0x0ss.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/etc/screenshots/ios/12.9/0x0ss.jpg -------------------------------------------------------------------------------- /etc/screenshots/ios/5.5/0x0ss-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/etc/screenshots/ios/5.5/0x0ss-1.jpg -------------------------------------------------------------------------------- /etc/screenshots/ios/5.5/0x0ss-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/etc/screenshots/ios/5.5/0x0ss-2.jpg -------------------------------------------------------------------------------- /etc/screenshots/ios/5.5/0x0ss-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/etc/screenshots/ios/5.5/0x0ss-3.jpg -------------------------------------------------------------------------------- /etc/screenshots/ios/5.5/0x0ss-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/etc/screenshots/ios/5.5/0x0ss-4.jpg -------------------------------------------------------------------------------- /etc/screenshots/ios/5.5/0x0ss.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/etc/screenshots/ios/5.5/0x0ss.jpg -------------------------------------------------------------------------------- /src/data/selectors/oauth/connections.js: -------------------------------------------------------------------------------- 1 | export const getConnectionsClients = ({ oauth })=> 2 | oauth.connections.clients -------------------------------------------------------------------------------- /src/data/selectors/tags/index.js: -------------------------------------------------------------------------------- 1 | export * from './items' 2 | export * from './autocomplete' 3 | export * from './search' -------------------------------------------------------------------------------- /src/local/constants/extension.js: -------------------------------------------------------------------------------- 1 | export const 2 | EXTENSION_COLLECTIONS_SEARCH_FOCUS = 'EXTENSION_COLLECTIONS_SEARCH_FOCUS' -------------------------------------------------------------------------------- /etc/screenshots/ios/12.9/0x0ss-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/etc/screenshots/ios/12.9/0x0ss-1.jpg -------------------------------------------------------------------------------- /etc/screenshots/ios/12.9/0x0ss-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/etc/screenshots/ios/12.9/0x0ss-2.jpg -------------------------------------------------------------------------------- /etc/screenshots/ios/12.9/0x0ss-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/etc/screenshots/ios/12.9/0x0ss-3.jpg -------------------------------------------------------------------------------- /etc/screenshots/ios/12.9/0x0ss-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/etc/screenshots/ios/12.9/0x0ss-4.jpg -------------------------------------------------------------------------------- /ios/rn3/Images.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /src/data/selectors/search/index.js: -------------------------------------------------------------------------------- 1 | export * from './collections' 2 | export * from './suggestions' 3 | export * from './recent' -------------------------------------------------------------------------------- /src/local/constants/app.js: -------------------------------------------------------------------------------- 1 | export const 2 | APP_SET_BROWSER = 'APP_SET_BROWSER', 3 | APP_SET_APPEARANCE = 'APP_SET_APPEARANCE' -------------------------------------------------------------------------------- /src/modules/fcm.js: -------------------------------------------------------------------------------- 1 | import { NativeModules } from 'react-native' 2 | 3 | export const { 4 | getToken 5 | } = NativeModules.FCM -------------------------------------------------------------------------------- /android/app/src/main/ic_launcher-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/android/app/src/main/ic_launcher-web.png -------------------------------------------------------------------------------- /src/data/helpers/tags/index.js: -------------------------------------------------------------------------------- 1 | export * from './blankSpace' 2 | export * from './normalizeTag' 3 | export * from './normalizeTags' -------------------------------------------------------------------------------- /src/screens/auth/home/assets/logoBig.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/src/screens/auth/home/assets/logoBig.png -------------------------------------------------------------------------------- /src/screens/settings/pro/index.js: -------------------------------------------------------------------------------- 1 | export { default as Status } from './status' 2 | export { default as Purchase } from './purchase' -------------------------------------------------------------------------------- /android/app/src/main/ic_foreground-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/android/app/src/main/ic_foreground-web.png -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/android/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /ios/Modules/NativeBridge.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @interface NativeBridge : NSObject 4 | @end 5 | -------------------------------------------------------------------------------- /src/co/button/index.js: -------------------------------------------------------------------------------- 1 | import { Button } from './button' 2 | 3 | export default Button 4 | export * from './buttons' 5 | export * from './fab' -------------------------------------------------------------------------------- /src/data/actions/backups.js: -------------------------------------------------------------------------------- 1 | import * as c from '../constants/backups' 2 | 3 | export const load = ()=>({ 4 | type: c.BACKUPS_LOAD_REQ 5 | }) -------------------------------------------------------------------------------- /src/data/helpers/oauth/blankClient.js: -------------------------------------------------------------------------------- 1 | import { normalizeClient } from './normalizeClient' 2 | 3 | export const blankClient = normalizeClient() -------------------------------------------------------------------------------- /src/screens/auth/home/assets/logoBig@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/src/screens/auth/home/assets/logoBig@2x.png -------------------------------------------------------------------------------- /src/screens/auth/home/assets/logoBig@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/src/screens/auth/home/assets/logoBig@3x.png -------------------------------------------------------------------------------- /src/screens/settings/files/assets/empty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/src/screens/settings/files/assets/empty.png -------------------------------------------------------------------------------- /android/app/src/main/assets/fonts/remixicon.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/android/app/src/main/assets/fonts/remixicon.ttf -------------------------------------------------------------------------------- /android/app/src/main/ic_launcher-playstore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/android/app/src/main/ic_launcher-playstore.png -------------------------------------------------------------------------------- /ios/File.swift: -------------------------------------------------------------------------------- 1 | // 2 | // File.swift 3 | // rn3 4 | // 5 | // Created by Rustem Mussabekov on 14.03.2021. 6 | // 7 | 8 | import Foundation 9 | -------------------------------------------------------------------------------- /ios/rn3-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | // 2 | // Use this file to import your target's public headers that you would like to expose to Swift. 3 | // 4 | 5 | -------------------------------------------------------------------------------- /src/co/collections/item/icon/defaultSource.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/src/co/collections/item/icon/defaultSource.png -------------------------------------------------------------------------------- /src/co/list/swipeable/context.js: -------------------------------------------------------------------------------- 1 | import { createContext } from 'react'; 2 | 3 | const Context = createContext({}) 4 | 5 | export default Context -------------------------------------------------------------------------------- /src/screens/bookmark/edit/style.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components/native' 2 | 3 | export const Wrap = styled.View` 4 | flex: 1; 5 | ` -------------------------------------------------------------------------------- /src/screens/collection/cover/style.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components/native' 2 | 3 | export const Wrap = styled.View` 4 | flex: 1; 5 | ` -------------------------------------------------------------------------------- /src/screens/settings/files/assets/empty@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/src/screens/settings/files/assets/empty@2x.png -------------------------------------------------------------------------------- /src/screens/settings/files/assets/empty@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/src/screens/settings/files/assets/empty@3x.png -------------------------------------------------------------------------------- /ios/extension-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | // 2 | // Use this file to import your target's public headers that you would like to expose to Swift. 3 | // 4 | 5 | -------------------------------------------------------------------------------- /src/modules/format/date/parse.js: -------------------------------------------------------------------------------- 1 | import parseISO from 'date-fns/parseISO' 2 | 3 | export const parseDate = (d) => typeof d == 'string' ? parseISO(d) : d -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /ios/rn3/Images.xcassets/AppIcon.appiconset/ios20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/ios/rn3/Images.xcassets/AppIcon.appiconset/ios20.png -------------------------------------------------------------------------------- /ios/rn3/Images.xcassets/AppIcon.appiconset/ios29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/ios/rn3/Images.xcassets/AppIcon.appiconset/ios29.png -------------------------------------------------------------------------------- /ios/rn3/Images.xcassets/AppIcon.appiconset/ios40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/ios/rn3/Images.xcassets/AppIcon.appiconset/ios40.png -------------------------------------------------------------------------------- /ios/rn3/Images.xcassets/AppIcon.appiconset/ios50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/ios/rn3/Images.xcassets/AppIcon.appiconset/ios50.png -------------------------------------------------------------------------------- /ios/rn3/Images.xcassets/AppIcon.appiconset/ios57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/ios/rn3/Images.xcassets/AppIcon.appiconset/ios57.png -------------------------------------------------------------------------------- /ios/rn3/Images.xcassets/AppIcon.appiconset/ios58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/ios/rn3/Images.xcassets/AppIcon.appiconset/ios58.png -------------------------------------------------------------------------------- /ios/rn3/Images.xcassets/AppIcon.appiconset/ios60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/ios/rn3/Images.xcassets/AppIcon.appiconset/ios60.png -------------------------------------------------------------------------------- /ios/rn3/Images.xcassets/AppIcon.appiconset/ios72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/ios/rn3/Images.xcassets/AppIcon.appiconset/ios72.png -------------------------------------------------------------------------------- /ios/rn3/Images.xcassets/AppIcon.appiconset/ios76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/ios/rn3/Images.xcassets/AppIcon.appiconset/ios76.png -------------------------------------------------------------------------------- /ios/rn3/Images.xcassets/AppIcon.appiconset/ios80.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/ios/rn3/Images.xcassets/AppIcon.appiconset/ios80.png -------------------------------------------------------------------------------- /ios/rn3/Images.xcassets/AppIcon.appiconset/ios87.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/ios/rn3/Images.xcassets/AppIcon.appiconset/ios87.png -------------------------------------------------------------------------------- /src/co/bookmarks/items/empty/assets/noBookmarks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/src/co/bookmarks/items/empty/assets/noBookmarks.png -------------------------------------------------------------------------------- /src/co/collections/items/assets/emptyCollections.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/src/co/collections/items/assets/emptyCollections.png -------------------------------------------------------------------------------- /src/data/modules/format/domain.js: -------------------------------------------------------------------------------- 1 | export default function(s='') { 2 | try{s = s.trim();} catch(e) {if(e)s='';} 3 | return s.replace(/^www\./, '') 4 | } -------------------------------------------------------------------------------- /src/screens/collection/sharing/home/assets/empty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/src/screens/collection/sharing/home/assets/empty.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /ios/rn3/Images.xcassets/AppIcon.appiconset/ios100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/ios/rn3/Images.xcassets/AppIcon.appiconset/ios100.png -------------------------------------------------------------------------------- /ios/rn3/Images.xcassets/AppIcon.appiconset/ios1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/ios/rn3/Images.xcassets/AppIcon.appiconset/ios1024.png -------------------------------------------------------------------------------- /ios/rn3/Images.xcassets/AppIcon.appiconset/ios114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/ios/rn3/Images.xcassets/AppIcon.appiconset/ios114.png -------------------------------------------------------------------------------- /ios/rn3/Images.xcassets/AppIcon.appiconset/ios120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/ios/rn3/Images.xcassets/AppIcon.appiconset/ios120.png -------------------------------------------------------------------------------- /ios/rn3/Images.xcassets/AppIcon.appiconset/ios144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/ios/rn3/Images.xcassets/AppIcon.appiconset/ios144.png -------------------------------------------------------------------------------- /ios/rn3/Images.xcassets/AppIcon.appiconset/ios152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/ios/rn3/Images.xcassets/AppIcon.appiconset/ios152.png -------------------------------------------------------------------------------- /ios/rn3/Images.xcassets/AppIcon.appiconset/ios167.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/ios/rn3/Images.xcassets/AppIcon.appiconset/ios167.png -------------------------------------------------------------------------------- /ios/rn3/Images.xcassets/AppIcon.appiconset/ios180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/ios/rn3/Images.xcassets/AppIcon.appiconset/ios180.png -------------------------------------------------------------------------------- /ios/rn3/Images.xcassets/background.imageset/black.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/ios/rn3/Images.xcassets/background.imageset/black.png -------------------------------------------------------------------------------- /ios/rn3/Images.xcassets/background.imageset/white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/ios/rn3/Images.xcassets/background.imageset/white.png -------------------------------------------------------------------------------- /react-native.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | project: { 3 | ios: {}, 4 | android: {}, 5 | }, 6 | assets: ['./src/assets/fonts/'] 7 | } -------------------------------------------------------------------------------- /src/co/bookmarks/item/view/cover/defaultSource.dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/src/co/bookmarks/item/view/cover/defaultSource.dark.png -------------------------------------------------------------------------------- /src/co/bookmarks/items/empty/assets/noBookmarks@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/src/co/bookmarks/items/empty/assets/noBookmarks@2x.png -------------------------------------------------------------------------------- /src/co/bookmarks/items/empty/assets/noBookmarks@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/src/co/bookmarks/items/empty/assets/noBookmarks@3x.png -------------------------------------------------------------------------------- /src/co/collections/items/assets/emptyCollections@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/src/co/collections/items/assets/emptyCollections@2x.png -------------------------------------------------------------------------------- /src/co/collections/items/assets/emptyCollections@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/src/co/collections/items/assets/emptyCollections@3x.png -------------------------------------------------------------------------------- /src/screens/collection/sharing/home/assets/empty@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/src/screens/collection/sharing/home/assets/empty@2x.png -------------------------------------------------------------------------------- /src/screens/collection/sharing/home/assets/empty@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/src/screens/collection/sharing/home/assets/empty@3x.png -------------------------------------------------------------------------------- /src/screens/space/search/header/field.style.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components/native' 2 | 3 | export const Wrap = styled.View` 4 | width: 70%; 5 | ` -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | APP_VERSION_CODE=111 2 | APP_VERSION=1.1.1 3 | APPLE_SIGN_IN_CLIENT_ID= 4 | APPLE_SIGN_IN_REDIRECT= 5 | GOOGLE_CLIENT_ID_ANDROID= 6 | GOOGLE_URL_SCHEME= -------------------------------------------------------------------------------- /src/co/bookmarks/item/view/cover/defaultSource.light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/src/co/bookmarks/item/view/cover/defaultSource.light.png -------------------------------------------------------------------------------- /src/co/native/index.js: -------------------------------------------------------------------------------- 1 | export * from './ActivityIndicator' 2 | export * from './KeyboardAvoidingView' 3 | export * from './ProgressView' 4 | export * from './WebView' -------------------------------------------------------------------------------- /src/screens/collection/cover/item/defaultSource.dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/src/screens/collection/cover/item/defaultSource.dark.png -------------------------------------------------------------------------------- /src/screens/collection/cover/item/defaultSource.light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/src/screens/collection/cover/item/defaultSource.light.png -------------------------------------------------------------------------------- /src/screens/space/index.js: -------------------------------------------------------------------------------- 1 | export { default as Home } from './home' 2 | export { default as Browse } from './browse' 3 | export { default as Search } from './search' -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-hdpi/ic_notification.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/android/app/src/main/res/drawable-hdpi/ic_notification.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-mdpi/ic_notification.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/android/app/src/main/res/drawable-mdpi/ic_notification.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xhdpi/ic_notification.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/android/app/src/main/res/drawable-xhdpi/ic_notification.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxhdpi/ic_notification.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/android/app/src/main/res/drawable-xxhdpi/ic_notification.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /ios/rn3/Images.xcassets/backButton.imageset/backButton.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/ios/rn3/Images.xcassets/backButton.imageset/backButton.pdf -------------------------------------------------------------------------------- /src/data/actions/covers.js: -------------------------------------------------------------------------------- 1 | import { COVERS_LOAD_REQ } from '../constants/covers' 2 | 3 | export const load = (query='')=>({ 4 | type: COVERS_LOAD_REQ, 5 | query 6 | }) -------------------------------------------------------------------------------- /src/modules/native.js: -------------------------------------------------------------------------------- 1 | import { NativeModules } from 'react-native' 2 | 3 | export const { 4 | isTablet, 5 | appVersion, 6 | openFileUrl 7 | } = NativeModules.NativeBridge -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /src/co/navigation/header/index.js: -------------------------------------------------------------------------------- 1 | import * as Buttons from './buttons' 2 | import * as Title from './title' 3 | 4 | export default { 5 | ...Buttons, 6 | ...Title 7 | } -------------------------------------------------------------------------------- /src/data/selectors/bookmarks/index.js: -------------------------------------------------------------------------------- 1 | export * from './space' 2 | export * from './single' 3 | export * from './draft' 4 | export * from './selectMode' 5 | export * from './html' -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /android/app/src/release/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | -------------------------------------------------------------------------------- /ios/rn3/Images.xcassets/splashLogo.imageset/splash-logo-dark.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/ios/rn3/Images.xcassets/splashLogo.imageset/splash-logo-dark.pdf -------------------------------------------------------------------------------- /ios/rn3/Images.xcassets/splashLogo.imageset/splash-logo-light.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/ios/rn3/Images.xcassets/splashLogo.imageset/splash-logo-light.pdf -------------------------------------------------------------------------------- /src/co/alert/index.js: -------------------------------------------------------------------------------- 1 | import Error from './error' 2 | import Warning from './warning' 3 | import Info from './info' 4 | 5 | export { 6 | Error, 7 | Warning, 8 | Info 9 | } -------------------------------------------------------------------------------- /src/data/constants/covers.js: -------------------------------------------------------------------------------- 1 | export const 2 | COVERS_LOAD_REQ = 'COVERS_LOAD_REQ', 3 | COVERS_LOAD_SUCCESS = 'COVERS_LOAD_SUCCESS', 4 | COVERS_LOAD_ERROR = 'COVERS_LOAD_ERROR' -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/raindropio/mobile/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png -------------------------------------------------------------------------------- /index.android.js: -------------------------------------------------------------------------------- 1 | import {UIManager} from 'react-native' 2 | import './src' 3 | 4 | UIManager.setLayoutAnimationEnabledExperimental && UIManager.setLayoutAnimationEnabledExperimental(true) -------------------------------------------------------------------------------- /android/app/src/main/res/values/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FFFFFF 4 | -------------------------------------------------------------------------------- /src/data/helpers/defaults.js: -------------------------------------------------------------------------------- 1 | export const appendAfterArray = (a, val, index)=>{ 2 | return [ 3 | ...a.slice(0, index), 4 | val, 5 | ...a.slice(index) 6 | ] 7 | } -------------------------------------------------------------------------------- /src/data/actions/bookmarks/recent.js: -------------------------------------------------------------------------------- 1 | import { RECENT_SEARCH_CLEAR_REQ } from '../../constants/bookmarks' 2 | 3 | export const recentSearchClear = ()=>({ 4 | type: RECENT_SEARCH_CLEAR_REQ, 5 | }) -------------------------------------------------------------------------------- /src/data/modules/user/isPro.js: -------------------------------------------------------------------------------- 1 | import { store } from '../../' 2 | 3 | export default ()=>{ 4 | const state = store.getState() 5 | return state.user.current && state.user.current.pro 6 | } -------------------------------------------------------------------------------- /src/data/selectors/bookmarks/html.js: -------------------------------------------------------------------------------- 1 | import { blankHtml } from '../../helpers/bookmarks' 2 | 3 | export const getHtml = ({bookmarks}, _id)=>{ 4 | return bookmarks.html[_id] || blankHtml 5 | } -------------------------------------------------------------------------------- /ios/Modules/iPadDropView.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | 4 | @interface iPadDropView : UIView 5 | @property (nonatomic, copy) RCTBubblingEventBlock onDrop; 6 | @end 7 | -------------------------------------------------------------------------------- /src/co/collections/group/style.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components/native' 2 | import { dragItemStyle } from 'co/list/flat/sortable' 3 | 4 | export const Wrap = styled.View` 5 | ${dragItemStyle} 6 | ` -------------------------------------------------------------------------------- /src/data/actions/bookmarks/html.js: -------------------------------------------------------------------------------- 1 | import { BOOKMARK_HTML_LOAD_REQ } from '../../constants/bookmarks' 2 | 3 | export const htmlLoad = _id=>({ 4 | type: BOOKMARK_HTML_LOAD_REQ, 5 | _id: parseInt(_id) 6 | }) -------------------------------------------------------------------------------- /src/data/constants/backups.js: -------------------------------------------------------------------------------- 1 | export const 2 | BACKUPS_LOAD_REQ = 'BACKUPS_LOAD_REQ', 3 | BACKUPS_LOAD_SUCCESS = 'BACKUPS_LOAD_SUCCESS', 4 | BACKUPS_LOAD_ERROR = 'BACKUPS_LOAD_ERROR' -------------------------------------------------------------------------------- /src/data/selectors/collections/index.js: -------------------------------------------------------------------------------- 1 | export * from './drafts' 2 | export * from './groups' 3 | export * from './items' 4 | export * from './selectMode' 5 | export * from './sharing' 6 | export * from './single' -------------------------------------------------------------------------------- /ios/Modules/iPadDragView.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import "iPadDragItem.h" 3 | 4 | @interface iPadDragView : UIView 5 | 6 | @property (nonatomic, strong) NSArray *dragItems; 7 | 8 | @end 9 | -------------------------------------------------------------------------------- /src/co/tags/item/style.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components/native' 2 | 3 | export const Bg = styled.View` 4 | background: ${({ theme, selected })=> selected ? theme.color.accent+'15' : 'transparent' }; 5 | ` -------------------------------------------------------------------------------- /src/modules/format/number/compact.js: -------------------------------------------------------------------------------- 1 | export function compact(val=0) { 2 | try{ 3 | if (val>1000) 4 | return parseFloat(val/1000).toFixed(1)+'k' 5 | }catch(e){} 6 | 7 | return val 8 | } -------------------------------------------------------------------------------- /src/screens/collection/sharing/home/style.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components/native' 2 | 3 | export const Wrap = styled.View` 4 | background: ${({theme})=>theme.background.regular}; 5 | flex: 1; 6 | ` -------------------------------------------------------------------------------- /src/data/modules/format/cache_url.js: -------------------------------------------------------------------------------- 1 | import Api from '../api' 2 | 3 | export default async function(bookmarkID){ 4 | const { link='' } = await Api._get(`raindrop/${bookmarkID}/cache?json=1`) 5 | return link 6 | } -------------------------------------------------------------------------------- /index.ios.js: -------------------------------------------------------------------------------- 1 | import './src' 2 | import { LogBox } from 'react-native' 3 | 4 | LogBox.ignoreLogs([ 5 | 'Non-serializable values were found in the navigation state', 6 | 'POP_TO_TOP', 7 | 'ReactNativeFiberHostComponent' 8 | ]) -------------------------------------------------------------------------------- /ios/extension/ShareViewController.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | #import 4 | 5 | @interface ShareViewController : UIViewController 6 | 7 | @end 8 | -------------------------------------------------------------------------------- /src/data/modules/format/favicon.js: -------------------------------------------------------------------------------- 1 | import { FAVICON_URL } from '../../constants/app' 2 | 3 | export default function(domain=''){ 4 | if (!domain) 5 | return '' 6 | 7 | return `${FAVICON_URL}/${domain}` 8 | } -------------------------------------------------------------------------------- /src/data/helpers/tags/normalizeTags.js: -------------------------------------------------------------------------------- 1 | import { normalizeTag } from './normalizeTag' 2 | 3 | export const normalizeTags = tags=> 4 | (tags||[]) 5 | .filter(obj=>obj && (obj._id || obj.name)) 6 | .map(normalizeTag) -------------------------------------------------------------------------------- /src/data/actions/bookmarks/index.js: -------------------------------------------------------------------------------- 1 | export * from './space' 2 | export * from './single' 3 | export * from './draft' 4 | export * from './selectMode' 5 | export * from './html' 6 | export * from './recent' 7 | export * from './highlights' -------------------------------------------------------------------------------- /src/data/selectors/tags/items.js: -------------------------------------------------------------------------------- 1 | import { blankSpace } from '../../helpers/tags' 2 | 3 | //(state, spaceId) 4 | export const getTags = ({ tags }, spaceId)=> 5 | ( 6 | tags.spaces[spaceId] ? tags.spaces[spaceId] : blankSpace 7 | ).tags -------------------------------------------------------------------------------- /src/co/bookmarks/header/style.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components/native' 2 | import { ActivityIndicator } from 'co/native' 3 | 4 | export const Loading = styled(ActivityIndicator)` 5 | flex: 1; 6 | align-items: flex-start; 7 | ` -------------------------------------------------------------------------------- /src/data/modules/format/iframeable_url.js: -------------------------------------------------------------------------------- 1 | import Api from '../api' 2 | 3 | export default async function(url){ 4 | const { result=false } = await Api._get(`import/url/iframeable?url=${encodeURIComponent(url)}`) 5 | return result 6 | } -------------------------------------------------------------------------------- /src/data/utils/wrapFunc.js: -------------------------------------------------------------------------------- 1 | export default function(fn) { 2 | if (typeof fn == 'function') 3 | return function() { 4 | setTimeout(()=>fn.apply(this, arguments), 0) 5 | } 6 | else 7 | return fn 8 | } -------------------------------------------------------------------------------- /src/screens/bookmark/edit/item/note.style.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components/native' 2 | import { Input } from 'co/form' 3 | 4 | export const NoteInput = styled(Input)` 5 | font-size: ${({theme})=>theme.fontSize.secondary}px; 6 | ` -------------------------------------------------------------------------------- /ios/rn3/AppDelegate.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | 4 | @interface AppDelegate : UIResponder 5 | 6 | @property (nonatomic, strong) UIWindow *window; 7 | 8 | @end -------------------------------------------------------------------------------- /src/local/actions/extension.js: -------------------------------------------------------------------------------- 1 | import { 2 | EXTENSION_COLLECTIONS_SEARCH_FOCUS 3 | } from '../constants' 4 | 5 | export const setExtensionCollectionsSearchFocus = (focus=false)=>({ 6 | type: EXTENSION_COLLECTIONS_SEARCH_FOCUS, 7 | focus 8 | }) -------------------------------------------------------------------------------- /ios/Modules/iPadDragViewManager.h: -------------------------------------------------------------------------------- 1 | #if __has_include("RCTViewManager.h") 2 | #import "RCTViewManager.h" 3 | #else 4 | #import 5 | #endif 6 | 7 | @interface iPadDragViewManager : RCTViewManager 8 | 9 | @end 10 | 11 | -------------------------------------------------------------------------------- /ios/Modules/iPadDropViewManager.h: -------------------------------------------------------------------------------- 1 | #if __has_include("RCTViewManager.h") 2 | #import "RCTViewManager.h" 3 | #else 4 | #import 5 | #endif 6 | 7 | @interface iPadDropViewManager : RCTViewManager 8 | 9 | @end 10 | 11 | -------------------------------------------------------------------------------- /ios/rn3/main.m: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | #import "AppDelegate.h" 4 | 5 | int main(int argc, char *argv[]) 6 | { 7 | @autoreleasepool { 8 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 9 | } 10 | } -------------------------------------------------------------------------------- /src/screens/bookmark/edit/item/title.style.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components/native' 2 | import { Input } from 'co/form' 3 | 4 | export const Title = styled(Input)` 5 | flex: 1; 6 | margin: 0; 7 | padding: 0; 8 | font-weight: bold; 9 | ` -------------------------------------------------------------------------------- /ios/rn3/Images.xcassets/backButton.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "backButton.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /src/data/selectors/collections/groups.js: -------------------------------------------------------------------------------- 1 | import { createSelector } from 'reselect' 2 | import { getGroup } from '../../helpers/collections' 3 | 4 | export const group = createSelector( 5 | [({collections={}})=>collections.groups, (state,_id)=>_id], 6 | getGroup 7 | ) -------------------------------------------------------------------------------- /src/screens/browser/index.js: -------------------------------------------------------------------------------- 1 | export { default as Internal } from './internal' 2 | export { default as Font } from './font' 3 | 4 | export { default as auto } from './auto' 5 | export { default as chrome } from './chrome' 6 | export { default as system } from './system' -------------------------------------------------------------------------------- /src/data/README.md: -------------------------------------------------------------------------------- 1 | # Actions 2 | ## Collections 3 | - Reorder collection 4 | `oneReorder(_id, {after: someCollectionId})` or `oneReorder(_id, {before: someCollectionId})` 5 | 6 | - Move collection to group or as nested child 7 | `oneReorder(_id, {to: groupId | collectionId})` -------------------------------------------------------------------------------- /src/screens/space/search/menu/style.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components/native' 2 | 3 | export const Wrap = styled.View` 4 | flex: 1; 5 | position: absolute; 6 | top: 0;left:0;right:0;bottom:0; 7 | background: ${({theme})=>theme.background.regular}; 8 | ` -------------------------------------------------------------------------------- /src/data/helpers/tags/normalizeTag.js: -------------------------------------------------------------------------------- 1 | export const normalizeTag = (tag={})=>{ 2 | const _id = String(tag._id || tag.name) 3 | 4 | return ({ 5 | _id, 6 | count: tag.count||0, 7 | query: _id.includes(' ') ? `"#${_id}" ` : `#${_id} ` 8 | }) 9 | } -------------------------------------------------------------------------------- /src/screens/bookmark/edit/item/cover.style.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components/native' 2 | import { TouchableOpacity } from 'react-native-gesture-handler' 3 | 4 | export const Tap = styled(TouchableOpacity)` 5 | align-items: flex-start; 6 | justify-content: flex-start; 7 | ` -------------------------------------------------------------------------------- /src/co/user/avatar/style.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components/native' 2 | 3 | export const Image = styled.Image` 4 | ${({width})=>` 5 | width: ${width}px; 6 | height: ${width}px; 7 | border-radius: ${width/2||0}px; 8 | `} 9 | margin: 2px; 10 | ` -------------------------------------------------------------------------------- /src/data/sagas/tags/index.js: -------------------------------------------------------------------------------- 1 | import { all } from 'redux-saga/effects' 2 | import items from './items' 3 | import single from './single' 4 | import recent from './recent' 5 | 6 | export default function* () { 7 | yield all([ 8 | items(), 9 | single(), 10 | recent() 11 | ]) 12 | } -------------------------------------------------------------------------------- /src/co/highlights/text/index.js: -------------------------------------------------------------------------------- 1 | import { Wrap, Tick } from './style' 2 | 3 | export default function HighlighText({ children, color, ...etc }) { 4 | return ( 5 | 6 | 7 | {children} 8 | 9 | ) 10 | } -------------------------------------------------------------------------------- /src/data/helpers/bookmarks/queryIsEqual.js: -------------------------------------------------------------------------------- 1 | export const queryIsEqual = function(original={}, newone={}) { 2 | const entries = Object.entries(newone) 3 | 4 | for(const [key, val] of entries) 5 | if (original[key] != val) 6 | return false 7 | 8 | return true 9 | } -------------------------------------------------------------------------------- /src/screens/auth/index.js: -------------------------------------------------------------------------------- 1 | export { default as Home } from './home' 2 | export { default as Login } from './login' 3 | export { default as Register } from './register' 4 | export { default as JWT } from './jwt' 5 | export { default as TFA } from './tfa' 6 | export { default as Native } from './native' -------------------------------------------------------------------------------- /src/screens/space/search/header/style.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components/native' 2 | 3 | export const Wrap = styled.View` 4 | flex: 1; 5 | flex-direction: column; 6 | ` 7 | 8 | export const Toolbar = styled.View` 9 | flex-direction: row; 10 | align-items: center; 11 | ` -------------------------------------------------------------------------------- /src/local/actions/app.js: -------------------------------------------------------------------------------- 1 | import { 2 | APP_SET_BROWSER, 3 | APP_SET_APPEARANCE 4 | } from '../constants' 5 | 6 | export const setAppearance = (value)=>({ 7 | type: APP_SET_APPEARANCE, 8 | value 9 | }) 10 | 11 | export const setBrowser = (id)=>({ 12 | type: APP_SET_BROWSER, 13 | id 14 | }) -------------------------------------------------------------------------------- /src/modules/extension/index.js: -------------------------------------------------------------------------------- 1 | import { NativeModules } from 'react-native' 2 | import useData from './useData' 3 | 4 | export const { 5 | data, 6 | close, 7 | disableDismissGesture, 8 | enableDismissGesture 9 | } = NativeModules.ShareViewController 10 | 11 | export { useData } -------------------------------------------------------------------------------- /src/screens/bookmark/index.js: -------------------------------------------------------------------------------- 1 | export { default as Add } from './add' 2 | export { default as Cover } from './cover' 3 | export { default as Edit } from './edit' 4 | export { default as Highlights } from './highlights' 5 | export { default as Path } from './path' 6 | export { default as Tags } from './tags' -------------------------------------------------------------------------------- /src/screens/space/search/menu/section/index.js: -------------------------------------------------------------------------------- 1 | import { SectionView, SectionText } from 'co/style/section' 2 | 3 | export default function Section({ title }) { 4 | return ( 5 | 6 | {title} 7 | 8 | ) 9 | } -------------------------------------------------------------------------------- /src/co/bookmarks/item/share.js: -------------------------------------------------------------------------------- 1 | export default async function send({ title, fileType, link, cover }) { 2 | await require('react-native-share').default.open({ 3 | title, 4 | url: link, 5 | type: fileType, 6 | failOnCancel: false, 7 | showAppsToView: true 8 | }) 9 | } -------------------------------------------------------------------------------- /ios/rn3.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ios/Modules/iPadDragItem.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @interface iPadDragItem : NSObject 4 | 5 | @property (nonatomic, strong, nonnull) NSString *title; 6 | 7 | - (instancetype _Nonnull)initWithTitle:(NSString * _Nonnull)title; 8 | 9 | - (UIDragItem * _Nonnull)uiDragItem; 10 | 11 | @end 12 | -------------------------------------------------------------------------------- /src/screens/settings/pro/purchase/style.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components/native' 2 | import { SafeAreaView } from 'react-native-safe-area-context' 3 | 4 | export const Wrap = styled(SafeAreaView)` 5 | flex: 1; 6 | justify-content: center; 7 | ` 8 | 9 | export const Periods = styled.View` 10 | 11 | ` -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-all.zip 4 | networkTimeout=10000 5 | validateDistributionUrl=true 6 | zipStoreBase=GRADLE_USER_HOME 7 | zipStorePath=wrapper/dists -------------------------------------------------------------------------------- /ios/rn3.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /src/co/bookmarks/selectMode/working.js: -------------------------------------------------------------------------------- 1 | import { Backdrop } from './working.style' 2 | import { ActivityIndicator } from 'co/native' 3 | 4 | export default function SelectModeWorking({ working }) { 5 | return ( 6 | 7 | 8 | 9 | ) 10 | } -------------------------------------------------------------------------------- /src/co/bookmarks/utils/color.js: -------------------------------------------------------------------------------- 1 | import { store } from 'data' 2 | import { bookmark } from 'data/selectors/bookmarks' 3 | import collectionColor from 'co/collections/utils/color' 4 | 5 | export default _id => { 6 | const { collectionId } = bookmark(store.getState(), _id) 7 | return collectionColor(collectionId) 8 | } -------------------------------------------------------------------------------- /src/data/constants/filters.js: -------------------------------------------------------------------------------- 1 | export const 2 | FILTERS_AUTOLOAD = 'FILTERS_AUTOLOAD', 3 | FILTERS_LOAD_PRE = 'FILTERS_LOAD_PRE', 4 | FILTERS_LOAD_REQ = 'FILTERS_LOAD_REQ', 5 | FILTERS_LOAD_SUCCESS = 'FILTERS_LOAD_SUCCESS', 6 | FILTERS_LOAD_ERROR = 'FILTERS_LOAD_ERROR', 7 | FILTERS_RESET = 'FILTERS_RESET' -------------------------------------------------------------------------------- /src/data/helpers/bookmarks/normalizeRecentSearch.js: -------------------------------------------------------------------------------- 1 | export const normalizeRecentSearch = (search={})=>{ 2 | const _id = String(search._id) 3 | 4 | return ({ 5 | _id, 6 | collectionRef: parseInt(search.collectionRef), 7 | query: _id+' ', 8 | date: search.date 9 | }) 10 | } -------------------------------------------------------------------------------- /src/data/helpers/filters/blankSpace.js: -------------------------------------------------------------------------------- 1 | import Immutable from 'seamless-immutable' 2 | 3 | export const blankSpace = Immutable({ 4 | lastAction: null, 5 | version: '', 6 | status: 'idle', //idle, loading, loaded, error 7 | items: [], //{_id, count, query} 8 | query: { search: '' } //used only to prevent overrides 9 | }) -------------------------------------------------------------------------------- /src/data/helpers/tags/blankSpace.js: -------------------------------------------------------------------------------- 1 | import Immutable from 'seamless-immutable' 2 | 3 | export const blankSpace = Immutable({ 4 | lastAction: null, 5 | version: '', 6 | status: 'idle', //idle, loading, loaded, error 7 | tags: [], //{_id, count, query} 8 | query: { search: '' }, //used only to prevent overrides 9 | }) -------------------------------------------------------------------------------- /src/screens/space/search/useSpaceId.js: -------------------------------------------------------------------------------- 1 | import { useSelector } from 'react-redux' 2 | 3 | export default function useSpaceId({ spaceId=0 }) { 4 | const incollection = useSelector(state=>state.config.raindrops_search_incollection) 5 | 6 | const id = incollection ? parseInt(spaceId)+'s' : '0s' 7 | 8 | return id 9 | } -------------------------------------------------------------------------------- /ios/safari-extension/SafariWebExtensionHandler.h: -------------------------------------------------------------------------------- 1 | // 2 | // SafariWebExtensionHandler.h 3 | // safari-extension 4 | // 5 | // Created by Rustem Mussabekov on 05.10.2021. 6 | // 7 | 8 | #import 9 | 10 | @interface SafariWebExtensionHandler : NSObject 11 | 12 | @end 13 | -------------------------------------------------------------------------------- /android/app/src/main/res/values-v27/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | #F7F7F7 3 | true 4 | 5 | #F7F7F7 6 | 7 | #F7F7F7 8 | true 9 | -------------------------------------------------------------------------------- /src/co/collections/items/style.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components/native' 2 | 3 | export const Wrap = styled.View` 4 | background: ${({theme})=>theme.background.regular}; 5 | ${({disableVirtualization})=>!disableVirtualization?'flex: 1;':''} 6 | ` 7 | 8 | export const Footer = styled.View` 9 | height: 32px; 10 | ` -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /android/app/src/main/res/values-night/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | #111213 3 | false 4 | 5 | #111213 6 | 7 | #111213 8 | false 9 | -------------------------------------------------------------------------------- /src/co/native/ActivityIndicator.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components/native' 2 | import _ from 'lodash' 3 | 4 | export const ActivityIndicator = styled.ActivityIndicator.attrs(({ color, theme })=>({ 5 | color: theme.color[color] || _.get(theme, color) || theme.text.secondary 6 | }))` 7 | margin: ${({theme})=>theme.padding.small}px; 8 | ` -------------------------------------------------------------------------------- /src/screens/space/search/style.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components/native' 2 | 3 | export const Wrap = styled.View` 4 | flex: 1; 5 | flex-direction: column; 6 | background: ${({theme})=>theme.background.regular}; 7 | ` 8 | 9 | export const Content = styled.View` 10 | flex: 1; 11 | flex-direction: column; 12 | ` -------------------------------------------------------------------------------- /src/screens/settings/appearance/themes.js: -------------------------------------------------------------------------------- 1 | import t from 't' 2 | 3 | export default [ 4 | { id: '', icon: 'contrast', label: t.s('automatically') }, 5 | { id: 'light', icon: 'sun', label: 'Light' }, 6 | { id: 'dark', icon: 'moon', label: 'Midnight' }, 7 | { id: 'oled', icon: 'tv-2', label: 'OLED' } 8 | ] -------------------------------------------------------------------------------- /TODO.md: -------------------------------------------------------------------------------- 1 | - Data 2 | - remake reducers object structure from `collections.drafts[_id].status` to `collections.drafts.status[_id]` and etc... 3 | - selectors 4 | - everything rename to 'getSomething' (expect 'makeSomething') 5 | - apple signin 6 | - if current google_restore subscription is working, remove all releated code for developerPayload -------------------------------------------------------------------------------- /src/data/modules/format/screenshot.js: -------------------------------------------------------------------------------- 1 | import { WORKERS_BASE_URL, LEGACY_WORKERS_BASE_URL, RENDER_URL } from '../../constants/app' 2 | 3 | export default function(url='') { 4 | if (url.includes(WORKERS_BASE_URL) || 5 | url.includes(LEGACY_WORKERS_BASE_URL)) 6 | return url 7 | 8 | return RENDER_URL+'/'+encodeURIComponent(url) 9 | } -------------------------------------------------------------------------------- /src/co/bookmarks/selectMode/working.style.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components/native' 2 | 3 | export const Backdrop = styled.View` 4 | background: #00000050; 5 | flex: 1; 6 | position: absolute; 7 | top: 0; 8 | bottom: 0; 9 | left: 0; 10 | right: 0; 11 | justify-content: center; 12 | align-items: center; 13 | ` -------------------------------------------------------------------------------- /src/modules/format/url/external.js: -------------------------------------------------------------------------------- 1 | export default async function external(link) { 2 | if (!link.includes('raindrop.io')) 3 | return link 4 | 5 | const res = await fetch(link, { 6 | credentials: 'include', 7 | redirect: 'manual' 8 | }) 9 | res.body && await res.body.cancel('ignore') 10 | return res.url 11 | } -------------------------------------------------------------------------------- /metro.config.js: -------------------------------------------------------------------------------- 1 | const {getDefaultConfig, mergeConfig} = require('@react-native/metro-config'); 2 | 3 | /** 4 | * Metro configuration 5 | * https://reactnative.dev/docs/metro 6 | * 7 | * @type {import('@react-native/metro-config').MetroConfig} 8 | */ 9 | const config = {}; 10 | 11 | module.exports = mergeConfig(getDefaultConfig(__dirname), config); -------------------------------------------------------------------------------- /src/screens/bookmark/edit/item/excerpt.style.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components/native' 2 | import { Input } from 'co/form' 3 | 4 | export const ExcerptInput = styled(Input)` 5 | font-size: ${({theme})=>theme.fontSize.secondary}px; 6 | color: ${({theme})=>theme.text.secondary}; 7 | margin: 0; 8 | padding: 0; 9 | text-align: left; 10 | ` -------------------------------------------------------------------------------- /src/screens/bookmark/highlights/index.js: -------------------------------------------------------------------------------- 1 | import t from 't' 2 | import Items from 'co/highlights/items' 3 | 4 | function BookmarkHighlights({ route: { params: { _id } } }) { 5 | return ( 6 | 7 | ) 8 | } 9 | 10 | BookmarkHighlights.options = { 11 | title: t.s('highlights') 12 | } 13 | 14 | export default BookmarkHighlights -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | pluginManagement { includeBuild("../node_modules/@react-native/gradle-plugin") } 2 | plugins { id("com.facebook.react.settings") } 3 | extensions.configure(com.facebook.react.ReactSettingsExtension){ ex -> ex.autolinkLibrariesFromCommand() } 4 | rootProject.name = 'rn3' 5 | include ':app' 6 | includeBuild('../node_modules/@react-native/gradle-plugin') -------------------------------------------------------------------------------- /ios/extension/extension.entitlements: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.application-groups 6 | 7 | group.io.raindrop.main 8 | 9 | 10 | -------------------------------------------------------------------------------- /src/co/button/buttons.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components/native' 2 | 3 | export const Buttons = styled.View` 4 | flex-direction: ${({vertical})=>vertical ? 'column' : 'row'}; 5 | gap: ${({theme})=>theme.padding.medium}px; 6 | margin: 0 ${({theme})=>theme.padding.medium}px; 7 | margin-bottom: ${({vertical, theme})=>vertical ? theme.padding.medium : 0}px; 8 | ` -------------------------------------------------------------------------------- /src/screens/settings/share_extension/options.js: -------------------------------------------------------------------------------- 1 | import t from 't' 2 | 3 | const options = [ 4 | { id: -1, icon: 'inbox', label: t.s('defaultCollection--1') }, 5 | { id: 0, icon: 'history', label: t.s('lastUsed') } 6 | ] 7 | 8 | export function getOption(id) { 9 | return options.find(option=>option.id === id) || {} 10 | } 11 | 12 | export default options -------------------------------------------------------------------------------- /src/co/alert/info.js: -------------------------------------------------------------------------------- 1 | import { Info, Wrap, Message } from './style' 2 | import Icon from 'co/icon' 3 | 4 | export default ({ message, icon='information', children })=>( 5 | 6 | 7 | 8 | {message} 9 | 10 | 11 | {children} 12 | 13 | ) -------------------------------------------------------------------------------- /src/co/highlights/text/style.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components/native' 2 | 3 | export const Wrap = styled.View` 4 | flex-direction: row; 5 | margin: 5px 0; 6 | ` 7 | 8 | export const Tick = styled.View` 9 | background: ${({ theme, color })=>theme.color[color||'yellow'] || color}; 10 | width: 3px; 11 | border-radius: 3px; 12 | margin-right: 7px; 13 | ` -------------------------------------------------------------------------------- /src/screens/bookmark/edit/disabled/style.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components/native' 2 | import Animated from 'react-native-reanimated' 3 | 4 | export const View = styled(Animated.View)` 5 | z-index: 9999; 6 | position: absolute; 7 | top: 0; 8 | left: 0; 9 | right: 0; 10 | bottom: 0; 11 | background: ${({theme})=>theme.background.alternative}; 12 | ` -------------------------------------------------------------------------------- /src/co/native/ProgressView.js: -------------------------------------------------------------------------------- 1 | import { withTheme } from 'styled-components/native' 2 | import { ProgressView as NativeProgressView } from "@react-native-community/progress-view" 3 | 4 | export const ProgressView = withTheme(props=> 5 | 9 | ) -------------------------------------------------------------------------------- /src/modules/extension/useData.js: -------------------------------------------------------------------------------- 1 | import { useState, useEffect } from 'react' 2 | import { data } from 'modules/extension' 3 | 4 | export default function useProvider() { 5 | const [provider, setProvider] = useState(null) 6 | 7 | useEffect(()=>{ 8 | data() 9 | .then(setProvider) 10 | .catch(setProvider) 11 | }, []) 12 | 13 | return provider 14 | } -------------------------------------------------------------------------------- /src/co/alert/warning.js: -------------------------------------------------------------------------------- 1 | import { Warning, Wrap, Message } from './style' 2 | import Icon from 'co/icon' 3 | 4 | export default ({ message, icon='alert', children })=>( 5 | 6 | 7 | 8 | {message} 9 | 10 | 11 | {children} 12 | 13 | ) -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/co/navigation/header/buttons/style.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components/native' 2 | import CommonButton from 'co/button' 3 | 4 | export const ButtonsWrap = styled.View` 5 | flex-direction: row; 6 | height: 100%; 7 | align-items: center; 8 | ` 9 | 10 | export const Button = styled(CommonButton)` 11 | height: 100%; 12 | padding: ${({theme})=>theme.padding.medium - 4}px; 13 | ` -------------------------------------------------------------------------------- /src/co/navigation/withNavigation.js: -------------------------------------------------------------------------------- 1 | import { useNavigation } from '@react-navigation/native' 2 | 3 | export default function withNavigation(Component) { 4 | return function(props) { 5 | const navigation = useNavigation(); 6 | 7 | return ( 8 | 11 | ) 12 | } 13 | } -------------------------------------------------------------------------------- /src/data/actions/filters.js: -------------------------------------------------------------------------------- 1 | import { 2 | FILTERS_LOAD_PRE, 3 | FILTERS_AUTOLOAD, 4 | } from '../constants/filters' 5 | 6 | export const autoLoad = (spaceId, enabled=false)=>({ 7 | type: FILTERS_AUTOLOAD, 8 | spaceId: String(spaceId), 9 | enabled 10 | }) 11 | 12 | export const load = (spaceId, query)=>({ 13 | type: FILTERS_LOAD_PRE, 14 | spaceId: String(spaceId), 15 | query: query || {} 16 | }) -------------------------------------------------------------------------------- /android/app/src/main/res/layout/empty.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | -------------------------------------------------------------------------------- /src/co/alert/error.js: -------------------------------------------------------------------------------- 1 | import t from 't' 2 | import Icon from 'co/icon' 3 | import { Error, Wrap, Message } from './style' 4 | 5 | export default ({message, children})=>( 6 | 7 | 8 | 9 | {message || t.s('server')} 10 | 11 | 12 | {children} 13 | 14 | ) -------------------------------------------------------------------------------- /src/data/modules/format/url.js: -------------------------------------------------------------------------------- 1 | import { APP_BASE_URL } from '../../constants/app' 2 | 3 | export default function(s=''){ 4 | try{s = s.trim();} catch(e) {if(e)s='';} 5 | 6 | if (s.indexOf('data:')==0) 7 | return '' 8 | 9 | if (s.indexOf('//')==0) 10 | return 'http:'+s; 11 | else if (s.indexOf('/')==0) 12 | return APP_BASE_URL+s; 13 | else 14 | return s; 15 | } -------------------------------------------------------------------------------- /src/modules/format/subscription.js: -------------------------------------------------------------------------------- 1 | import t from 't' 2 | 3 | export const plan = ({ plan, status, stopAt })=>{ 4 | if (!plan) 5 | return '' 6 | 7 | if (plan == 'legacy' || status == 'canceled') 8 | return t.s('until')+' '+stopAt 9 | 10 | if (plan.includes('monthly')) 11 | return t.s('monthly') 12 | 13 | if (plan.includes('annual')) 14 | return t.s('yearly') 15 | } -------------------------------------------------------------------------------- /src/data/actions/rate.js: -------------------------------------------------------------------------------- 1 | import { RATE_LOAD } from '../constants/rate' 2 | import { CONFIG_ACKNOWLEDGE } from '../constants/config' 3 | 4 | //platform: extension_(chrome|opera|edge|safari|firefox), mobile_(ios|android) 5 | export const load = platform=>({ 6 | type: RATE_LOAD, 7 | platform 8 | }) 9 | 10 | export const acknowledge = platform=>({ 11 | type: CONFIG_ACKNOWLEDGE, 12 | key: `rate_${platform}` 13 | }) -------------------------------------------------------------------------------- /src/data/helpers/oauth/normalizeClient.js: -------------------------------------------------------------------------------- 1 | export const normalizeClient = function(client={}) { 2 | return { 3 | _id: String(client._id), 4 | name: client.name || '', 5 | icon: client.icon || '', 6 | site: client.site || '', 7 | description: client.description || '', 8 | 9 | redirects: client.redirects || [], 10 | secret: client.secret || '' 11 | } 12 | } -------------------------------------------------------------------------------- /src/screens/create/types/index.js: -------------------------------------------------------------------------------- 1 | import url from './url' 2 | import file from './file' 3 | 4 | //[status, items, error] 5 | export default function useSave(type, values, options={}) { 6 | switch(type) { 7 | case 'url': return url(values, options) 8 | case 'file': return file(values, options) 9 | default: return ['error', [], new Error('unsupported format')] 10 | } 11 | } -------------------------------------------------------------------------------- /android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/co/segmented/style.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components/native' 2 | import CommonButton from 'co/button' 3 | 4 | export const Wrap = styled.View` 5 | flex-direction: row; 6 | align-items: center; 7 | padding-horizontal: ${({theme})=>theme.padding.medium}px; 8 | padding-vertical: ${({theme})=>theme.padding.small}px; 9 | ` 10 | 11 | export const Button = styled(CommonButton)` 12 | flex: 1; 13 | ` -------------------------------------------------------------------------------- /src/assets/languages/index.json: -------------------------------------------------------------------------------- 1 | { 2 | "de": "Deutsch", 3 | "en": "English", 4 | "es": "Español", 5 | "fr": "Français", 6 | "hi": "हिन्दी", 7 | "it": "Italiano", 8 | "ja": "日本語", 9 | "ko": "한국어", 10 | "nl": "Nederlands", 11 | "pl": "Polski", 12 | "pt_BR": "Português (Brasil)", 13 | "ru": "Русский", 14 | "sv": "Svenska", 15 | "tr": "Türkçe", 16 | "zh-Hans": "中文(汉语)", 17 | "zh-Hant": "中文(漢語)" 18 | } -------------------------------------------------------------------------------- /src/co/bookmarks/selectMode/actions.style.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components/native' 2 | import { SafeAreaView } from 'react-native-safe-area-context' 3 | 4 | export const Wrap = styled(SafeAreaView).attrs({ 5 | edges: ['bottom'] 6 | })` 7 | background: ${({ theme })=>theme.background.alternative}; 8 | flex-direction: row; 9 | position: absolute; 10 | bottom: 0; 11 | left: 0; 12 | right: 0; 13 | ` -------------------------------------------------------------------------------- /src/co/tags/picker/style.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components/native' 2 | import { SafeAreaView } from 'react-native-safe-area-context' 3 | 4 | export const Wrap = styled(SafeAreaView).attrs({ 5 | edges: ['right', 'left'] 6 | })` 7 | flex: 1; 8 | background: ${({theme})=>theme.background.regular}; 9 | ` 10 | 11 | export const Header = styled.View` 12 | flex-direction: row; 13 | align-items: center; 14 | ` -------------------------------------------------------------------------------- /src/screens/settings/files/style.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components/native' 2 | 3 | export const Wrap = styled.View` 4 | align-items: center; 5 | justify-self: center; 6 | ` 7 | 8 | export const Body = styled.View` 9 | width: 270px; 10 | align-items: center; 11 | ` 12 | 13 | export const LeadImage = styled.Image.attrs({ 14 | source: require('./assets/empty.png') 15 | })` 16 | margin-bottom: 30px; 17 | ` -------------------------------------------------------------------------------- /src/screens/settings/profile/index.js: -------------------------------------------------------------------------------- 1 | import { Component } from 'react'; 2 | import t from 't' 3 | import { links } from 'config' 4 | 5 | import { WebView } from 'co/native' 6 | 7 | export default class SettingsProfile extends Component { 8 | static options = { 9 | title: t.s('profile') 10 | } 11 | 12 | render() { 13 | return ( 14 | 15 | ) 16 | } 17 | } -------------------------------------------------------------------------------- /etc/benchmarks/new-collections-memory.md: -------------------------------------------------------------------------------- 1 | just open 2 | old 329 mb 3 | new 272 mb 4 | new2 157 mb windowSize, updateCellsBatchingPeriod 5 | 18% 6 | 52% windowSize, updateCellsBatchingPeriod 7 | 8 | scroll to bottom 9 | old 487 mb 10 | new 353 mb 11 | new 189 mb windowSize, updateCellsBatchingPeriod 12 | 28% 13 | 61% windowSize, updateCellsBatchingPeriod 14 | -------------------------------------------------------------------------------- /src/co/highlights/items/style.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components/native' 2 | import FlatList from 'co/list/flat/basic' 3 | import { SafeAreaView } from 'react-native-safe-area-context' 4 | 5 | export const Wrap = styled(SafeAreaView).attrs({ 6 | edges: ['right', 'left'] 7 | })` 8 | flex: 1; 9 | ` 10 | export const List = styled(FlatList)` 11 | flex: 1; 12 | padding-vertical: ${({theme})=>theme.padding.medium}px; 13 | ` -------------------------------------------------------------------------------- /src/screens/collection/cover/items/empty.style.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components/native' 2 | 3 | export const Wrap = styled.View` 4 | flex: 1; 5 | justify-content: center; 6 | align-items: center; 7 | ` 8 | 9 | export const Message = styled.Text` 10 | margin: ${({theme})=>theme.padding.medium}px; 11 | font-size: ${({theme})=>theme.fontSize.primary}px; 12 | color: ${({theme})=>theme.text.regular}; 13 | text-align: center; 14 | ` -------------------------------------------------------------------------------- /src/screens/extension/init/auth.js: -------------------------------------------------------------------------------- 1 | import { useEffect } from 'react'; 2 | import { useSelector, useDispatch } from 'react-redux' 3 | import { userStatus } from 'data/selectors/user' 4 | import { refresh } from 'data/actions/user' 5 | 6 | export default function useAuth() { 7 | const dispatch = useDispatch() 8 | 9 | useEffect(()=>{ dispatch(refresh()) }, []) 10 | 11 | return useSelector(state=>userStatus(state).authorized) 12 | } -------------------------------------------------------------------------------- /src/screens/settings/backups/index.js: -------------------------------------------------------------------------------- 1 | import { Component } from 'react'; 2 | import t from 't' 3 | import { links } from 'config' 4 | 5 | import { WebView } from 'co/native' 6 | 7 | export default class SettingsBackup extends Component { 8 | static options = { 9 | title: t.s('backups') 10 | } 11 | 12 | render() { 13 | return ( 14 | 16 | ) 17 | } 18 | } -------------------------------------------------------------------------------- /src/data/sagas/collections/index.js: -------------------------------------------------------------------------------- 1 | import { all } from 'redux-saga/effects' 2 | import items from './items' 3 | import groups from './groups' 4 | import single from './single' 5 | import drafts from './drafts' 6 | import sharing from './sharing' 7 | import selectMode from './selectMode' 8 | 9 | export default function* () { 10 | yield all([ 11 | items(), 12 | groups(), 13 | single(), 14 | drafts(), 15 | sharing(), 16 | selectMode() 17 | ]) 18 | } -------------------------------------------------------------------------------- /src/modules/translate/component.js: -------------------------------------------------------------------------------- 1 | import { useEffect } from 'react'; 2 | import { Platform } from 'react-native' 3 | import { useSelector } from 'react-redux' 4 | import t from './index' 5 | 6 | export default function TranslateComponent({ children }) { 7 | const lang = useSelector(state=>state.config.lang) 8 | 9 | useEffect(()=>{ 10 | if (Platform.OS == 'android') 11 | t.setLocale(lang) 12 | }, []) 13 | 14 | return children 15 | } -------------------------------------------------------------------------------- /src/screens/create/loading/style.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components/native' 2 | 3 | export const Backdrop = styled.View` 4 | background: #00000050; 5 | flex: 1; 6 | position: absolute; 7 | top: 0; 8 | bottom: 0; 9 | left: 0; 10 | right: 0; 11 | justify-content: center; 12 | align-items: center; 13 | ` 14 | 15 | export const Text = styled.Text` 16 | font-size: 16px; 17 | color: ${({theme})=>theme.text.regular}; 18 | ` -------------------------------------------------------------------------------- /android/app/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | #F7F7F7 3 | true 4 | 5 | #F7F7F7 6 | 7 | @android:color/black 8 | false 9 | 10 | #1988E0 11 | -------------------------------------------------------------------------------- /src/screens/bookmark/edit/date.js: -------------------------------------------------------------------------------- 1 | import t from 't' 2 | import { SectionText } from 'co/style/section' 3 | import { ShortDate } from 'modules/format/date' 4 | 5 | export default function({ item: { created }, status }) { 6 | if (status != 'loaded' && 7 | status != 'removed') 8 | return null 9 | 10 | return ( 11 | 12 | {t.s('addSuccess')} 13 | 14 | ) 15 | } -------------------------------------------------------------------------------- /src/screens/bookmark/edit/indicators/broken.js: -------------------------------------------------------------------------------- 1 | import t from 't' 2 | import { Form } from 'co/form' 3 | import { Warning } from 'co/alert' 4 | 5 | export default function IndicatorBroken({ item: { broken } }) { 6 | if (!broken) 7 | return null 8 | 9 | return ( 10 |
11 | 14 | 15 | ) 16 | } -------------------------------------------------------------------------------- /src/data/actions/predictions.js: -------------------------------------------------------------------------------- 1 | import * as c from '../constants/predictions' 2 | import wrapFunc from '../utils/wrapFunc' 3 | 4 | export const load = ()=>({ 5 | type: c.PREDICTIONS_LOAD_REQ 6 | }) 7 | 8 | export const patch = (details)=>({ 9 | type: c.PREDICTION_PATCH, 10 | ...details 11 | }) 12 | 13 | export const apply = (_id, onSuccess, onFail)=>({ 14 | type: c.PREDICTION_APPLY_REQ, 15 | _id, 16 | onSuccess: wrapFunc(onSuccess), 17 | onFail: wrapFunc(onFail) 18 | }) -------------------------------------------------------------------------------- /src/screens/browser/auto.js: -------------------------------------------------------------------------------- 1 | import { store } from 'data' 2 | import chrome from './chrome' 3 | import system from './system' 4 | 5 | export default async function({ navigation, bookmark }) { 6 | const { browser } = store.getState().local 7 | 8 | switch (browser) { 9 | case 'chrome': return chrome({bookmark}) 10 | case 'system': return system({bookmark}) 11 | default: navigation.navigate('browser/internal', { bookmark }) 12 | } 13 | } -------------------------------------------------------------------------------- /src/co/user/avatar/index.js: -------------------------------------------------------------------------------- 1 | import { Image } from './style' 2 | import Icon from 'co/icon' 3 | 4 | export default ({ avatar, width=24 })=>{ 5 | if (!avatar) 6 | return ( 7 | 12 | ) 13 | 14 | return ( 15 | 18 | ) 19 | } -------------------------------------------------------------------------------- /ios/safari-extension/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | NSExtension 6 | 7 | NSExtensionPointIdentifier 8 | com.apple.Safari.web-extension 9 | NSExtensionPrincipalClass 10 | SafariWebExtensionHandler 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": ".", 4 | "paths": { 5 | "assets/*": ["./src/assets/*"], 6 | "co/*": ["./src/co/*"], 7 | "data/*": ["./src/data/*"], 8 | "local/*": ["./src/local/*"], 9 | "modules/*": ["./src/modules/*"], 10 | "screens/*": ["./src/screens/*"], 11 | "t/*": ["./src/modules/translate/*"] 12 | } 13 | }, 14 | "exclude": ["node_modules"] 15 | } -------------------------------------------------------------------------------- /src/data/constants/predictions.js: -------------------------------------------------------------------------------- 1 | export const 2 | PREDICTIONS_LOAD_REQ = 'PREDICTIONS_LOAD_REQ', 3 | PREDICTIONS_LOAD_SUCCESS = 'PREDICTIONS_LOAD_SUCCESS', 4 | PREDICTIONS_LOAD_ERROR = 'PREDICTIONS_LOAD_ERROR', 5 | 6 | PREDICTION_PATCH = 'PREDICTION_PATCH', 7 | 8 | PREDICTION_APPLY_REQ = 'PREDICTION_APPLY_REQ', 9 | PREDICTION_APPLY_SUCCESS = 'PREDICTION_APPLY_SUCCESS', 10 | PREDICTION_APPLY_ERROR = 'PREDICTION_APPLY_ERROR' -------------------------------------------------------------------------------- /src/screens/extension/auth/style.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components/native' 2 | 3 | export const Wrap = styled.View` 4 | flex: 1; 5 | justify-content: center; 6 | align-items: center; 7 | background-color: ${({theme})=>theme.background.regular}; 8 | ` 9 | 10 | export const Message = styled.Text` 11 | margin: ${({theme})=>theme.padding.medium}px; 12 | font-size: ${({theme})=>theme.fontSize.primary}px; 13 | color: ${({theme})=>theme.text.regular}; 14 | text-align: center; 15 | ` -------------------------------------------------------------------------------- /ios/Modules/iPadDropViewManager.m: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | 4 | #import "iPadDropViewManager.h" 5 | #import "iPadDropView.h" 6 | 7 | @implementation iPadDropViewManager 8 | 9 | #pragma mark - Props 10 | 11 | 12 | #pragma mark - Setup and view handling 13 | 14 | RCT_EXPORT_MODULE() 15 | 16 | RCT_EXPORT_VIEW_PROPERTY(onDrop, RCTBubblingEventBlock) 17 | 18 | - (iPadDropView *)view { 19 | return [[iPadDropView alloc] init]; 20 | } 21 | 22 | @end 23 | 24 | -------------------------------------------------------------------------------- /ios/rn3/Images.xcassets/background.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "white.png" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "black.png", 10 | "appearances" : [ 11 | { 12 | "appearance" : "luminosity", 13 | "value" : "dark" 14 | } 15 | ] 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /src/co/collections/items/found.js: -------------------------------------------------------------------------------- 1 | import t from 't' 2 | import { SectionView, SectionText } from 'co/style/section' 3 | 4 | export default function SelectedSection({ data, treeProps: { options={} } }) { 5 | if (!options.search || !data.length) 6 | return null 7 | 8 | return ( 9 | 10 | {t.s('found')} {data.length-(options.showCreateNew===false ? 0 : 1)} {t.s('collectionsCount')} 11 | 12 | ) 13 | } -------------------------------------------------------------------------------- /src/screens/settings/index.js: -------------------------------------------------------------------------------- 1 | export { default as Menu } from './menu' 2 | export { default as Backups } from './backups' 3 | export { default as Browser } from './browser' 4 | export { default as Files } from './files' 5 | export { Status as ProStatus, Purchase as ProPurchase } from './pro' 6 | export { default as Profile } from './profile' 7 | export { default as Appearance } from './appearance' 8 | export { default as Language } from './language' 9 | export { default as ShareExtension } from './share_extension' -------------------------------------------------------------------------------- /src/screens/settings/logout/item.js: -------------------------------------------------------------------------------- 1 | import t from 't' 2 | import { connect } from 'react-redux' 3 | import { logout } from 'data/actions/user' 4 | 5 | import Goto from 'co/goto' 6 | 7 | function LogoutItem({ last, logout }){ 8 | return ( 9 | 14 | ) 15 | } 16 | 17 | export default connect( 18 | undefined, 19 | { logout } 20 | )(LogoutItem) -------------------------------------------------------------------------------- /src/screens/bookmark/edit/indicators/index.js: -------------------------------------------------------------------------------- 1 | import Removed from './removed' 2 | import Broken from './broken' 3 | import Duplicate from './duplicate' 4 | 5 | export default function BookmarkEditIndicators(props) { 6 | if (props.status != 'loaded' && 7 | props.status != 'removed') 8 | return null 9 | 10 | return ( 11 | <> 12 | 13 | 14 | 15 | 16 | ) 17 | } -------------------------------------------------------------------------------- /src/data/sagas/bookmarks/index.js: -------------------------------------------------------------------------------- 1 | import { all } from 'redux-saga/effects' 2 | import draft from './draft' 3 | import single from './single' 4 | import space from './space' 5 | import selectMode from './selectMode' 6 | import html from './html' 7 | import recent from './recent' 8 | import highlights from './highlights' 9 | 10 | export default function* () { 11 | yield all([ 12 | space(), 13 | single(), 14 | draft(), 15 | selectMode(), 16 | html(), 17 | recent(), 18 | highlights() 19 | ]) 20 | } -------------------------------------------------------------------------------- /ios/rn3/Images.xcassets/splashLogo.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "splash-logo-light.pdf" 6 | }, 7 | { 8 | "idiom" : "universal", 9 | "filename" : "splash-logo-dark.pdf", 10 | "appearances" : [ 11 | { 12 | "appearance" : "luminosity", 13 | "value" : "dark" 14 | } 15 | ] 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /src/screens/collection/cover/items/style.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components/native' 2 | import FlatList from 'co/list/flat/basic' 3 | 4 | export const Wrap = styled.View` 5 | flex: 1; 6 | ` 7 | 8 | const ListFooterComponent = styled.View` 9 | height: 50px; 10 | ` 11 | 12 | export const Grid = styled(FlatList).attrs({ 13 | ListFooterComponent 14 | })` 15 | flex: 1; 16 | padding-top: ${({theme})=>theme.padding.small}px; 17 | padding-horizontal: ${({theme})=>theme.padding.small}px; 18 | ` -------------------------------------------------------------------------------- /src/screens/collection/index.js: -------------------------------------------------------------------------------- 1 | export { default as Edit } from './edit' 2 | export { default as Add } from './add' 3 | export { default as Remove } from './remove' 4 | export { default as Cover } from './cover' 5 | export { default as Sort } from './sort' 6 | export { default as View } from './view' 7 | export { default as Path } from './path' 8 | export { default as Sharing } from './sharing/home' 9 | export { default as SharingAdd } from './sharing/add' 10 | export { default as SharingEdit } from './sharing/edit' -------------------------------------------------------------------------------- /src/modules/format/date/locale.js: -------------------------------------------------------------------------------- 1 | import t from 't' 2 | 3 | let _cache = {} 4 | const localCodes = { 5 | 'pt_BR': 'ptBR', 6 | 'zh-Hans': 'zhCN', 7 | 'zh-Hant': 'zhTW' 8 | } 9 | 10 | const obj = { 11 | get locale() { 12 | if (typeof _cache[t.locale] == 'undefined') 13 | _cache[t.locale] = require('date-fns/locale')[localCodes[t.locale]||t.locale] || null 14 | 15 | return _cache[t.locale] 16 | } 17 | } 18 | const locale = obj.locale 19 | 20 | export { 21 | locale 22 | } -------------------------------------------------------------------------------- /ios/.xcode.env: -------------------------------------------------------------------------------- 1 | # This `.xcode.env` file is versioned and is used to source the environment 2 | # used when running script phases inside Xcode. 3 | # To customize your local environment, you can create an `.xcode.env.local` 4 | # file that is not versioned. 5 | # NODE_BINARY variable contains the PATH to the node executable. 6 | # 7 | # Customize the NODE_BINARY variable here. 8 | # For example, to use nvm with brew, add the following line 9 | # . "$(brew --prefix nvm)/nvm.sh" --no-use 10 | export NODE_BINARY=$(command -v node) -------------------------------------------------------------------------------- /src/data/modules/format/thumb.js: -------------------------------------------------------------------------------- 1 | import normalizeURL from './url' 2 | import { RENDER_URL, WORKERS_BASE_URL, LEGACY_WORKERS_BASE_URL } from '../../constants/app' 3 | 4 | export default function(url='') { 5 | let finalURL = normalizeURL(url) 6 | if (!finalURL) 7 | return '' 8 | 9 | if (finalURL.includes(WORKERS_BASE_URL) || 10 | finalURL.includes(LEGACY_WORKERS_BASE_URL)) 11 | return finalURL.replace(/width=\d+/, 'a') 12 | 13 | return RENDER_URL+'/'+encodeURIComponent(finalURL) 14 | } -------------------------------------------------------------------------------- /src/data/sagas/tags/items.js: -------------------------------------------------------------------------------- 1 | import { put, takeLatest } from 'redux-saga/effects' 2 | 3 | import { 4 | TAGS_REORDER, 5 | } from '../../constants/tags' 6 | 7 | import { USER_UPDATE_REQ } from '../../constants/user' 8 | 9 | //Requests 10 | export default function* () { 11 | //Reorder persist 12 | yield takeLatest([TAGS_REORDER], reorder) 13 | } 14 | 15 | function* reorder({ method }) { 16 | yield put({ 17 | type: USER_UPDATE_REQ, 18 | user: { 19 | config: { 20 | tags_sort: method 21 | } 22 | } 23 | }) 24 | } -------------------------------------------------------------------------------- /android/app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | ALWAYS_SEND 3 | ALWAYS_SEND 4 | Raindrop 5 | Collections 6 | Recent 7 | Search 8 | 9 | Raindrop.io 10 | -------------------------------------------------------------------------------- /src/co/segmented/index.js: -------------------------------------------------------------------------------- 1 | import { Wrap, Button } from './style' 2 | 3 | export default function Segmented({ selectedIndex=-1, values=[], onChange }) { 4 | return ( 5 | 6 | {values.map((title, index)=>( 7 | 18 | 19 | ) 20 | } -------------------------------------------------------------------------------- /src/data/selectors/search/recent.js: -------------------------------------------------------------------------------- 1 | import { createSelector } from 'reselect' 2 | 3 | const emptyArray = [] 4 | 5 | //(state, spaceId, filter, fullquery) -> [] 6 | export const makeRecent = ()=>createSelector( 7 | [ 8 | ({bookmarks={}})=>bookmarks.recent.search, 9 | (state, spaceId, filter, fullquery)=>fullquery, 10 | ], 11 | (recent, fullquery)=>{ 12 | if (!fullquery) return recent 13 | 14 | const filtered = recent.filter(({query})=>query.startsWith(fullquery)) 15 | 16 | //do not show only one recent that exactly the same as full query 17 | if (filtered.length == 1 && filtered[0].query == fullquery) 18 | return emptyArray 19 | 20 | return filtered 21 | } 22 | ) -------------------------------------------------------------------------------- /src/co/bookmarks/footer/view.js: -------------------------------------------------------------------------------- 1 | import t from 't' 2 | import { ActivityIndicator } from 'co/native' 3 | import { FooterView } from './style' 4 | import Button from 'co/button' 5 | 6 | const SpaceFooter = ({status, count, onNextPage})=>{ 7 | var content; 8 | 9 | switch(status.nextPage){ 10 | case 'error': content =