mirror of
https://github.com/streetwriters/notesnook.git
synced 2025-12-16 19:57:52 +01:00
Merge pull request #8839 from streetwriters/mobile-release-3.3.6
Mobile release 3.3.6
This commit is contained in:
5
.github/workflows/android.e2e.yml
vendored
5
.github/workflows/android.e2e.yml
vendored
@@ -47,6 +47,11 @@ jobs:
|
|||||||
- name: Install Detox CLI
|
- name: Install Detox CLI
|
||||||
run: npm install detox-cli --global
|
run: npm install detox-cli --global
|
||||||
|
|
||||||
|
- name: Check for typescript errors
|
||||||
|
run: |
|
||||||
|
cd apps/mobile
|
||||||
|
npx tsc --noEmit
|
||||||
|
|
||||||
- name: Detox build
|
- name: Detox build
|
||||||
run: |
|
run: |
|
||||||
yarn build:android
|
yarn build:android
|
||||||
|
|||||||
@@ -73,6 +73,12 @@ jobs:
|
|||||||
- name: CCache Stats Before Build
|
- name: CCache Stats Before Build
|
||||||
run: ccache -sv
|
run: ccache -sv
|
||||||
|
|
||||||
|
- name: Check for typescript errors
|
||||||
|
run: |
|
||||||
|
npm run tx mobile:build
|
||||||
|
cd apps/mobile
|
||||||
|
npx tsc --noEmit
|
||||||
|
|
||||||
- name: Build unsigned app bundle
|
- name: Build unsigned app bundle
|
||||||
run: yarn release:android:bundle
|
run: yarn release:android:bundle
|
||||||
|
|
||||||
|
|||||||
6
.github/workflows/android.publish.yml
vendored
6
.github/workflows/android.publish.yml
vendored
@@ -73,6 +73,12 @@ jobs:
|
|||||||
- name: CCache Stats Before Build
|
- name: CCache Stats Before Build
|
||||||
run: ccache -sv
|
run: ccache -sv
|
||||||
|
|
||||||
|
- name: Check for typescript errors
|
||||||
|
run: |
|
||||||
|
npm run tx mobile:build
|
||||||
|
cd apps/mobile
|
||||||
|
npx tsc --noEmit
|
||||||
|
|
||||||
- name: Build unsigned app bundle
|
- name: Build unsigned app bundle
|
||||||
run: yarn release:android:bundle
|
run: yarn release:android:bundle
|
||||||
|
|
||||||
|
|||||||
6
.github/workflows/ios.publish.yml
vendored
6
.github/workflows/ios.publish.yml
vendored
@@ -64,6 +64,12 @@ jobs:
|
|||||||
bundle install
|
bundle install
|
||||||
RCT_NEW_ARCH_ENABLED=0 bundle exec pod install
|
RCT_NEW_ARCH_ENABLED=0 bundle exec pod install
|
||||||
|
|
||||||
|
- name: Check for typescript errors
|
||||||
|
run: |
|
||||||
|
npm run tx mobile:build
|
||||||
|
cd apps/mobile
|
||||||
|
npx tsc --noEmit
|
||||||
|
|
||||||
- name: CCache Stats Before Build
|
- name: CCache Stats Before Build
|
||||||
run: ccache -sv
|
run: ccache -sv
|
||||||
|
|
||||||
|
|||||||
@@ -94,7 +94,9 @@ export async function encryptDatabaseKeyWithPassword(appLockPassword: string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export async function restoreDatabaseKeyToKeyChain(appLockPassword: string) {
|
export async function restoreDatabaseKeyToKeyChain(appLockPassword: string) {
|
||||||
const databaseKeyCipher: Cipher = CipherStorage.getMap(DB_KEY_CIPHER);
|
const databaseKeyCipher: Cipher = CipherStorage.getMap(
|
||||||
|
DB_KEY_CIPHER
|
||||||
|
) as Cipher;
|
||||||
const databaseKey = (await decrypt(
|
const databaseKey = (await decrypt(
|
||||||
{
|
{
|
||||||
password: appLockPassword
|
password: appLockPassword
|
||||||
@@ -135,7 +137,9 @@ export async function clearAppLockVerificationCipher() {
|
|||||||
|
|
||||||
export async function validateAppLockPassword(appLockPassword: string) {
|
export async function validateAppLockPassword(appLockPassword: string) {
|
||||||
try {
|
try {
|
||||||
const appLockCipher: Cipher = CipherStorage.getMap(APPLOCK_CIPHER);
|
const appLockCipher: Cipher = CipherStorage.getMap(
|
||||||
|
APPLOCK_CIPHER
|
||||||
|
) as Cipher;
|
||||||
if (!appLockCipher) return true;
|
if (!appLockCipher) return true;
|
||||||
const key = await Sodium.deriveKey(appLockPassword, appLockCipher.salt);
|
const key = await Sodium.deriveKey(appLockPassword, appLockCipher.salt);
|
||||||
const decrypted = await decrypt(key, appLockCipher);
|
const decrypted = await decrypt(key, appLockCipher);
|
||||||
@@ -159,7 +163,9 @@ export function clearDatabaseKey() {
|
|||||||
export async function getDatabaseKey(appLockPassword?: string) {
|
export async function getDatabaseKey(appLockPassword?: string) {
|
||||||
if (DB_KEY) return DB_KEY;
|
if (DB_KEY) return DB_KEY;
|
||||||
if (appLockPassword) {
|
if (appLockPassword) {
|
||||||
const databaseKeyCipher: Cipher = CipherStorage.getMap("databaseKeyCipher");
|
const databaseKeyCipher: Cipher = CipherStorage.getMap(
|
||||||
|
"databaseKeyCipher"
|
||||||
|
) as Cipher;
|
||||||
const databaseKey = await decrypt(
|
const databaseKey = await decrypt(
|
||||||
{
|
{
|
||||||
password: appLockPassword
|
password: appLockPassword
|
||||||
@@ -293,7 +299,7 @@ export async function deriveCryptoKey(data: SerializedKey) {
|
|||||||
|
|
||||||
export async function getCryptoKey() {
|
export async function getCryptoKey() {
|
||||||
try {
|
try {
|
||||||
const keyCipher: Cipher = MMKV.getMap(USER_KEY_CIPHER);
|
const keyCipher: Cipher = MMKV.getMap(USER_KEY_CIPHER) as Cipher;
|
||||||
if (!keyCipher) {
|
if (!keyCipher) {
|
||||||
DatabaseLogger.info("User key cipher is null");
|
DatabaseLogger.info("User key cipher is null");
|
||||||
return undefined;
|
return undefined;
|
||||||
|
|||||||
@@ -136,6 +136,12 @@ export const Storage: IStorage = {
|
|||||||
clear(): Promise<void> {
|
clear(): Promise<void> {
|
||||||
return DefaultStorage.clear();
|
return DefaultStorage.clear();
|
||||||
},
|
},
|
||||||
|
generateCryptoKeyPair() {
|
||||||
|
throw new Error("Not implemented");
|
||||||
|
},
|
||||||
|
decryptAsymmetric() {
|
||||||
|
throw new Error("Not implemented");
|
||||||
|
},
|
||||||
getAllKeys(): Promise<string[]> {
|
getAllKeys(): Promise<string[]> {
|
||||||
return DefaultStorage.getAllKeys();
|
return DefaultStorage.getAllKeys();
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -99,7 +99,7 @@ export const useLogin = (
|
|||||||
callback && callback(false);
|
callback && callback(false);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
callback && callback(false);
|
callback && callback(false);
|
||||||
if (e.message === "invalid_grant") {
|
if ((e as Error).message === "invalid_grant") {
|
||||||
eSendEvent(eCloseSimpleDialog, "two_factor_verify");
|
eSendEvent(eCloseSimpleDialog, "two_factor_verify");
|
||||||
setLoading(false);
|
setLoading(false);
|
||||||
setStep(LoginSteps.emailAuth);
|
setStep(LoginSteps.emailAuth);
|
||||||
|
|||||||
@@ -35,29 +35,35 @@ import SheetProvider from "../sheet-provider";
|
|||||||
import RateAppSheet from "../sheets/rate-app";
|
import RateAppSheet from "../sheets/rate-app";
|
||||||
import RecoveryKeySheet from "../sheets/recovery-key";
|
import RecoveryKeySheet from "../sheets/recovery-key";
|
||||||
import Progress from "../dialogs/progress";
|
import Progress from "../dialogs/progress";
|
||||||
|
import { useSettingStore } from "../../stores/use-setting-store";
|
||||||
|
|
||||||
const DialogProvider = () => {
|
const DialogProvider = () => {
|
||||||
const { colors } = useThemeColors();
|
const { colors } = useThemeColors();
|
||||||
|
const isAppLoading = useSettingStore((state) => state.isAppLoading);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<AppLockPassword />
|
<AppLockPassword />
|
||||||
<LoadingDialog />
|
<LoadingDialog />
|
||||||
<Dialog context="global" />
|
|
||||||
<AuthModal colors={colors} />
|
|
||||||
<MergeConflicts />
|
|
||||||
<RecoveryKeySheet colors={colors} />
|
|
||||||
<SheetProvider />
|
<SheetProvider />
|
||||||
<SheetProvider context="sync_progress" />
|
<SheetProvider context="sync_progress" />
|
||||||
<ResultDialog />
|
<Dialog context="global" />
|
||||||
<VaultDialog colors={colors} />
|
|
||||||
<RateAppSheet />
|
|
||||||
<ImagePreview />
|
|
||||||
<AnnouncementDialog />
|
|
||||||
<SessionExpired />
|
|
||||||
<PDFPreview />
|
|
||||||
<JumpToSectionDialog />
|
|
||||||
<Progress />
|
<Progress />
|
||||||
|
|
||||||
|
{isAppLoading ? null : (
|
||||||
|
<>
|
||||||
|
<MergeConflicts />
|
||||||
|
<RecoveryKeySheet colors={colors} />
|
||||||
|
<ResultDialog />
|
||||||
|
<VaultDialog colors={colors} />
|
||||||
|
<RateAppSheet />
|
||||||
|
<ImagePreview />
|
||||||
|
<AnnouncementDialog />
|
||||||
|
<SessionExpired />
|
||||||
|
<PDFPreview />
|
||||||
|
<JumpToSectionDialog />
|
||||||
|
</>
|
||||||
|
)}
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ export const openNotebook = (item: Notebook | BaseTrashItem<Notebook>) => {
|
|||||||
positiveText: strings.restore(),
|
positiveText: strings.restore(),
|
||||||
negativeText: strings.delete(),
|
negativeText: strings.delete(),
|
||||||
positivePress: async () => {
|
positivePress: async () => {
|
||||||
if ((await db.trash.restore(item.id)) === false) return;
|
await db.trash.restore(item.id);
|
||||||
Navigation.queueRoutesForUpdate();
|
Navigation.queueRoutesForUpdate();
|
||||||
useSelectionStore.getState().setSelectionMode(undefined);
|
useSelectionStore.getState().setSelectionMode(undefined);
|
||||||
ToastManager.show({
|
ToastManager.show({
|
||||||
|
|||||||
@@ -44,6 +44,7 @@ import Config from "react-native-config";
|
|||||||
import * as RNIap from "react-native-iap";
|
import * as RNIap from "react-native-iap";
|
||||||
import { SafeAreaView } from "react-native-safe-area-context";
|
import { SafeAreaView } from "react-native-safe-area-context";
|
||||||
import Icon from "react-native-vector-icons/MaterialCommunityIcons";
|
import Icon from "react-native-vector-icons/MaterialCommunityIcons";
|
||||||
|
//@ts-ignore
|
||||||
import ToggleSwitch from "toggle-switch-react-native";
|
import ToggleSwitch from "toggle-switch-react-native";
|
||||||
import {
|
import {
|
||||||
ANDROID_POLICE_SVG,
|
ANDROID_POLICE_SVG,
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ import {
|
|||||||
View
|
View
|
||||||
} from "react-native";
|
} from "react-native";
|
||||||
import Icon from "react-native-vector-icons/MaterialCommunityIcons";
|
import Icon from "react-native-vector-icons/MaterialCommunityIcons";
|
||||||
|
//@ts-ignore
|
||||||
import ToggleSwitch from "toggle-switch-react-native";
|
import ToggleSwitch from "toggle-switch-react-native";
|
||||||
import { db } from "../../../common/database";
|
import { db } from "../../../common/database";
|
||||||
import { requestInAppReview } from "../../../services/app-review";
|
import { requestInAppReview } from "../../../services/app-review";
|
||||||
|
|||||||
@@ -1,67 +0,0 @@
|
|||||||
/*
|
|
||||||
This file is part of the Notesnook project (https://notesnook.com/)
|
|
||||||
|
|
||||||
Copyright (C) 2023 Streetwriters (Private) Limited
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import { useEffect, useState } from "react";
|
|
||||||
import { Platform } from "react-native";
|
|
||||||
import { Subscription } from "react-native-iap";
|
|
||||||
import PremiumService from "../services/premium";
|
|
||||||
import { db } from "../common/database";
|
|
||||||
import { Product } from "@notesnook/core";
|
|
||||||
|
|
||||||
const skuInfos: { [name: string]: Product | undefined } = {};
|
|
||||||
|
|
||||||
export const usePricing = (period: "monthly" | "yearly") => {
|
|
||||||
const [current, setCurrent] = useState<{
|
|
||||||
period: string;
|
|
||||||
info?: Product;
|
|
||||||
product?: Subscription;
|
|
||||||
}>();
|
|
||||||
|
|
||||||
const getDefaultSku = (period: "monthly" | "yearly") => {
|
|
||||||
return period === "monthly"
|
|
||||||
? "com.streetwriters.notesnook.sub.mo"
|
|
||||||
: "com.streetwriters.notesnook.sub.yr";
|
|
||||||
};
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
(async () => {
|
|
||||||
const skuInfo =
|
|
||||||
skuInfos[period] ||
|
|
||||||
(await db.pricing?.sku(
|
|
||||||
Platform.OS === "android" ? "android" : "ios",
|
|
||||||
period
|
|
||||||
));
|
|
||||||
skuInfos[period] = skuInfo;
|
|
||||||
|
|
||||||
const products = (await (
|
|
||||||
await PremiumService.loadProductsAndSubs()
|
|
||||||
).subs) as Subscription[];
|
|
||||||
let product = products.find((p) => p.productId === skuInfo?.sku);
|
|
||||||
if (!product)
|
|
||||||
product = products.find((p) => p.productId === getDefaultSku(period));
|
|
||||||
setCurrent({
|
|
||||||
info: skuInfo,
|
|
||||||
period,
|
|
||||||
product
|
|
||||||
});
|
|
||||||
})();
|
|
||||||
}, [period]);
|
|
||||||
|
|
||||||
return current;
|
|
||||||
};
|
|
||||||
@@ -185,7 +185,7 @@ export default function DebugLogs() {
|
|||||||
paragraph: strings.clearLogsConfirmation(currentLog.key),
|
paragraph: strings.clearLogsConfirmation(currentLog.key),
|
||||||
negativeText: strings.cancel(),
|
negativeText: strings.cancel(),
|
||||||
positiveText: strings.clear(),
|
positiveText: strings.clear(),
|
||||||
positivePress: () => {
|
positivePress: async () => {
|
||||||
const index = logs.findIndex((l) => (l.key = currentLog.key));
|
const index = logs.findIndex((l) => (l.key = currentLog.key));
|
||||||
logManager?.delete(currentLog.key);
|
logManager?.delete(currentLog.key);
|
||||||
if (logs.length > 1) {
|
if (logs.length > 1) {
|
||||||
|
|||||||
@@ -2,7 +2,8 @@ import { CirclePartner, SubscriptionStatus } from "@notesnook/core";
|
|||||||
import { strings } from "@notesnook/intl";
|
import { strings } from "@notesnook/intl";
|
||||||
import { useThemeColors } from "@notesnook/theme";
|
import { useThemeColors } from "@notesnook/theme";
|
||||||
import Clipboard from "@react-native-clipboard/clipboard";
|
import Clipboard from "@react-native-clipboard/clipboard";
|
||||||
import { useEffect, useState } from "react";
|
import { useState } from "react";
|
||||||
|
import { useAsync } from "react-async-hook";
|
||||||
import {
|
import {
|
||||||
ActivityIndicator,
|
ActivityIndicator,
|
||||||
Image,
|
Image,
|
||||||
@@ -13,6 +14,7 @@ import {
|
|||||||
import { db } from "../../common/database";
|
import { db } from "../../common/database";
|
||||||
import AppIcon from "../../components/ui/AppIcon";
|
import AppIcon from "../../components/ui/AppIcon";
|
||||||
import { Button } from "../../components/ui/button";
|
import { Button } from "../../components/ui/button";
|
||||||
|
import { Notice } from "../../components/ui/notice";
|
||||||
import Heading from "../../components/ui/typography/heading";
|
import Heading from "../../components/ui/typography/heading";
|
||||||
import Paragraph from "../../components/ui/typography/paragraph";
|
import Paragraph from "../../components/ui/typography/paragraph";
|
||||||
import { ToastManager } from "../../services/event-manager";
|
import { ToastManager } from "../../services/event-manager";
|
||||||
@@ -21,8 +23,8 @@ import PremiumService from "../../services/premium";
|
|||||||
import { useUserStore } from "../../stores/use-user-store";
|
import { useUserStore } from "../../stores/use-user-store";
|
||||||
import { AppFontSize, defaultBorderRadius } from "../../utils/size";
|
import { AppFontSize, defaultBorderRadius } from "../../utils/size";
|
||||||
import { DefaultAppStyles } from "../../utils/styles";
|
import { DefaultAppStyles } from "../../utils/styles";
|
||||||
import { useAsync } from "react-async-hook";
|
import { openLinkInBrowser } from "../../utils/functions";
|
||||||
import { Notice } from "../../components/ui/notice";
|
import { Pressable } from "../../components/ui/pressable";
|
||||||
|
|
||||||
export const NotesnookCircle = () => {
|
export const NotesnookCircle = () => {
|
||||||
const user = useUserStore((state) => state.user);
|
const user = useUserStore((state) => state.user);
|
||||||
@@ -156,32 +158,53 @@ const Partner = ({
|
|||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
) : (
|
) : (
|
||||||
<TouchableOpacity
|
<>
|
||||||
style={{
|
<TouchableOpacity
|
||||||
backgroundColor: colors.secondary.background,
|
style={{
|
||||||
borderRadius: defaultBorderRadius,
|
backgroundColor: colors.secondary.background,
|
||||||
alignItems: "center",
|
borderRadius: defaultBorderRadius,
|
||||||
justifyContent: "center",
|
alignItems: "center",
|
||||||
padding: DefaultAppStyles.GAP_SMALL,
|
justifyContent: "center",
|
||||||
borderWidth: 0.5,
|
padding: DefaultAppStyles.GAP_SMALL,
|
||||||
borderColor: colors.secondary.border,
|
borderWidth: 0.5,
|
||||||
flexDirection: "row",
|
borderColor: colors.secondary.border,
|
||||||
gap: DefaultAppStyles.GAP_SMALL
|
flexDirection: "row",
|
||||||
}}
|
gap: DefaultAppStyles.GAP_SMALL
|
||||||
activeOpacity={0.9}
|
}}
|
||||||
onPress={() => {
|
activeOpacity={0.9}
|
||||||
Clipboard.setString(code);
|
onPress={() => {
|
||||||
}}
|
Clipboard.setString(code);
|
||||||
>
|
}}
|
||||||
<Paragraph
|
|
||||||
size={AppFontSize.lg}
|
|
||||||
color={colors.secondary.paragraph}
|
|
||||||
>
|
>
|
||||||
{code}
|
<Paragraph
|
||||||
</Paragraph>
|
size={AppFontSize.lg}
|
||||||
|
color={colors.secondary.paragraph}
|
||||||
|
>
|
||||||
|
{code}
|
||||||
|
</Paragraph>
|
||||||
|
|
||||||
<AppIcon name="content-copy" />
|
<AppIcon name="content-copy" />
|
||||||
</TouchableOpacity>
|
</TouchableOpacity>
|
||||||
|
|
||||||
|
{item.codeRedeemUrl ? (
|
||||||
|
<Pressable
|
||||||
|
onPress={() => {
|
||||||
|
if (item.codeRedeemUrl) {
|
||||||
|
openLinkInBrowser(
|
||||||
|
item.codeRedeemUrl.replace("{{code}}", code)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Paragraph
|
||||||
|
color={colors.secondary.paragraph}
|
||||||
|
size={AppFontSize.xxs}
|
||||||
|
>
|
||||||
|
{strings.clickToDirectlyClaimPromo()}
|
||||||
|
</Paragraph>
|
||||||
|
</Pressable>
|
||||||
|
) : null}
|
||||||
|
</>
|
||||||
)}
|
)}
|
||||||
</>
|
</>
|
||||||
) : null}
|
) : null}
|
||||||
|
|||||||
@@ -26,18 +26,17 @@ import {
|
|||||||
import React, { useEffect, useRef, useState } from "react";
|
import React, { useEffect, useRef, useState } from "react";
|
||||||
import { ActivityIndicator, TextInput, View } from "react-native";
|
import { ActivityIndicator, TextInput, View } from "react-native";
|
||||||
import Icon from "react-native-vector-icons/MaterialCommunityIcons";
|
import Icon from "react-native-vector-icons/MaterialCommunityIcons";
|
||||||
//@ts-ignore
|
|
||||||
import { FeatureResult, useIsFeatureAvailable } from "@notesnook/common";
|
import { FeatureResult, useIsFeatureAvailable } from "@notesnook/common";
|
||||||
import { strings } from "@notesnook/intl";
|
//@ts-ignore
|
||||||
import ToggleSwitch from "toggle-switch-react-native";
|
import ToggleSwitch from "toggle-switch-react-native";
|
||||||
import PaywallSheet from "../../components/sheets/paywall";
|
import PaywallSheet from "../../components/sheets/paywall";
|
||||||
|
import AppIcon from "../../components/ui/AppIcon";
|
||||||
import { IconButton } from "../../components/ui/icon-button";
|
import { IconButton } from "../../components/ui/icon-button";
|
||||||
import Input from "../../components/ui/input";
|
import Input from "../../components/ui/input";
|
||||||
import { Pressable } from "../../components/ui/pressable";
|
import { Pressable } from "../../components/ui/pressable";
|
||||||
import Seperator from "../../components/ui/seperator";
|
import Seperator from "../../components/ui/seperator";
|
||||||
import Heading from "../../components/ui/typography/heading";
|
import Heading from "../../components/ui/typography/heading";
|
||||||
import Paragraph from "../../components/ui/typography/paragraph";
|
import Paragraph from "../../components/ui/typography/paragraph";
|
||||||
import { ToastManager } from "../../services/event-manager";
|
|
||||||
import SettingsService from "../../services/settings";
|
import SettingsService from "../../services/settings";
|
||||||
import useNavigationStore from "../../stores/use-navigation-store";
|
import useNavigationStore from "../../stores/use-navigation-store";
|
||||||
import { SettingStore, useSettingStore } from "../../stores/use-setting-store";
|
import { SettingStore, useSettingStore } from "../../stores/use-setting-store";
|
||||||
@@ -45,7 +44,6 @@ import { AppFontSize } from "../../utils/size";
|
|||||||
import { DefaultAppStyles } from "../../utils/styles";
|
import { DefaultAppStyles } from "../../utils/styles";
|
||||||
import { components } from "./components";
|
import { components } from "./components";
|
||||||
import { RouteParams, SettingSection } from "./types";
|
import { RouteParams, SettingSection } from "./types";
|
||||||
import AppIcon from "../../components/ui/AppIcon";
|
|
||||||
|
|
||||||
const _SectionItem = ({ item }: { item: SettingSection }) => {
|
const _SectionItem = ({ item }: { item: SettingSection }) => {
|
||||||
const { colors } = useThemeColors();
|
const { colors } = useThemeColors();
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ import React from "react";
|
|||||||
import { Appearance, Linking, Platform } from "react-native";
|
import { Appearance, Linking, Platform } from "react-native";
|
||||||
import { getVersion } from "react-native-device-info";
|
import { getVersion } from "react-native-device-info";
|
||||||
import * as RNIap from "react-native-iap";
|
import * as RNIap from "react-native-iap";
|
||||||
|
//@ts-ignore
|
||||||
import { enabled } from "react-native-privacy-snapshot";
|
import { enabled } from "react-native-privacy-snapshot";
|
||||||
import ScreenGuardModule from "react-native-screenguard";
|
import ScreenGuardModule from "react-native-screenguard";
|
||||||
import { DatabaseLogger, db } from "../../common/database";
|
import { DatabaseLogger, db } from "../../common/database";
|
||||||
|
|||||||
@@ -580,7 +580,7 @@ function openSettingsDialog(context: string) {
|
|||||||
positivePress:
|
positivePress:
|
||||||
Platform.OS === "ios"
|
Platform.OS === "ios"
|
||||||
? undefined
|
? undefined
|
||||||
: () => {
|
: async () => {
|
||||||
resolve(true);
|
resolve(true);
|
||||||
},
|
},
|
||||||
onClose: () => {
|
onClose: () => {
|
||||||
|
|||||||
@@ -124,7 +124,7 @@ android {
|
|||||||
minSdkVersion rootProject.ext.minSdkVersion
|
minSdkVersion rootProject.ext.minSdkVersion
|
||||||
targetSdkVersion rootProject.ext.targetSdkVersion
|
targetSdkVersion rootProject.ext.targetSdkVersion
|
||||||
multiDexEnabled true
|
multiDexEnabled true
|
||||||
versionCode 3074
|
versionCode 3075
|
||||||
versionName getNpmVersion()
|
versionName getNpmVersion()
|
||||||
testBuildType System.getProperty('testBuildType', 'debug')
|
testBuildType System.getProperty('testBuildType', 'debug')
|
||||||
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
|
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
|
||||||
|
|||||||
@@ -1,5 +1,3 @@
|
|||||||
- Collapsible Headings
|
|
||||||
- Notesnook Circle
|
|
||||||
- Minor bug fixes and improvements
|
- Minor bug fixes and improvements
|
||||||
|
|
||||||
Thank you for using Notesnook!
|
Thank you for using Notesnook!
|
||||||
@@ -1091,7 +1091,7 @@
|
|||||||
CODE_SIGN_IDENTITY = "Apple Development";
|
CODE_SIGN_IDENTITY = "Apple Development";
|
||||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Apple Development";
|
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Apple Development";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 2153;
|
CURRENT_PROJECT_VERSION = 2154;
|
||||||
DEVELOPMENT_TEAM = 53CWBG3QUC;
|
DEVELOPMENT_TEAM = 53CWBG3QUC;
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64;
|
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64;
|
||||||
@@ -1165,7 +1165,7 @@
|
|||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 3.3.5;
|
MARKETING_VERSION = 3.3.6;
|
||||||
OTHER_LDFLAGS = (
|
OTHER_LDFLAGS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"-ObjC",
|
"-ObjC",
|
||||||
@@ -1196,7 +1196,7 @@
|
|||||||
CODE_SIGN_IDENTITY = "Apple Development";
|
CODE_SIGN_IDENTITY = "Apple Development";
|
||||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
|
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
|
||||||
CODE_SIGN_STYLE = Manual;
|
CODE_SIGN_STYLE = Manual;
|
||||||
CURRENT_PROJECT_VERSION = 2153;
|
CURRENT_PROJECT_VERSION = 2154;
|
||||||
DEVELOPMENT_TEAM = "";
|
DEVELOPMENT_TEAM = "";
|
||||||
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = 53CWBG3QUC;
|
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = 53CWBG3QUC;
|
||||||
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64;
|
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64;
|
||||||
@@ -1270,7 +1270,7 @@
|
|||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 3.3.5;
|
MARKETING_VERSION = 3.3.6;
|
||||||
ONLY_ACTIVE_ARCH = NO;
|
ONLY_ACTIVE_ARCH = NO;
|
||||||
OTHER_LDFLAGS = (
|
OTHER_LDFLAGS = (
|
||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
@@ -1429,7 +1429,7 @@
|
|||||||
CODE_SIGN_IDENTITY = "Apple Development";
|
CODE_SIGN_IDENTITY = "Apple Development";
|
||||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Apple Development";
|
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "Apple Development";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 2153;
|
CURRENT_PROJECT_VERSION = 2154;
|
||||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||||
DEVELOPMENT_TEAM = 53CWBG3QUC;
|
DEVELOPMENT_TEAM = 53CWBG3QUC;
|
||||||
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64;
|
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64;
|
||||||
@@ -1441,7 +1441,7 @@
|
|||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
"@executable_path/../../Frameworks",
|
"@executable_path/../../Frameworks",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 3.3.5;
|
MARKETING_VERSION = 3.3.6;
|
||||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||||
MTL_FAST_MATH = YES;
|
MTL_FAST_MATH = YES;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = org.streetwriters.notesnook.notewidget;
|
PRODUCT_BUNDLE_IDENTIFIER = org.streetwriters.notesnook.notewidget;
|
||||||
@@ -1472,7 +1472,7 @@
|
|||||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
|
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
|
||||||
CODE_SIGN_STYLE = Manual;
|
CODE_SIGN_STYLE = Manual;
|
||||||
COPY_PHASE_STRIP = NO;
|
COPY_PHASE_STRIP = NO;
|
||||||
CURRENT_PROJECT_VERSION = 2153;
|
CURRENT_PROJECT_VERSION = 2154;
|
||||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||||
DEVELOPMENT_TEAM = "";
|
DEVELOPMENT_TEAM = "";
|
||||||
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = 53CWBG3QUC;
|
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = 53CWBG3QUC;
|
||||||
@@ -1485,7 +1485,7 @@
|
|||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
"@executable_path/../../Frameworks",
|
"@executable_path/../../Frameworks",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 3.3.5;
|
MARKETING_VERSION = 3.3.6;
|
||||||
MTL_FAST_MATH = YES;
|
MTL_FAST_MATH = YES;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = org.streetwriters.notesnook.notewidget;
|
PRODUCT_BUNDLE_IDENTIFIER = org.streetwriters.notesnook.notewidget;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
@@ -1515,7 +1515,7 @@
|
|||||||
CODE_SIGN_ENTITLEMENTS = "Make Note/Make Note.entitlements";
|
CODE_SIGN_ENTITLEMENTS = "Make Note/Make Note.entitlements";
|
||||||
CODE_SIGN_IDENTITY = "Apple Development";
|
CODE_SIGN_IDENTITY = "Apple Development";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 2153;
|
CURRENT_PROJECT_VERSION = 2154;
|
||||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||||
DEVELOPMENT_TEAM = 53CWBG3QUC;
|
DEVELOPMENT_TEAM = 53CWBG3QUC;
|
||||||
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64;
|
"EXCLUDED_ARCHS[sdk=iphonesimulator*]" = arm64;
|
||||||
@@ -1596,7 +1596,7 @@
|
|||||||
"@executable_path/../../Frameworks",
|
"@executable_path/../../Frameworks",
|
||||||
);
|
);
|
||||||
LIBRARY_SEARCH_PATHS = "$(SDKROOT)/usr/lib/swift$(inherited)";
|
LIBRARY_SEARCH_PATHS = "$(SDKROOT)/usr/lib/swift$(inherited)";
|
||||||
MARKETING_VERSION = 3.3.5;
|
MARKETING_VERSION = 3.3.6;
|
||||||
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
|
||||||
MTL_FAST_MATH = YES;
|
MTL_FAST_MATH = YES;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = org.streetwriters.notesnook.share;
|
PRODUCT_BUNDLE_IDENTIFIER = org.streetwriters.notesnook.share;
|
||||||
@@ -1627,7 +1627,7 @@
|
|||||||
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
|
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution";
|
||||||
CODE_SIGN_STYLE = Manual;
|
CODE_SIGN_STYLE = Manual;
|
||||||
COPY_PHASE_STRIP = NO;
|
COPY_PHASE_STRIP = NO;
|
||||||
CURRENT_PROJECT_VERSION = 2153;
|
CURRENT_PROJECT_VERSION = 2154;
|
||||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||||
DEVELOPMENT_TEAM = "";
|
DEVELOPMENT_TEAM = "";
|
||||||
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = 53CWBG3QUC;
|
"DEVELOPMENT_TEAM[sdk=iphoneos*]" = 53CWBG3QUC;
|
||||||
@@ -1709,7 +1709,7 @@
|
|||||||
"@executable_path/../../Frameworks",
|
"@executable_path/../../Frameworks",
|
||||||
);
|
);
|
||||||
LIBRARY_SEARCH_PATHS = "$(SDKROOT)/usr/lib/swift$(inherited)";
|
LIBRARY_SEARCH_PATHS = "$(SDKROOT)/usr/lib/swift$(inherited)";
|
||||||
MARKETING_VERSION = 3.3.5;
|
MARKETING_VERSION = 3.3.6;
|
||||||
MTL_FAST_MATH = YES;
|
MTL_FAST_MATH = YES;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = org.streetwriters.notesnook.share;
|
PRODUCT_BUNDLE_IDENTIFIER = org.streetwriters.notesnook.share;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
|
|||||||
@@ -72,10 +72,10 @@
|
|||||||
"react-native-begin-background-task": "github:blockfirm/react-native-begin-background-task",
|
"react-native-begin-background-task": "github:blockfirm/react-native-begin-background-task",
|
||||||
"react-native-privacy-snapshot": "github:standardnotes/react-native-privacy-snapshot",
|
"react-native-privacy-snapshot": "github:standardnotes/react-native-privacy-snapshot",
|
||||||
"@ammarahmed/react-native-fingerprint-scanner": "^5.0.0",
|
"@ammarahmed/react-native-fingerprint-scanner": "^5.0.0",
|
||||||
"@ammarahmed/react-native-share-extension": "^2.9.0",
|
|
||||||
"react-native-pager-view": "^6.5.1",
|
"react-native-pager-view": "^6.5.1",
|
||||||
"react-native-tab-view": "^4.0.2",
|
"react-native-tab-view": "^4.0.2",
|
||||||
"react-native-orientation-locker": "^1.7.0"
|
"react-native-orientation-locker": "^1.7.0",
|
||||||
|
"@ammarahmed/react-native-share-extension": "^2.9.5"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/core": "^7.27.1",
|
"@babel/core": "^7.27.1",
|
||||||
|
|||||||
12
apps/mobile/package-lock.json
generated
12
apps/mobile/package-lock.json
generated
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "@notesnook/mobile",
|
"name": "@notesnook/mobile",
|
||||||
"version": "3.3.5",
|
"version": "3.3.6",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "@notesnook/mobile",
|
"name": "@notesnook/mobile",
|
||||||
"version": "3.3.5",
|
"version": "3.3.6",
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"license": "GPL-3.0-or-later",
|
"license": "GPL-3.0-or-later",
|
||||||
"workspaces": [
|
"workspaces": [
|
||||||
@@ -28326,7 +28326,7 @@
|
|||||||
"@ammarahmed/react-native-background-fetch": "^4.2.2",
|
"@ammarahmed/react-native-background-fetch": "^4.2.2",
|
||||||
"@ammarahmed/react-native-eventsource": "1.1.0",
|
"@ammarahmed/react-native-eventsource": "1.1.0",
|
||||||
"@ammarahmed/react-native-fingerprint-scanner": "^5.0.0",
|
"@ammarahmed/react-native-fingerprint-scanner": "^5.0.0",
|
||||||
"@ammarahmed/react-native-share-extension": "^2.9.0",
|
"@ammarahmed/react-native-share-extension": "^2.9.5",
|
||||||
"@ammarahmed/react-native-sodium": "^1.6.5",
|
"@ammarahmed/react-native-sodium": "^1.6.5",
|
||||||
"@bam.tech/react-native-image-resizer": "3.0.11",
|
"@bam.tech/react-native-image-resizer": "3.0.11",
|
||||||
"@callstack/repack": "~5.1.2",
|
"@callstack/repack": "~5.1.2",
|
||||||
@@ -28472,9 +28472,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@ammarahmed/react-native-share-extension": {
|
"node_modules/@ammarahmed/react-native-share-extension": {
|
||||||
"version": "2.9.0",
|
"version": "2.9.5",
|
||||||
"resolved": "https://registry.npmjs.org/@ammarahmed/react-native-share-extension/-/react-native-share-extension-2.9.0.tgz",
|
"resolved": "https://registry.npmjs.org/@ammarahmed/react-native-share-extension/-/react-native-share-extension-2.9.5.tgz",
|
||||||
"integrity": "sha512-iEkpJQFZL5/WDPh7iRCLZREANgaaAHthDsPaAYT6sI4wieQcHZMBAnfRMwBEnC0BZ0WVxbQZdzJYez+dmwpr2g==",
|
"integrity": "sha512-UTE8TSxkx+RFNgSJCCfD5FSdQ5IuMOsZzuuy0BVy46emRrpPw1fedJTtDbqyKrU8fwtKEIbzJWeQtjjRZlHxjQ==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"react-native": "^0.63.1"
|
"react-native": "^0.63.1"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@notesnook/mobile",
|
"name": "@notesnook/mobile",
|
||||||
"version": "3.3.5",
|
"version": "3.3.6",
|
||||||
"private": true,
|
"private": true,
|
||||||
"license": "GPL-3.0-or-later",
|
"license": "GPL-3.0-or-later",
|
||||||
"workspaces": [
|
"workspaces": [
|
||||||
@@ -56,4 +56,4 @@
|
|||||||
"react": "18.2.0",
|
"react": "18.2.0",
|
||||||
"react-native": "0.77.2"
|
"react-native": "0.77.2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,11 +68,10 @@ export const useShareStore = create((set) => ({
|
|||||||
let appendNote = MMKV.getString(StorageKeys.appendNote);
|
let appendNote = MMKV.getString(StorageKeys.appendNote);
|
||||||
let selectedNotebooks = MMKV.getString(StorageKeys.selectedNotebooks);
|
let selectedNotebooks = MMKV.getString(StorageKeys.selectedNotebooks);
|
||||||
let selectedTags = MMKV.getString(StorageKeys.selectedTag);
|
let selectedTags = MMKV.getString(StorageKeys.selectedTag);
|
||||||
appendNote = JSON.parse(appendNote);
|
|
||||||
set({
|
set({
|
||||||
appendNote: appendNote,
|
appendNote: appendNote,
|
||||||
selectedNotebooks: selectedNotebooks ? JSON.parse(selectedNotebooks) : [],
|
selectedNotebooks: selectedNotebooks ? JSON.parse(selectedNotebooks) : [],
|
||||||
selectedTag: selectedTags ? JSON.parse(selectedTags) : []
|
selectedTags: selectedTags ? JSON.parse(selectedTags) : []
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
selectedTags: [],
|
selectedTags: [],
|
||||||
|
|||||||
@@ -15,10 +15,7 @@
|
|||||||
"@notesnook/theme": ["../../packages/theme"],
|
"@notesnook/theme": ["../../packages/theme"],
|
||||||
"@types/react": ["./node_modules/@types/react"],
|
"@types/react": ["./node_modules/@types/react"],
|
||||||
"react": ["./node_modules/react"]
|
"react": ["./node_modules/react"]
|
||||||
},
|
}
|
||||||
"incremental": true,
|
|
||||||
"maxNodeModuleJsDepth": 5,
|
|
||||||
"downlevelIteration": true
|
|
||||||
},
|
},
|
||||||
"exclude": ["native", "e2e"]
|
"exclude": ["native", "e2e"]
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
3
fastlane/metadata/android/en-US/changelogs/15379.txt
Normal file
3
fastlane/metadata/android/en-US/changelogs/15379.txt
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
- Minor bug fixes and improvements
|
||||||
|
|
||||||
|
Thank you for using Notesnook!
|
||||||
@@ -34,7 +34,11 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.ProseMirror > :first-child {
|
.ProseMirror > :first-child {
|
||||||
margin-top: 0.4em !important;
|
margin-top: 5px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ProseMirror:first-child {
|
||||||
|
margin-top: 0px !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
#root {
|
#root {
|
||||||
|
|||||||
@@ -580,7 +580,8 @@ const Tiptap = ({
|
|||||||
display: "flex",
|
display: "flex",
|
||||||
alignItems: "center",
|
alignItems: "center",
|
||||||
padding: "0px 16px",
|
padding: "0px 16px",
|
||||||
paddingBottom: "6px"
|
paddingBottom: "3px",
|
||||||
|
boxSizing: "border-box"
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<StatusBar
|
<StatusBar
|
||||||
|
|||||||
@@ -77,26 +77,19 @@ function StatusBar({
|
|||||||
fontSize: 12,
|
fontSize: 12,
|
||||||
color: "var(--nn_secondary_paragraph)",
|
color: "var(--nn_secondary_paragraph)",
|
||||||
paddingBottom: 0,
|
paddingBottom: 0,
|
||||||
|
fontFamily: "Inter",
|
||||||
userSelect: "none"
|
userSelect: "none"
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<p
|
||||||
style={{
|
onMouseDown={(e) => {
|
||||||
display: "flex",
|
setShowChars(!showChars);
|
||||||
height: "25px",
|
|
||||||
alignItems: "center"
|
|
||||||
}}
|
}}
|
||||||
|
style={paragraphStyle}
|
||||||
>
|
>
|
||||||
<p
|
{showChars ? strings.charactersCount(chars) : words}
|
||||||
onMouseDown={(e) => {
|
</p>
|
||||||
setShowChars(!showChars);
|
|
||||||
}}
|
|
||||||
style={paragraphStyle}
|
|
||||||
>
|
|
||||||
{showChars ? strings.charactersCount(chars) : words}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -55,7 +55,6 @@ function Tags(props: { settings: Settings; loading?: boolean }) {
|
|||||||
style={{
|
style={{
|
||||||
display: "flex",
|
display: "flex",
|
||||||
alignItems: "center",
|
alignItems: "center",
|
||||||
minHeight: "25px",
|
|
||||||
opacity: props.loading ? 0 : 1,
|
opacity: props.loading ? 0 : 1,
|
||||||
gap: 6
|
gap: 6
|
||||||
}}
|
}}
|
||||||
|
|||||||
@@ -1580,6 +1580,10 @@ msgstr ""
|
|||||||
"\n"
|
"\n"
|
||||||
"**Only use this for troubleshooting purposes. If you are having persistent issues, it is recommended that you reach out to us via support@streetwriters.co so we can help you resolve it permanently.**"
|
"**Only use this for troubleshooting purposes. If you are having persistent issues, it is recommended that you reach out to us via support@streetwriters.co so we can help you resolve it permanently.**"
|
||||||
|
|
||||||
|
#: src/strings.ts:2606
|
||||||
|
msgid "Click here to directly claim the promotion."
|
||||||
|
msgstr "Click here to directly claim the promotion."
|
||||||
|
|
||||||
#: src/strings.ts:239
|
#: src/strings.ts:239
|
||||||
msgid "Click to deselect"
|
msgid "Click to deselect"
|
||||||
msgstr "Click to deselect"
|
msgstr "Click to deselect"
|
||||||
|
|||||||
@@ -1569,6 +1569,10 @@ msgid ""
|
|||||||
"**Only use this for troubleshooting purposes. If you are having persistent issues, it is recommended that you reach out to us via support@streetwriters.co so we can help you resolve it permanently.**"
|
"**Only use this for troubleshooting purposes. If you are having persistent issues, it is recommended that you reach out to us via support@streetwriters.co so we can help you resolve it permanently.**"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
#: src/strings.ts:2606
|
||||||
|
msgid "Click here to directly claim the promotion."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: src/strings.ts:239
|
#: src/strings.ts:239
|
||||||
msgid "Click to deselect"
|
msgid "Click to deselect"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|||||||
@@ -2601,5 +2601,7 @@ Use this if changes from other devices are not appearing on this device. This wi
|
|||||||
freeUserCircleNotice: () =>
|
freeUserCircleNotice: () =>
|
||||||
t`The Notesnook Circle is exclusive to subscribers. Please consider subscribing to gain access to Notesnook Circle and enjoy additional benefits.`,
|
t`The Notesnook Circle is exclusive to subscribers. Please consider subscribing to gain access to Notesnook Circle and enjoy additional benefits.`,
|
||||||
finishPurchaseInBrowser: () => t`Finish your purchase in the browser.`,
|
finishPurchaseInBrowser: () => t`Finish your purchase in the browser.`,
|
||||||
goBack: () => t`Go back`
|
goBack: () => t`Go back`,
|
||||||
|
clickToDirectlyClaimPromo: () =>
|
||||||
|
t`Click here to directly claim the promotion.`
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user