···11-import * as DevicePrefs from './src/DevicePrefs'
21import * as Referrer from './src/Referrer'
22+import * as SharedPrefs from './src/SharedPrefs'
3344-export {DevicePrefs, Referrer}
44+export {Referrer, SharedPrefs}
···11+import {requireNativeModule} from 'expo-modules-core'
22+33+const NativeModule = requireNativeModule('ExpoBlueskySharedPrefs')
44+55+export function setValue(
66+ key: string,
77+ value: string | number | boolean | null | undefined,
88+): void {
99+ // A bug on Android causes `JavaScripValue.isString()` to cause a crash on some occasions, seemingly because of a
1010+ // memory violation. Instead, we will use a specific function to set strings on this platform.
1111+ if (typeof value === 'string') {
1212+ return NativeModule.setString(key, value)
1313+ }
1414+ return NativeModule.setValue(key, value)
1515+}
1616+1717+export function removeValue(key: string): void {
1818+ return NativeModule.removeValue(key)
1919+}
2020+2121+export function getString(key: string): string | undefined {
2222+ return nullToUndefined(NativeModule.getString(key))
2323+}
2424+2525+export function getNumber(key: string): number | undefined {
2626+ return nullToUndefined(NativeModule.getNumber(key))
2727+}
2828+2929+export function getBool(key: string): boolean | undefined {
3030+ return nullToUndefined(NativeModule.getBool(key))
3131+}
3232+3333+export function addToSet(key: string, value: string): void {
3434+ return NativeModule.addToSet(key, value)
3535+}
3636+3737+export function removeFromSet(key: string, value: string): void {
3838+ return NativeModule.removeFromSet(key, value)
3939+}
4040+4141+export function setContains(key: string, value: string): boolean {
4242+ return NativeModule.setContains(key, value)
4343+}
4444+4545+// iOS returns `null` if a value does not exist, and Android returns `undefined. Normalize these here for JS types
4646+function nullToUndefined(value: any) {
4747+ if (value == null) {
4848+ return undefined
4949+ }
5050+ return value
5151+}