react-native-timezone 3.0.1 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +76 -13
- package/android/build.gradle +19 -9
- package/android/generated/java/com/samitha/timezone/NativeTimezoneSpec.java +50 -0
- package/android/generated/jni/CMakeLists.txt +36 -0
- package/android/generated/jni/RNTimezoneSpec-generated.cpp +50 -0
- package/android/generated/jni/RNTimezoneSpec.h +31 -0
- package/android/generated/jni/react/renderer/components/RNTimezoneSpec/RNTimezoneSpecJSI-generated.cpp +48 -0
- package/android/generated/jni/react/renderer/components/RNTimezoneSpec/RNTimezoneSpecJSI.h +94 -0
- package/android/src/main/AndroidManifest.xml +1 -1
- package/android/src/main/java/com/samitha/timezone/TimezoneModule.kt +87 -0
- package/android/src/main/java/com/samitha/timezone/TimezonePackage.kt +34 -0
- package/ios/Timezone.h +1 -7
- package/ios/Timezone.mm +71 -33
- package/ios/generated/RNTimezoneSpec/RNTimezoneSpec-generated.mm +60 -0
- package/ios/generated/RNTimezoneSpec/RNTimezoneSpec.h +62 -0
- package/ios/generated/RNTimezoneSpecJSI-generated.cpp +48 -0
- package/ios/generated/RNTimezoneSpecJSI.h +94 -0
- package/lib/commonjs/NativeTimezone.js.map +1 -1
- package/lib/commonjs/index.js +7 -18
- package/lib/commonjs/index.js.map +1 -1
- package/lib/module/NativeTimezone.js +2 -0
- package/lib/module/NativeTimezone.js.map +1 -1
- package/lib/module/index.js +5 -15
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/commonjs/package.json +1 -0
- package/lib/typescript/commonjs/src/NativeTimezone.d.ts +10 -0
- package/lib/typescript/commonjs/src/NativeTimezone.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/index.d.ts +8 -0
- package/lib/typescript/commonjs/src/index.d.ts.map +1 -0
- package/lib/typescript/module/package.json +1 -0
- package/lib/typescript/module/src/NativeTimezone.d.ts +10 -0
- package/lib/typescript/module/src/NativeTimezone.d.ts.map +1 -0
- package/lib/typescript/module/src/index.d.ts +8 -0
- package/lib/typescript/module/src/index.d.ts.map +1 -0
- package/package.json +75 -111
- package/react-native-timezone.podspec +19 -21
- package/react-native.config.js +12 -0
- package/src/NativeTimezone.ts +4 -3
- package/src/index.tsx +4 -25
- package/android/src/main/java/com/samitha/rn/timezone/TimezoneModuleImpl.java +0 -60
- package/android/src/main/java/com/samitha/rn/timezone/TimezonePackage.java +0 -45
- package/android/src/newarch/TimezoneModule.java +0 -9
- package/android/src/oldarch/TimezoneModule.java +0 -39
- package/lib/commonjs/index.d.js +0 -6
- package/lib/commonjs/index.d.js.map +0 -1
- package/lib/module/index.d.js +0 -2
- package/lib/module/index.d.js.map +0 -1
- package/lib/typescript/src/NativeTimezone.d.ts +0 -9
- package/lib/typescript/src/NativeTimezone.d.ts.map +0 -1
- package/lib/typescript/src/index.d.ts +0 -8
- package/lib/typescript/src/index.d.ts.map +0 -1
- package/src/index.d.ts +0 -8
package/LICENSE
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
MIT License
|
|
2
2
|
|
|
3
|
-
Copyright (c)
|
|
3
|
+
Copyright (c) 2024 Samitha Nanayakkara
|
|
4
4
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
5
5
|
of this software and associated documentation files (the "Software"), to deal
|
|
6
6
|
in the Software without restriction, including without limitation the rights
|
package/README.md
CHANGED
|
@@ -1,28 +1,91 @@
|
|
|
1
1
|
# React Native Timezone and Region
|
|
2
2
|
|
|
3
|
-
[](https://codeclimate.com/github/samitha9125/react-native-timezone/maintainability)
|
|
4
|
-
|
|
5
3
|
A Simple react native module to get the Timezone and the Region of the Android/iOS devices.
|
|
6
4
|
|
|
7
|
-
#
|
|
5
|
+
# Why Choose This Library?
|
|
6
|
+
|
|
7
|
+
## 🔒 Privacy-First
|
|
8
|
+
Unlike other timezone/region libraries, `react-native-timezone` **does NOT require**:
|
|
9
|
+
- ❌ Location permissions (`ACCESS_FINE_LOCATION`, `ACCESS_COARSE_LOCATION`)
|
|
10
|
+
- ❌ `READ_PHONE_STATE` permission (Android)
|
|
11
|
+
- ❌ Additional native dependencies
|
|
12
|
+
|
|
13
|
+
**This is critical for:**
|
|
14
|
+
- Privacy-conscious apps
|
|
15
|
+
- App Store/Play Store approval (permission justifications)
|
|
16
|
+
- GDPR/CCPA compliance
|
|
17
|
+
|
|
18
|
+
## 📱 Expo Compatible
|
|
19
|
+
Works seamlessly with **Expo Development Builds** (CNG - Continuous Native Generation):
|
|
20
|
+
```bash
|
|
21
|
+
npx expo install react-native-timezone
|
|
22
|
+
npx expo prebuild
|
|
23
|
+
npx expo run:ios
|
|
24
|
+
```
|
|
8
25
|
|
|
9
|
-
|
|
26
|
+
No need for bare React Native workflow—just prebuild and run.
|
|
10
27
|
|
|
11
|
-
|
|
28
|
+
## ⚡ Super Lightweight
|
|
29
|
+
- Zero JavaScript dependencies
|
|
30
|
+
- Native TurboModule (synchronous, no bridge overhead)
|
|
31
|
+
- Minimal footprint (~2KB gzipped)
|
|
32
|
+
|
|
33
|
+
## 🆕 Modern Architecture
|
|
34
|
+
Fully compatible with React Native's New Architecture (Fabric + TurboModules).
|
|
35
|
+
|
|
36
|
+
---
|
|
12
37
|
|
|
13
38
|
# Compatibility
|
|
14
39
|
|
|
15
|
-
|
|
40
|
+
| React Native | New Architecture | Tested | Notes |
|
|
41
|
+
|--------------|------------------|--------|-------|
|
|
42
|
+
| 0.71.x | ✅ Stable | ✅ | First stable TurboModule support |
|
|
43
|
+
| 0.72.x | ✅ | ✅ | |
|
|
44
|
+
| 0.73.x | ✅ | ✅ | |
|
|
45
|
+
| 0.74.x | ✅ Default | ✅ | New Arch enabled by default |
|
|
46
|
+
| 0.76.x | ✅ | ✅ | |
|
|
47
|
+
| 0.83.x | ✅ | ✅ | Latest (Feb 2026) |
|
|
48
|
+
|
|
49
|
+
**Breaking Changes in React Native:**
|
|
50
|
+
- **0.71**: New Architecture stabilized (TurboModules + Fabric)
|
|
51
|
+
- **0.74**: New Architecture enabled by default
|
|
52
|
+
- **0.76**: Minimum iOS deployment target raised to iOS 15.1
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
# ⚠️ Important: iOS Carrier API Deprecation
|
|
57
|
+
|
|
58
|
+
Apple has deprecated the entire `CTCarrier` class with **no replacement API**:
|
|
59
|
+
|
|
60
|
+
| API | Deprecated Since | Status |
|
|
61
|
+
|-----|-----------------|--------|
|
|
62
|
+
| `subscriberCellularProvider` | iOS 12 | ⚠️ Deprecated |
|
|
63
|
+
| `serviceSubscriberCellularProviders` | iOS 16 | ⚠️ Deprecated |
|
|
64
|
+
| `CTCarrier` class | iOS 16 | ❌ No replacement |
|
|
16
65
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
66
|
+
**What this means for `getRegionByTelephony()`:**
|
|
67
|
+
- **iOS < 18**: Works, but triggers deprecation warnings (suppressed in this library)
|
|
68
|
+
- **iOS 18+**: Returns `null` due to Apple's privacy restrictions
|
|
69
|
+
|
|
70
|
+
**Recommended Pattern:**
|
|
71
|
+
```javascript
|
|
72
|
+
// Use telephony-based region with locale fallback
|
|
73
|
+
const region = Timezone.getRegionByTelephony() ?? Timezone.getRegionByLocale();
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
This is an Apple platform limitation, not a bug in this library.
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
# Motivation
|
|
81
|
+
|
|
82
|
+
For a project of mine, I had to acquire the currently selected timezone of the user. Unfortunately, I could not find any react native package or react native in-build function that facilitates this. Thus I created a small library.
|
|
83
|
+
|
|
84
|
+
v3.0.0 and above, you can access the Region details. More details can be found below.
|
|
22
85
|
|
|
23
86
|
# Installation
|
|
24
87
|
|
|
25
|
-
`
|
|
88
|
+
`yarn add react-native-timezone`
|
|
26
89
|
|
|
27
90
|
## iOS
|
|
28
91
|
|
|
@@ -54,5 +117,5 @@ Check out the [example](https://github.com/samitha9125/react-native-timezone/tre
|
|
|
54
117
|
| --------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
55
118
|
| getTimeZone | Android: Returns timezone ID using `java.util.TimeZone.getID()`<br>iOS: Reflects the current system time zone using `localTimeZone` of `NSTimeZone` |
|
|
56
119
|
| isAutoTimeZoneEnabled | Returns a boolean indicating if auto timezone is enabled on the device **(Android Only)** |
|
|
57
|
-
| getRegionByTelephony | Retrieves the region information based on the telephony (SIM card) of the device. Returns `
|
|
120
|
+
| getRegionByTelephony | Retrieves the region information based on the telephony (SIM card) of the device. Returns `null` if the device has no SIM card. |
|
|
58
121
|
| getRegionByLocale | Retrieves the region information based on the device's locale settings |
|
package/android/build.gradle
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
buildscript {
|
|
2
|
+
// Buildscript is evaluated before everything else so we can't use getExtOrDefault
|
|
3
|
+
def kotlin_version = rootProject.ext.has("kotlinVersion") ? rootProject.ext.get("kotlinVersion") : project.properties["Timezone_kotlinVersion"]
|
|
4
|
+
|
|
2
5
|
repositories {
|
|
3
6
|
google()
|
|
4
7
|
mavenCentral()
|
|
@@ -6,14 +9,22 @@ buildscript {
|
|
|
6
9
|
|
|
7
10
|
dependencies {
|
|
8
11
|
classpath "com.android.tools.build:gradle:7.2.1"
|
|
12
|
+
// noinspection DifferentKotlinGradleVersion
|
|
13
|
+
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
|
9
14
|
}
|
|
10
15
|
}
|
|
11
16
|
|
|
17
|
+
def reactNativeArchitectures() {
|
|
18
|
+
def value = rootProject.getProperties().get("reactNativeArchitectures")
|
|
19
|
+
return value ? value.split(",") : ["armeabi-v7a", "x86", "x86_64", "arm64-v8a"]
|
|
20
|
+
}
|
|
21
|
+
|
|
12
22
|
def isNewArchitectureEnabled() {
|
|
13
23
|
return rootProject.hasProperty("newArchEnabled") && rootProject.getProperty("newArchEnabled") == "true"
|
|
14
24
|
}
|
|
15
25
|
|
|
16
26
|
apply plugin: "com.android.library"
|
|
27
|
+
apply plugin: "kotlin-android"
|
|
17
28
|
|
|
18
29
|
if (isNewArchitectureEnabled()) {
|
|
19
30
|
apply plugin: "com.facebook.react"
|
|
@@ -38,7 +49,7 @@ def supportsNamespace() {
|
|
|
38
49
|
|
|
39
50
|
android {
|
|
40
51
|
if (supportsNamespace()) {
|
|
41
|
-
namespace "com.samitha.
|
|
52
|
+
namespace "com.samitha.timezone"
|
|
42
53
|
|
|
43
54
|
sourceSets {
|
|
44
55
|
main {
|
|
@@ -78,13 +89,10 @@ android {
|
|
|
78
89
|
sourceSets {
|
|
79
90
|
main {
|
|
80
91
|
if (isNewArchitectureEnabled()) {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
]
|
|
86
|
-
} else {
|
|
87
|
-
java.srcDirs += ["src/oldarch"]
|
|
92
|
+
java.srcDirs += [
|
|
93
|
+
"generated/java",
|
|
94
|
+
"generated/jni"
|
|
95
|
+
]
|
|
88
96
|
}
|
|
89
97
|
}
|
|
90
98
|
}
|
|
@@ -95,18 +103,20 @@ repositories {
|
|
|
95
103
|
google()
|
|
96
104
|
}
|
|
97
105
|
|
|
106
|
+
def kotlin_version = getExtOrDefault("kotlinVersion")
|
|
98
107
|
|
|
99
108
|
dependencies {
|
|
100
109
|
// For < 0.71, this will be from the local maven repo
|
|
101
110
|
// For > 0.71, this will be replaced by `com.facebook.react:react-android:$version` by react gradle plugin
|
|
102
111
|
//noinspection GradleDynamicVersion
|
|
103
112
|
implementation "com.facebook.react:react-native:+"
|
|
113
|
+
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
|
|
104
114
|
}
|
|
105
115
|
|
|
106
116
|
if (isNewArchitectureEnabled()) {
|
|
107
117
|
react {
|
|
108
118
|
jsRootDir = file("../src/")
|
|
109
119
|
libraryName = "Timezone"
|
|
110
|
-
codegenJavaPackageName = "com.samitha.
|
|
120
|
+
codegenJavaPackageName = "com.samitha.timezone"
|
|
111
121
|
}
|
|
112
122
|
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
|
|
2
|
+
/**
|
|
3
|
+
* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
|
|
4
|
+
*
|
|
5
|
+
* Do not edit this file as changes may cause incorrect behavior and will be lost
|
|
6
|
+
* once the code is regenerated.
|
|
7
|
+
*
|
|
8
|
+
* @generated by codegen project: GenerateModuleJavaSpec.js
|
|
9
|
+
*
|
|
10
|
+
* @nolint
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
package com.samitha.timezone;
|
|
14
|
+
|
|
15
|
+
import com.facebook.proguard.annotations.DoNotStrip;
|
|
16
|
+
import com.facebook.react.bridge.ReactApplicationContext;
|
|
17
|
+
import com.facebook.react.bridge.ReactContextBaseJavaModule;
|
|
18
|
+
import com.facebook.react.bridge.ReactMethod;
|
|
19
|
+
import com.facebook.react.turbomodule.core.interfaces.TurboModule;
|
|
20
|
+
import javax.annotation.Nonnull;
|
|
21
|
+
import javax.annotation.Nullable;
|
|
22
|
+
|
|
23
|
+
public abstract class NativeTimezoneSpec extends ReactContextBaseJavaModule implements TurboModule {
|
|
24
|
+
public static final String NAME = "Timezone";
|
|
25
|
+
|
|
26
|
+
public NativeTimezoneSpec(ReactApplicationContext reactContext) {
|
|
27
|
+
super(reactContext);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
@Override
|
|
31
|
+
public @Nonnull String getName() {
|
|
32
|
+
return NAME;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
@ReactMethod(isBlockingSynchronousMethod = true)
|
|
36
|
+
@DoNotStrip
|
|
37
|
+
public abstract @Nullable String getTimeZone();
|
|
38
|
+
|
|
39
|
+
@ReactMethod(isBlockingSynchronousMethod = true)
|
|
40
|
+
@DoNotStrip
|
|
41
|
+
public abstract @Nullable String getRegionByLocale();
|
|
42
|
+
|
|
43
|
+
@ReactMethod(isBlockingSynchronousMethod = true)
|
|
44
|
+
@DoNotStrip
|
|
45
|
+
public abstract @Nullable String getRegionByTelephony();
|
|
46
|
+
|
|
47
|
+
@ReactMethod(isBlockingSynchronousMethod = true)
|
|
48
|
+
@DoNotStrip
|
|
49
|
+
public abstract @Nullable Boolean isAutoTimeZoneEnabled();
|
|
50
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
2
|
+
#
|
|
3
|
+
# This source code is licensed under the MIT license found in the
|
|
4
|
+
# LICENSE file in the root directory of this source tree.
|
|
5
|
+
|
|
6
|
+
cmake_minimum_required(VERSION 3.13)
|
|
7
|
+
set(CMAKE_VERBOSE_MAKEFILE on)
|
|
8
|
+
|
|
9
|
+
file(GLOB react_codegen_SRCS CONFIGURE_DEPENDS *.cpp react/renderer/components/RNTimezoneSpec/*.cpp)
|
|
10
|
+
|
|
11
|
+
add_library(
|
|
12
|
+
react_codegen_RNTimezoneSpec
|
|
13
|
+
OBJECT
|
|
14
|
+
${react_codegen_SRCS}
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
target_include_directories(react_codegen_RNTimezoneSpec PUBLIC . react/renderer/components/RNTimezoneSpec)
|
|
18
|
+
|
|
19
|
+
target_link_libraries(
|
|
20
|
+
react_codegen_RNTimezoneSpec
|
|
21
|
+
fbjni
|
|
22
|
+
jsi
|
|
23
|
+
# We need to link different libraries based on whether we are building rncore or not, that's necessary
|
|
24
|
+
# because we want to break a circular dependency between react_codegen_rncore and reactnative
|
|
25
|
+
reactnative
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
target_compile_options(
|
|
29
|
+
react_codegen_RNTimezoneSpec
|
|
30
|
+
PRIVATE
|
|
31
|
+
-DLOG_TAG=\"ReactNative\"
|
|
32
|
+
-fexceptions
|
|
33
|
+
-frtti
|
|
34
|
+
-std=c++20
|
|
35
|
+
-Wall
|
|
36
|
+
)
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
|
|
2
|
+
/**
|
|
3
|
+
* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
|
|
4
|
+
*
|
|
5
|
+
* Do not edit this file as changes may cause incorrect behavior and will be lost
|
|
6
|
+
* once the code is regenerated.
|
|
7
|
+
*
|
|
8
|
+
* @generated by codegen project: GenerateModuleJniCpp.js
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
#include "RNTimezoneSpec.h"
|
|
12
|
+
|
|
13
|
+
namespace facebook::react {
|
|
14
|
+
|
|
15
|
+
static facebook::jsi::Value __hostFunction_NativeTimezoneSpecJSI_getTimeZone(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
|
|
16
|
+
static jmethodID cachedMethodId = nullptr;
|
|
17
|
+
return static_cast<JavaTurboModule &>(turboModule).invokeJavaMethod(rt, StringKind, "getTimeZone", "()Ljava/lang/String;", args, count, cachedMethodId);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
static facebook::jsi::Value __hostFunction_NativeTimezoneSpecJSI_getRegionByLocale(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
|
|
21
|
+
static jmethodID cachedMethodId = nullptr;
|
|
22
|
+
return static_cast<JavaTurboModule &>(turboModule).invokeJavaMethod(rt, StringKind, "getRegionByLocale", "()Ljava/lang/String;", args, count, cachedMethodId);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
static facebook::jsi::Value __hostFunction_NativeTimezoneSpecJSI_getRegionByTelephony(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
|
|
26
|
+
static jmethodID cachedMethodId = nullptr;
|
|
27
|
+
return static_cast<JavaTurboModule &>(turboModule).invokeJavaMethod(rt, StringKind, "getRegionByTelephony", "()Ljava/lang/String;", args, count, cachedMethodId);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
static facebook::jsi::Value __hostFunction_NativeTimezoneSpecJSI_isAutoTimeZoneEnabled(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
|
|
31
|
+
static jmethodID cachedMethodId = nullptr;
|
|
32
|
+
return static_cast<JavaTurboModule &>(turboModule).invokeJavaMethod(rt, BooleanKind, "isAutoTimeZoneEnabled", "()Ljava/lang/Boolean;", args, count, cachedMethodId);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
NativeTimezoneSpecJSI::NativeTimezoneSpecJSI(const JavaTurboModule::InitParams ¶ms)
|
|
36
|
+
: JavaTurboModule(params) {
|
|
37
|
+
methodMap_["getTimeZone"] = MethodMetadata {0, __hostFunction_NativeTimezoneSpecJSI_getTimeZone};
|
|
38
|
+
methodMap_["getRegionByLocale"] = MethodMetadata {0, __hostFunction_NativeTimezoneSpecJSI_getRegionByLocale};
|
|
39
|
+
methodMap_["getRegionByTelephony"] = MethodMetadata {0, __hostFunction_NativeTimezoneSpecJSI_getRegionByTelephony};
|
|
40
|
+
methodMap_["isAutoTimeZoneEnabled"] = MethodMetadata {0, __hostFunction_NativeTimezoneSpecJSI_isAutoTimeZoneEnabled};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
std::shared_ptr<TurboModule> RNTimezoneSpec_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms) {
|
|
44
|
+
if (moduleName == "Timezone") {
|
|
45
|
+
return std::make_shared<NativeTimezoneSpecJSI>(params);
|
|
46
|
+
}
|
|
47
|
+
return nullptr;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
} // namespace facebook::react
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
|
|
2
|
+
/**
|
|
3
|
+
* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
|
|
4
|
+
*
|
|
5
|
+
* Do not edit this file as changes may cause incorrect behavior and will be lost
|
|
6
|
+
* once the code is regenerated.
|
|
7
|
+
*
|
|
8
|
+
* @generated by codegen project: GenerateModuleJniH.js
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
#pragma once
|
|
12
|
+
|
|
13
|
+
#include <ReactCommon/JavaTurboModule.h>
|
|
14
|
+
#include <ReactCommon/TurboModule.h>
|
|
15
|
+
#include <jsi/jsi.h>
|
|
16
|
+
|
|
17
|
+
namespace facebook::react {
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* JNI C++ class for module 'NativeTimezone'
|
|
21
|
+
*/
|
|
22
|
+
class JSI_EXPORT NativeTimezoneSpecJSI : public JavaTurboModule {
|
|
23
|
+
public:
|
|
24
|
+
NativeTimezoneSpecJSI(const JavaTurboModule::InitParams ¶ms);
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
JSI_EXPORT
|
|
29
|
+
std::shared_ptr<TurboModule> RNTimezoneSpec_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms);
|
|
30
|
+
|
|
31
|
+
} // namespace facebook::react
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
|
|
3
|
+
*
|
|
4
|
+
* Do not edit this file as changes may cause incorrect behavior and will be lost
|
|
5
|
+
* once the code is regenerated.
|
|
6
|
+
*
|
|
7
|
+
* @generated by codegen project: GenerateModuleCpp.js
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
#include "RNTimezoneSpecJSI.h"
|
|
11
|
+
|
|
12
|
+
namespace facebook::react {
|
|
13
|
+
|
|
14
|
+
static jsi::Value __hostFunction_NativeTimezoneCxxSpecJSI_getTimeZone(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
|
15
|
+
auto result = static_cast<NativeTimezoneCxxSpecJSI *>(&turboModule)->getTimeZone(
|
|
16
|
+
rt
|
|
17
|
+
);
|
|
18
|
+
return result ? jsi::Value(std::move(*result)) : jsi::Value::null();
|
|
19
|
+
}
|
|
20
|
+
static jsi::Value __hostFunction_NativeTimezoneCxxSpecJSI_getRegionByLocale(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
|
21
|
+
auto result = static_cast<NativeTimezoneCxxSpecJSI *>(&turboModule)->getRegionByLocale(
|
|
22
|
+
rt
|
|
23
|
+
);
|
|
24
|
+
return result ? jsi::Value(std::move(*result)) : jsi::Value::null();
|
|
25
|
+
}
|
|
26
|
+
static jsi::Value __hostFunction_NativeTimezoneCxxSpecJSI_getRegionByTelephony(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
|
27
|
+
auto result = static_cast<NativeTimezoneCxxSpecJSI *>(&turboModule)->getRegionByTelephony(
|
|
28
|
+
rt
|
|
29
|
+
);
|
|
30
|
+
return result ? jsi::Value(std::move(*result)) : jsi::Value::null();
|
|
31
|
+
}
|
|
32
|
+
static jsi::Value __hostFunction_NativeTimezoneCxxSpecJSI_isAutoTimeZoneEnabled(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
|
33
|
+
auto result = static_cast<NativeTimezoneCxxSpecJSI *>(&turboModule)->isAutoTimeZoneEnabled(
|
|
34
|
+
rt
|
|
35
|
+
);
|
|
36
|
+
return result ? jsi::Value(std::move(*result)) : jsi::Value::null();
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
NativeTimezoneCxxSpecJSI::NativeTimezoneCxxSpecJSI(std::shared_ptr<CallInvoker> jsInvoker)
|
|
40
|
+
: TurboModule("Timezone", jsInvoker) {
|
|
41
|
+
methodMap_["getTimeZone"] = MethodMetadata {0, __hostFunction_NativeTimezoneCxxSpecJSI_getTimeZone};
|
|
42
|
+
methodMap_["getRegionByLocale"] = MethodMetadata {0, __hostFunction_NativeTimezoneCxxSpecJSI_getRegionByLocale};
|
|
43
|
+
methodMap_["getRegionByTelephony"] = MethodMetadata {0, __hostFunction_NativeTimezoneCxxSpecJSI_getRegionByTelephony};
|
|
44
|
+
methodMap_["isAutoTimeZoneEnabled"] = MethodMetadata {0, __hostFunction_NativeTimezoneCxxSpecJSI_isAutoTimeZoneEnabled};
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
} // namespace facebook::react
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
|
|
3
|
+
*
|
|
4
|
+
* Do not edit this file as changes may cause incorrect behavior and will be lost
|
|
5
|
+
* once the code is regenerated.
|
|
6
|
+
*
|
|
7
|
+
* @generated by codegen project: GenerateModuleH.js
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
#pragma once
|
|
11
|
+
|
|
12
|
+
#include <ReactCommon/TurboModule.h>
|
|
13
|
+
#include <react/bridging/Bridging.h>
|
|
14
|
+
|
|
15
|
+
namespace facebook::react {
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class JSI_EXPORT NativeTimezoneCxxSpecJSI : public TurboModule {
|
|
19
|
+
protected:
|
|
20
|
+
NativeTimezoneCxxSpecJSI(std::shared_ptr<CallInvoker> jsInvoker);
|
|
21
|
+
|
|
22
|
+
public:
|
|
23
|
+
virtual std::optional<jsi::String> getTimeZone(jsi::Runtime &rt) = 0;
|
|
24
|
+
virtual std::optional<jsi::String> getRegionByLocale(jsi::Runtime &rt) = 0;
|
|
25
|
+
virtual std::optional<jsi::String> getRegionByTelephony(jsi::Runtime &rt) = 0;
|
|
26
|
+
virtual std::optional<bool> isAutoTimeZoneEnabled(jsi::Runtime &rt) = 0;
|
|
27
|
+
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
template <typename T>
|
|
31
|
+
class JSI_EXPORT NativeTimezoneCxxSpec : public TurboModule {
|
|
32
|
+
public:
|
|
33
|
+
jsi::Value get(jsi::Runtime &rt, const jsi::PropNameID &propName) override {
|
|
34
|
+
return delegate_.get(rt, propName);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
static constexpr std::string_view kModuleName = "Timezone";
|
|
38
|
+
|
|
39
|
+
protected:
|
|
40
|
+
NativeTimezoneCxxSpec(std::shared_ptr<CallInvoker> jsInvoker)
|
|
41
|
+
: TurboModule(std::string{NativeTimezoneCxxSpec::kModuleName}, jsInvoker),
|
|
42
|
+
delegate_(reinterpret_cast<T*>(this), jsInvoker) {}
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
private:
|
|
46
|
+
class Delegate : public NativeTimezoneCxxSpecJSI {
|
|
47
|
+
public:
|
|
48
|
+
Delegate(T *instance, std::shared_ptr<CallInvoker> jsInvoker) :
|
|
49
|
+
NativeTimezoneCxxSpecJSI(std::move(jsInvoker)), instance_(instance) {
|
|
50
|
+
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
std::optional<jsi::String> getTimeZone(jsi::Runtime &rt) override {
|
|
54
|
+
static_assert(
|
|
55
|
+
bridging::getParameterCount(&T::getTimeZone) == 1,
|
|
56
|
+
"Expected getTimeZone(...) to have 1 parameters");
|
|
57
|
+
|
|
58
|
+
return bridging::callFromJs<std::optional<jsi::String>>(
|
|
59
|
+
rt, &T::getTimeZone, jsInvoker_, instance_);
|
|
60
|
+
}
|
|
61
|
+
std::optional<jsi::String> getRegionByLocale(jsi::Runtime &rt) override {
|
|
62
|
+
static_assert(
|
|
63
|
+
bridging::getParameterCount(&T::getRegionByLocale) == 1,
|
|
64
|
+
"Expected getRegionByLocale(...) to have 1 parameters");
|
|
65
|
+
|
|
66
|
+
return bridging::callFromJs<std::optional<jsi::String>>(
|
|
67
|
+
rt, &T::getRegionByLocale, jsInvoker_, instance_);
|
|
68
|
+
}
|
|
69
|
+
std::optional<jsi::String> getRegionByTelephony(jsi::Runtime &rt) override {
|
|
70
|
+
static_assert(
|
|
71
|
+
bridging::getParameterCount(&T::getRegionByTelephony) == 1,
|
|
72
|
+
"Expected getRegionByTelephony(...) to have 1 parameters");
|
|
73
|
+
|
|
74
|
+
return bridging::callFromJs<std::optional<jsi::String>>(
|
|
75
|
+
rt, &T::getRegionByTelephony, jsInvoker_, instance_);
|
|
76
|
+
}
|
|
77
|
+
std::optional<bool> isAutoTimeZoneEnabled(jsi::Runtime &rt) override {
|
|
78
|
+
static_assert(
|
|
79
|
+
bridging::getParameterCount(&T::isAutoTimeZoneEnabled) == 1,
|
|
80
|
+
"Expected isAutoTimeZoneEnabled(...) to have 1 parameters");
|
|
81
|
+
|
|
82
|
+
return bridging::callFromJs<std::optional<bool>>(
|
|
83
|
+
rt, &T::isAutoTimeZoneEnabled, jsInvoker_, instance_);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
private:
|
|
87
|
+
friend class NativeTimezoneCxxSpec;
|
|
88
|
+
T *instance_;
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
Delegate delegate_;
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
} // namespace facebook::react
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
package com.samitha.timezone
|
|
2
|
+
|
|
3
|
+
import android.content.ContentResolver
|
|
4
|
+
import android.content.Context
|
|
5
|
+
import android.os.Build
|
|
6
|
+
import android.provider.Settings
|
|
7
|
+
import android.telephony.TelephonyManager
|
|
8
|
+
import com.facebook.react.bridge.ReactApplicationContext
|
|
9
|
+
import com.facebook.react.bridge.ReactMethod
|
|
10
|
+
import com.facebook.react.module.annotations.ReactModule
|
|
11
|
+
import java.util.TimeZone
|
|
12
|
+
|
|
13
|
+
@ReactModule(name = TimezoneModule.NAME)
|
|
14
|
+
class TimezoneModule(reactContext: ReactApplicationContext) :
|
|
15
|
+
NativeTimezoneSpec(reactContext) {
|
|
16
|
+
|
|
17
|
+
override fun getName(): String = NAME
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* This is a Synchronous method.
|
|
21
|
+
* Checks if the device is set to automatically detect the time zone.
|
|
22
|
+
*/
|
|
23
|
+
@ReactMethod(isBlockingSynchronousMethod = true)
|
|
24
|
+
override fun isAutoTimeZoneEnabled(): Boolean? {
|
|
25
|
+
return try {
|
|
26
|
+
val resolver: ContentResolver = reactApplicationContext.contentResolver
|
|
27
|
+
val isLaterThanJelly = Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1
|
|
28
|
+
if (isLaterThanJelly) {
|
|
29
|
+
Settings.Global.getInt(resolver, Settings.Global.AUTO_TIME_ZONE, 0) != 0
|
|
30
|
+
} else {
|
|
31
|
+
Settings.System.getInt(resolver, Settings.System.AUTO_TIME_ZONE, 0) != 0
|
|
32
|
+
}
|
|
33
|
+
} catch (e: Exception) {
|
|
34
|
+
null
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* This is a Synchronous method.
|
|
40
|
+
* Retrieves the current time zone ID.
|
|
41
|
+
*/
|
|
42
|
+
@ReactMethod(isBlockingSynchronousMethod = true)
|
|
43
|
+
override fun getTimeZone(): String? {
|
|
44
|
+
return try {
|
|
45
|
+
TimeZone.getDefault().id
|
|
46
|
+
} catch (e: Exception) {
|
|
47
|
+
null
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Synchronous method.
|
|
53
|
+
* Gets the region based on the telephony manager's network country ISO.
|
|
54
|
+
*/
|
|
55
|
+
@ReactMethod(isBlockingSynchronousMethod = true)
|
|
56
|
+
override fun getRegionByTelephony(): String? {
|
|
57
|
+
return try {
|
|
58
|
+
val telephonyService = reactApplicationContext.getSystemService(Context.TELEPHONY_SERVICE) as? TelephonyManager
|
|
59
|
+
telephonyService?.networkCountryIso
|
|
60
|
+
} catch (e: Exception) {
|
|
61
|
+
null
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Synchronous method.
|
|
67
|
+
* Retrieves the region based on the device's locale.
|
|
68
|
+
*/
|
|
69
|
+
@ReactMethod(isBlockingSynchronousMethod = true)
|
|
70
|
+
override fun getRegionByLocale(): String? {
|
|
71
|
+
return try {
|
|
72
|
+
val configuration = reactApplicationContext.resources.configuration
|
|
73
|
+
val locale = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
|
74
|
+
configuration.locales.get(0)
|
|
75
|
+
} else {
|
|
76
|
+
configuration.locale
|
|
77
|
+
}
|
|
78
|
+
locale.country
|
|
79
|
+
} catch (e: Exception) {
|
|
80
|
+
null
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
companion object {
|
|
85
|
+
const val NAME = "Timezone"
|
|
86
|
+
}
|
|
87
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
package com.samitha.timezone
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.BaseReactPackage
|
|
4
|
+
import com.facebook.react.bridge.NativeModule
|
|
5
|
+
import com.facebook.react.bridge.ReactApplicationContext
|
|
6
|
+
import com.facebook.react.module.model.ReactModuleInfo
|
|
7
|
+
import com.facebook.react.module.model.ReactModuleInfoProvider
|
|
8
|
+
import java.util.HashMap
|
|
9
|
+
|
|
10
|
+
class TimezonePackage : BaseReactPackage() {
|
|
11
|
+
override fun getModule(name: String, reactContext: ReactApplicationContext): NativeModule? {
|
|
12
|
+
return if (name == TimezoneModule.NAME) {
|
|
13
|
+
TimezoneModule(reactContext)
|
|
14
|
+
} else {
|
|
15
|
+
null
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
override fun getReactModuleInfoProvider(): ReactModuleInfoProvider {
|
|
20
|
+
return ReactModuleInfoProvider {
|
|
21
|
+
val moduleInfos: MutableMap<String, ReactModuleInfo> = HashMap()
|
|
22
|
+
moduleInfos[TimezoneModule.NAME] = ReactModuleInfo(
|
|
23
|
+
TimezoneModule.NAME,
|
|
24
|
+
TimezoneModule.NAME,
|
|
25
|
+
false, // canOverrideExistingModule
|
|
26
|
+
false, // needsEagerInit
|
|
27
|
+
true, // hasConstants
|
|
28
|
+
false, // isCxxModule
|
|
29
|
+
true // isTurboModule
|
|
30
|
+
)
|
|
31
|
+
moduleInfos
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
package/ios/Timezone.h
CHANGED
|
@@ -1,12 +1,6 @@
|
|
|
1
1
|
|
|
2
|
-
#
|
|
3
|
-
#import "RNTimezoneSpec.h"
|
|
2
|
+
#import "generated/RNTimezoneSpec/RNTimezoneSpec.h"
|
|
4
3
|
|
|
5
4
|
@interface Timezone : NSObject <NativeTimezoneSpec>
|
|
6
|
-
#else
|
|
7
|
-
#import <React/RCTBridgeModule.h>
|
|
8
|
-
|
|
9
|
-
@interface Timezone : NSObject <RCTBridgeModule>
|
|
10
|
-
#endif
|
|
11
5
|
|
|
12
6
|
@end
|