Skip to content

Commit e41150c

Browse files
feat: Enhance manga support and update dependencies (#68)
* fix: update dependencies and improve Google Sign-In handling; add keychain access groups * fix: update subproject commit reference in InkNest-Externals * fix: update subproject commit reference in InkNest-Externals * feat: enhance Library and Search screens with manga support - Added manga data fetching and display in the Library screen. - Implemented tab navigation for Comics and Manga in the Library. - Integrated manga search functionality in the Search screen. - Updated UI components to accommodate manga results and improve user experience. - Refactored state management for better handling of search results across multiple sources. * feat: add release notes for InkNest v1.4.6 with Manga support and various improvements * feat: implement v1.4.6 walkthrough feature with animated SVGs and Redux integration * feat: enhance ReadAllComic results rendering with additional details and improved layout * feat: add comic background color customization with color picker in settings and comic book screens * feat: add enhanced ReadAllComic results and custom background color options in walkthrough * chore: update v1.4.6 blog post - Update v1.4.6 blog post to document ReadAllComic enhancement feature - Update v1.4.6 blog post to document background color customization feature * feat: update feature flag implementation for iOS version checks across multiple components * chore: release v1.4.6 * feat: refactor background color picker modal to use a single modal view state * chore: release v1.4.6 final
2 parents 1051f7f + 6716508 commit e41150c

33 files changed

Lines changed: 3542 additions & 717 deletions

App.js

Lines changed: 71 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,88 @@
1-
import React, { useEffect, useState } from 'react';
2-
import { Provider } from 'react-redux';
3-
import { PersistGate } from 'redux-persist/integration/react';
4-
import {
5-
initializeStore,
6-
store,
1+
import React, {useEffect, useState} from 'react';
2+
import {Provider, useSelector, useDispatch} from 'react-redux';
3+
import {PersistGate} from 'redux-persist/integration/react';
4+
import {
5+
initializeStore,
6+
store,
77
persistor,
8-
isStoreReady
8+
isStoreReady,
99
} from './src/Redux/Store';
10-
import { GestureHandlerRootView } from 'react-native-gesture-handler';
11-
import { RootNavigation } from './src/Navigation';
10+
import {GestureHandlerRootView} from 'react-native-gesture-handler';
11+
import {RootNavigation} from './src/Navigation';
1212
import Loading from './src/Components/UIComp/Loading';
1313
import Toast from 'react-native-toast-message';
14-
import { PaperProvider } from 'react-native-paper';
14+
import {PaperProvider} from 'react-native-paper';
1515
import ForceUpdate from './src/Components/ForceUpdate';
16-
import { ConfigCatProvider } from 'configcat-react';
17-
import { CONFIGCAT_SDK_KEY_TEST, CONFIGCAT_SDK_KEY_PROD } from '@env';
18-
import { BannerProvider } from './src/Components/UIComp/AnimeAdBanner/BannerContext';
16+
import {ConfigCatProvider} from 'configcat-react';
17+
import {CONFIGCAT_SDK_KEY_TEST, CONFIGCAT_SDK_KEY_PROD} from '@env';
18+
import {BannerProvider} from './src/Components/UIComp/AnimeAdBanner/BannerContext';
1919
import crashlytics from '@react-native-firebase/crashlytics';
2020
import analytics from '@react-native-firebase/analytics';
2121
import {
2222
configureGoogleSignIn,
2323
listenToAuthChanges,
2424
} from './src/InkNest-Externals/Community/Logic/CommunityActions';
2525
import NotificationSubscriptionBootstrapper from './src/InkNest-Externals/Notifications/components/NotificationSubscriptionBootstrapper';
26+
import V146Walkthrough from './src/Components/Walkthrough/V146Walkthrough';
27+
import {markV146WalkthroughSeen} from './src/Redux/Reducers';
28+
29+
import {getVersion} from 'react-native-device-info';
30+
import {useFeatureFlag} from 'configcat-react';
31+
32+
/**
33+
* WalkthroughHandler - handles v1.4.6 walkthrough visibility
34+
* Must be inside Provider to use Redux hooks
35+
*/
36+
function WalkthroughHandler() {
37+
const {value: forIosValue, loading: forIosLoading} = useFeatureFlag(
38+
'forIos',
39+
getVersion(),
40+
);
41+
const dispatch = useDispatch();
42+
const hasSeenV146Walkthrough = useSelector(
43+
state => state.data.hasSeenV146Walkthrough,
44+
);
45+
const [showWalkthrough, setShowWalkthrough] = useState(false);
46+
47+
useEffect(() => {
48+
if (getVersion() === forIosValue && forIosLoading === false) {
49+
return;
50+
} else {
51+
if (forIosLoading === false) {
52+
// Show walkthrough if not seen before (after PersistGate rehydrates state)
53+
if (hasSeenV146Walkthrough === false) {
54+
setShowWalkthrough(true);
55+
}
56+
}
57+
}
58+
}, [hasSeenV146Walkthrough, forIosValue, forIosLoading]);
59+
60+
const handleWalkthroughComplete = () => {
61+
dispatch(markV146WalkthroughSeen());
62+
setShowWalkthrough(false);
63+
};
64+
65+
const handleWalkthroughClose = () => {
66+
dispatch(markV146WalkthroughSeen());
67+
setShowWalkthrough(false);
68+
};
69+
70+
return (
71+
<V146Walkthrough
72+
visible={showWalkthrough}
73+
onClose={handleWalkthroughClose}
74+
onComplete={handleWalkthroughComplete}
75+
/>
76+
);
77+
}
2678

2779
/**
2880
* AppContent component - rendered after store is initialized
2981
*/
3082
function AppContent() {
3183
useEffect(() => {
3284
configureGoogleSignIn();
33-
const unsubscribeAuth = store.dispatch(listenToAuthChanges());
85+
store.dispatch(listenToAuthChanges());
3486

3587
if (!__DEV__) {
3688
crashlytics().log('App mounted.');
@@ -44,10 +96,6 @@ function AppContent() {
4496
};
4597
ErrorUtils.setGlobalHandler(errorHandler);
4698
}
47-
48-
return () => {
49-
if (unsubscribeAuth) unsubscribeAuth();
50-
};
5199
}, []);
52100

53101
return (
@@ -59,6 +107,7 @@ function AppContent() {
59107
<RootNavigation />
60108
<Toast />
61109
<ForceUpdate />
110+
<WalkthroughHandler />
62111
</BannerProvider>
63112
</PaperProvider>
64113
</PersistGate>
@@ -78,11 +127,11 @@ const App = () => {
78127
async function setupApp() {
79128
try {
80129
console.log('[App] Starting app setup...');
81-
130+
82131
// Initialize store
83132
console.log('[App] Initializing store...');
84133
initializeStore();
85-
134+
86135
if (!isStoreReady()) {
87136
throw new Error('Store initialization failed');
88137
}
@@ -106,14 +155,14 @@ const App = () => {
106155

107156
if (!isReady) {
108157
return (
109-
<GestureHandlerRootView style={{ flex: 1 }}>
158+
<GestureHandlerRootView style={{flex: 1}}>
110159
<Loading />
111160
</GestureHandlerRootView>
112161
);
113162
}
114163

115164
return (
116-
<GestureHandlerRootView style={{ flex: 1 }}>
165+
<GestureHandlerRootView style={{flex: 1}}>
117166
<ConfigCatProvider
118167
sdkKey={__DEV__ ? CONFIGCAT_SDK_KEY_TEST : CONFIGCAT_SDK_KEY_PROD}>
119168
<AppContent />

android/app/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,8 @@ android {
8585
applicationId "com.p2devs.inknest"
8686
minSdkVersion rootProject.ext.minSdkVersion
8787
targetSdkVersion rootProject.ext.targetSdkVersion
88-
versionCode 34
89-
versionName "1.4.5"
88+
versionCode 35
89+
versionName "1.4.6"
9090

9191
// Increase memory allocated to Gradle
9292
dexOptions {
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
---
2+
slug: release-v1.4.6
3+
title: InkNest v1.4.6 Release
4+
authors: [p2devs]
5+
tags: [release]
6+
draft: true
7+
---
8+
9+
# 📢 InkNest v1.4.6 Release Announcement
10+
11+
Hey everyone! 🎉 We're excited to announce **InkNest v1.4.6** is now available!
12+
13+
This release is a big one — InkNest now supports **Manga** as a first-class content type alongside Comics. We've also improved authentication, storage, ad blocking, and squashed several bugs.
14+
15+
<!-- truncate -->
16+
17+
## ✨ What's New
18+
19+
#### Manga Support (Library & Search)
20+
- **Manga tab in Library** — Browse and manage your manga collection with a dedicated tab alongside Comics
21+
- **Manga search integration** — Search across manga sources directly from the Search screen with multi-source results
22+
- **Manga history cards** — New `MangaHistoryCard` component with reading progress tracking
23+
- **Manga bookmarks** — Dedicated `MangaBookmarks` screen for managing your saved manga
24+
- Refactored state management for better handling of search results across multiple content types
25+
26+
#### Manga Reading Progress (MangaBook Screen)
27+
- **Reading progress tracking** via Redux — your place is saved as you read manga chapters
28+
- Seamless resume reading experience across sessions
29+
30+
#### Manga Bookmarking (MangaDetails Screen)
31+
- **Bookmark manga** with visual feedback directly from the details screen
32+
- Integrated with the new MangaBookmarks section
33+
34+
#### Enhanced ReadAllComic Search Results
35+
- **Rich result cards** with cover images, publisher info, and issue counts
36+
- **Latest chapter updates** displayed directly in search results
37+
- Improved layout with visual badges and metadata for better discoverability
38+
39+
#### Comic Background Color Customization
40+
- **5 background color options**: Default, White, Black, Sepia, and Cream
41+
- **Color picker modal** accessible from Settings screen
42+
- **Per-comic customization** — change background directly from the comic reader
43+
- Automatic text color adjustment for light/dark backgrounds
44+
45+
#### LinkListScreen Redesign (Web Sources)
46+
- **Animated card transitions** for a smoother browsing experience
47+
- **Filter functionality** for better source management and discovery
48+
- Refactored styles for consistency and improved UI
49+
50+
## 🔧 Improvements
51+
52+
#### Storage Migration — AsyncStorage → MMKV
53+
- **Removed AsyncStorage** migration utility and related functions
54+
- **Notification handling** now uses `mmkvStorage` for faster, more reliable storage
55+
- Cleaner storage layer with no legacy migration overhead
56+
57+
#### Google Sign-In & Keychain
58+
- Updated dependencies for Google Sign-In
59+
- Added **keychain access groups** for improved credential handling on iOS
60+
61+
#### FCM Token Rate Limiting
62+
- Implemented **rate limiting and debounce** for FCM token user sync to prevent excessive network calls
63+
64+
#### WebView Enhancements
65+
- **iOS select picker dismiss** — Prevents crashes during navigation when select pickers are open
66+
- Whitelisted Cloudflare challenge domains for smoother browsing
67+
- **Safety timeout** for ad block rule preparation
68+
- Inline media playback support and improved error handling for content process termination
69+
- Updated loading text for better user experience
70+
71+
#### Ad Blocking
72+
- Updated ad block rules with improved detection logic
73+
- Enhanced `AdBlockRules` and `WebSourcesList` for more effective ad filtering
74+
75+
## 🐛 Bug Fixes
76+
- Fixed iOS crashes caused by undismissed select pickers during WebView navigation
77+
- Improved WebView stability with better content process termination handling
78+
- Cleaned up unnecessary code in `WebViewComponent`
79+
80+
**Update now** to explore the new Manga support and enjoy a smoother reading experience! 📚✨
81+
82+
As always, if you encounter any issues, please report them in our issues channel. Happy reading! 🦋

ios/InkNest.xcodeproj/project.pbxproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -622,7 +622,7 @@
622622
"$(inherited)",
623623
"@executable_path/Frameworks",
624624
);
625-
MARKETING_VERSION = 1.4.5;
625+
MARKETING_VERSION = 1.4.6;
626626
OTHER_LDFLAGS = (
627627
"$(inherited)",
628628
"-ObjC",
@@ -655,7 +655,7 @@
655655
"$(inherited)",
656656
"@executable_path/Frameworks",
657657
);
658-
MARKETING_VERSION = 1.4.5;
658+
MARKETING_VERSION = 1.4.6;
659659
OTHER_LDFLAGS = (
660660
"$(inherited)",
661661
"-ObjC",

ios/InkNest/InkNest.entitlements

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,9 @@
88
<array>
99
<string>Default</string>
1010
</array>
11+
<key>keychain-access-groups</key>
12+
<array>
13+
<string>$(AppIdentifierPrefix)com.p2devs.inknest</string>
14+
</array>
1115
</dict>
1216
</plist>

ios/Podfile.lock

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1384,7 +1384,7 @@ PODS:
13841384
- GoogleDataTransport (10.1.0):
13851385
- nanopb (~> 3.30910.0)
13861386
- PromisesObjC (~> 2.4)
1387-
- GoogleSignIn (9.0.0):
1387+
- GoogleSignIn (9.1.0):
13881388
- AppAuth (~> 2.0)
13891389
- AppCheckCore (~> 11.0)
13901390
- GTMAppAuth (~> 5.0)
@@ -3296,7 +3296,7 @@ PODS:
32963296
- React-perflogger
32973297
- React-utils (= 0.76.9)
32983298
- RecaptchaInterop (100.0.0)
3299-
- RNAppleAuthentication (2.5.0):
3299+
- RNAppleAuthentication (2.5.1):
33003300
- React-Core
33013301
- RNCAsyncStorage (2.1.2):
33023302
- DoubleConversion
@@ -3420,7 +3420,7 @@ PODS:
34203420
- ReactCommon/turbomodule/bridging
34213421
- ReactCommon/turbomodule/core
34223422
- Yoga
3423-
- RNGoogleSignin (16.0.0):
3423+
- RNGoogleSignin (16.1.1):
34243424
- DoubleConversion
34253425
- glog
34263426
- GoogleSignIn (~> 9.0)
@@ -4048,7 +4048,7 @@ SPEC CHECKSUMS:
40484048
Google-Mobile-Ads-SDK: 1dfb0c3cb46c7e2b00b0f4de74a1e06d9ea25d67
40494049
GoogleAppMeasurement: 0471a5b5bff51f3a91b1e76df22c952d04c63967
40504050
GoogleDataTransport: aae35b7ea0c09004c3797d53c8c41f66f219d6a7
4051-
GoogleSignIn: c7f09cfbc85a1abf69187be091997c317cc33b77
4051+
GoogleSignIn: fcee2257188d5eda57a5e2b6a715550ffff9206d
40524052
GoogleUserMessagingPlatform: a8b56893477f67212fbc8411c139e61d463349f5
40534053
GoogleUtilities: 00c88b9a86066ef77f0da2fab05f65d7768ed8e1
40544054
"gRPC-C++": 2fa52b3141e7789a28a737f251e0c45b4cb20a87
@@ -4126,7 +4126,7 @@ SPEC CHECKSUMS:
41264126
ReactCodegen: 049be6309e06c1027544819670913680f2029b8e
41274127
ReactCommon: b2eb96a61b826ff327a773a74357b302cf6da678
41284128
RecaptchaInterop: 7d1a4a01a6b2cb1610a47ef3f85f0c411434cb21
4129-
RNAppleAuthentication: 9027af8aa92b4719ef1b6030a8e954d37079473a
4129+
RNAppleAuthentication: a89c9804592b38ed4ab11f0aee68d05ba12ad432
41304130
RNCAsyncStorage: b3520cd01fc00fd0e7c633812c23708c95ef1b2b
41314131
RNCPicker: 69d754b30ed729b3e0168c3d7545be95496c5b86
41324132
RNDeviceInfo: d863506092aef7e7af3a1c350c913d867d795047
@@ -4140,7 +4140,7 @@ SPEC CHECKSUMS:
41404140
RNFBPerf: 73ff374efe746483ba39e6be5b73d3d9902e4b70
41414141
RNGestureHandler: 1940a14167f7002981a25983d1620c59440a03f7
41424142
RNGoogleMobileAds: 03350a88a549e0aa1173c0c097f9d2e1dc817d44
4143-
RNGoogleSignin: f57a3ba8061206551c47134aafc4f34be349c86f
4143+
RNGoogleSignin: 9c016b5c025daf748894539b5d0bff9bcdd9eef9
41444144
RNPermissions: accd6c29c55fdeb8e7068273d725f1c7a7d0febb
41454145
RNReanimated: 71b26bd48c2934034f29cdd16cd00d343a0b3cd7
41464146
RNScreens: 077868484ed19700474d56b1ee4b782c67660c41

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
"dependencies": {
2121
"@candlefinance/faster-image": "^1.7.2",
2222
"@dr.pogodin/react-native-fs": "2.29.1",
23-
"@invertase/react-native-apple-authentication": "^2.5.0",
23+
"@invertase/react-native-apple-authentication": "^2.5.1",
2424
"@react-native-async-storage/async-storage": "^2.0.0",
2525
"@react-native-community/netinfo": "^11.4.1",
2626
"@react-native-documents/picker": "^10.1.7",
@@ -32,7 +32,7 @@
3232
"@react-native-firebase/in-app-messaging": "21.7.1",
3333
"@react-native-firebase/messaging": "21.7.1",
3434
"@react-native-firebase/perf": "21.7.1",
35-
"@react-native-google-signin/google-signin": "^16.0.0",
35+
"@react-native-google-signin/google-signin": "^16.1.1",
3636
"@react-native-picker/picker": "^2.9.0",
3737
"@react-navigation/bottom-tabs": "6.5.20",
3838
"@react-navigation/native": "6.1.17",

0 commit comments

Comments
 (0)