Skip to content

Commit c298ce7

Browse files
Merge pull request #4534 from tloncorp/lb/synced-activity-marker
Activity: Sync bell across clients
2 parents f577b05 + 75612b4 commit c298ce7

File tree

11 files changed

+160
-98
lines changed

11 files changed

+160
-98
lines changed

apps/tlon-mobile/ios/Podfile.lock

+85-85
Original file line numberDiff line numberDiff line change
@@ -1767,40 +1767,40 @@ SPEC CHECKSUMS:
17671767
boost: d3f49c53809116a5d38da093a8aa78bf551aed09
17681768
BranchSDK: cb046c2714b03e573484ce9e349e2ddbad7016e8
17691769
DoubleConversion: fea03f2699887d960129cc54bba7e52542b6f953
1770-
EASClient: a42ee8bf36c93b3128352faf2ae49405ab4f80bd
1771-
EXApplication: 16bcea16789221bd566e64b5ea2608cf7756b005
1772-
EXAV: e4f6137431ddc4cb025895046bfefa9612025c35
1773-
EXConstants: a5f6276e565d98f9eb4280f81241fc342d641590
1774-
EXFont: f20669cb266ef48b004f1eb1f2b20db96cd1df9f
1775-
EXImageLoader: 55080616b2fe9da19ef8c7f706afd9814e279b6b
1770+
EASClient: 45d2459af3eb8a0283b50d3de38af7ac9930d747
1771+
EXApplication: d62cd534090692cbf538ea15f69f829b517a40b1
1772+
EXAV: e160fec51bf6bc41c3b6f7e4c72ea9fd36860cd6
1773+
EXConstants: c82ef9280044accc91fb6082047afdc9a408f61a
1774+
EXFont: 64e653a110eee050ad80dfcd676c4bada0a1ff92
1775+
EXImageLoader: ba2506b443b9656e93167c104406a2c265924823
17761776
EXJSONUtils: 5c42959e87be238b045ef37cc5268b16a6c0ad4a
1777-
EXManifests: 5e8c29f36c716af768a4ea47ec05e1b89ab93091
1778-
EXMediaLibrary: 70cf1fb7028fda2d682090c9fe57568674e4abab
1779-
EXNotifications: e254c0fa11337e15b30c200e91437b521f682bad
1780-
Expo: 7b9976a9b2be116a701b233d6655b229a3c9316e
1781-
expo-dev-client: f22fdebdb8760bc22f660b7c0cb1dd58d80005c0
1782-
expo-dev-launcher: 11c184a2dca65f9bd6dc575a73a554b7be589d1d
1783-
expo-dev-menu: 68ea53d923996e27b20ce02b51cc820fc2327a83
1784-
expo-dev-menu-interface: 7ba029c9d1a82ac22b9b584c00514860b060553e
1785-
ExpoBackgroundFetch: 80d41ec15c6cce0bafb5d2326b8e85f42152eba7
1786-
ExpoBattery: 60bf880aea8f769fe39f709a920442542c1bfd62
1787-
ExpoBlur: e832d874bd94afc0645daddbd3162ec1ce172080
1788-
ExpoClipboard: b597982124f067ff9f5b89093eb3d97898d5d877
1789-
ExpoDevice: 97307196d8cab694e245752b8a7afacc35c14e03
1790-
ExpoFileSystem: 74cc0fae916f9f044248433971dcfc8c3befd057
1791-
ExpoHaptics: 28a771b630353cd6e8dcf1b1e3e693e38ad7c3c3
1792-
ExpoImage: 8cf2d51de3d03b7e984e9b0ba8f19c0c22057001
1793-
ExpoImageManipulator: c1d7cb865eacd620a35659f3da34c70531f10b59
1794-
ExpoImagePicker: 66970181d1c838f444e5e1f81b804ab2d5ff49bd
1795-
ExpoKeepAwake: 0f5cad99603a3268e50af9a6eb8b76d0d9ac956c
1796-
ExpoLinearGradient: 4ad1449a2408e0435ac959076562b3921f2e32a1
1797-
ExpoLocalization: f94759e55802e4a4f8b7d7cecb450de11b888721
1798-
ExpoModulesCore: 0f9e3c49657f681cd06219d97c77c3108a67ca00
1799-
ExpoSecureStore: c84ae37d1c36f38524d289c67c3a2e3fc56f1108
1800-
EXSplashScreen: 0fabdcf746d29e7f8b8969879cb09125cdd365d2
1777+
EXManifests: 429136cffa3ae82d1ba3b60b7243fb186615562e
1778+
EXMediaLibrary: d3bf5c458643f9821b96af328d399ef3f44de7db
1779+
EXNotifications: 9fd42ca3c5998ae93a2ac869ed9a47467c433219
1780+
Expo: 1b33cb8ab60cff9abf805ed6020af3d1846e457c
1781+
expo-dev-client: 775a683302570193a7ba71032d0b1b82f6ad1454
1782+
expo-dev-launcher: acd5b1e03e649e96675c85314a9d8745f23648d1
1783+
expo-dev-menu: 2b4ce6108396233849b71805906129de15aadfbc
1784+
expo-dev-menu-interface: 44e69ddff62bbc6c5418c200e657635720b5a480
1785+
ExpoBackgroundFetch: 466154f27b511cb3c369709dd4b3f152c785b26e
1786+
ExpoBattery: 6cdcb673b99f53b3e9955b03268fd571cff68f51
1787+
ExpoBlur: 3a9548a738624968836926f4aa1e18fa22155640
1788+
ExpoClipboard: 24cc2b881ab6ca2e5b431b1f6d9d4a302adbf9d0
1789+
ExpoDevice: fc21b9193d704f3759c1ede1b383fcdb0370b46a
1790+
ExpoFileSystem: df58e1eb2a4d6f1006a1ca70bddfbbf63e52fa4f
1791+
ExpoHaptics: c91902e436f3fb0e07aa19acc118018089fa90de
1792+
ExpoImage: a70db90f39a7af98930cef91c84e877b1131f3dd
1793+
ExpoImageManipulator: 0c2ada7a028619ea1cc0c670bfa90c8ebeaa4af4
1794+
ExpoImagePicker: d06822d74f1f0e7fe7cb070ece0fff6e678fa3eb
1795+
ExpoKeepAwake: 3b8cf8533b9212500565a1e41fb080fc5af29918
1796+
ExpoLinearGradient: 501f9bbd83f3ec1d0e0425862b9ef4693605fc1c
1797+
ExpoLocalization: 7423aa1abcc59209dc2ce2b9bb63776a18023a98
1798+
ExpoModulesCore: bc9f47045cd97b741444e335880d65c681d39007
1799+
ExpoSecureStore: 4cec57fd2c40dcff05ce2186c39afc1af39d213c
1800+
EXSplashScreen: 32c0a1ee2e9b416a5fb8ba41419bd040868e5dfe
18011801
EXStructuredHeaders: 5b0f47259db047dc1fdfa84752e292c2bfa68ecd
1802-
EXTaskManager: 07d427a5213dd275c13b6b6c07bba35a672e6698
1803-
EXUpdates: 40e069f2987861a6d39101c4496e816561f3e167
1802+
EXTaskManager: 8c5683c2fb543cf2baa77bab4ad130b7e3829c4a
1803+
EXUpdates: 8cc7407328c3852e3ce890a381fe0022ae71902b
18041804
EXUpdatesInterface: 3e444e2093e25b7ca0999a7d8c16e8392dee70c3
18051805
FBLazyVector: 98c189b92292d4bfeac13ffa8df3ce3d84e2fc5b
18061806
FBReactNativeSpec: f40d89f4be3e854b08cf9b66cba9e9d6c68d863d
@@ -1827,82 +1827,82 @@ SPEC CHECKSUMS:
18271827
libvmaf: 27f523f1e63c694d14d534cd0fddd2fab0ae8711
18281828
libwebp: 1786c9f4ff8a279e4dac1e8f385004d5fc253009
18291829
nanopb: 438bc412db1928dac798aa6fd75726007be04262
1830-
op-sqlite: 1aa4e1b456cff23410a28be65820d0c8bc74fb04
1830+
op-sqlite: 556313532c972dd2e5452f44efabffd9641b0e26
18311831
PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47
18321832
PromisesSwift: 9d77319bbe72ebf6d872900551f7eeba9bce2851
1833-
RCT-Folly: 7169b2b1c44399c76a47b5deaaba715eeeb476c0
1833+
RCT-Folly: cd21f1661364f975ae76b3308167ad66b09f53f5
18341834
RCTRequired: d362a61864a64315aee00faea8dee6cf5b3f4aad
18351835
RCTTypeSafety: 09baf60faeab02492dc8bf04ce5af1dda645b86d
18361836
ReachabilitySwift: 7f151ff156cea1481a8411701195ac6a984f4979
18371837
React: b87c7c7c12f8232bd7cfdc4a00bf687144c17e30
18381838
React-callinvoker: 67de0bc05ecb7e690345a53a1661cea9b24670b0
1839-
React-Codegen: dd60c11cfeb20cdd8b5a787603346d4e04f95499
1840-
React-Core: 4c87a1873c6d11c6d3843582fbc266ba9ea304ce
1841-
React-CoreModules: 29ad1cbe757a70575913457bb7c646b7f4d4edf0
1842-
React-cxxreact: 08ffaf2def6fe1ec8ef7f16e208587c96a87978e
1839+
React-Codegen: e81f008b53f3db74336a4324ea2b1ca15d7fe2da
1840+
React-Core: 4cb660fe310d6ee6d1e87308c2bec1541e1a40b4
1841+
React-CoreModules: 12f9b33b8e1c67324be550e3c2ef1a03fa1aa473
1842+
React-cxxreact: 4abb46b2ce1fa4eabe1105be8df331fc2dca9706
18431843
React-debug: 30d97e8abfec9b6ba0ad111b92ac749d3ace2dd5
1844-
React-Fabric: 8da8e4c0ed603fbed5208f5045cd1582a96ffa3d
1845-
React-FabricImage: f0cf2b8a823e98dae20013910bbdd0889bc719c2
1846-
React-graphics: 6dc8dba8a095a962204dd8bd4ca8264a1ed718db
1847-
React-hermes: fdaab14cc289d8d9cd45ffd9a3f8aa11157d4c7e
1848-
React-ImageManager: 4a39d60f9163fce83474c2b79acec8336742983d
1849-
React-jserrorhandler: 81e19a227a75741456c8f7b1240fc8926fb48c7e
1850-
React-jsi: 2253621cb2fb5d43a78fec4db8989cf9711039df
1851-
React-jsiexecutor: 5e4620a87fbc4ab174d75220f06ba8b53ae8317b
1844+
React-Fabric: 93d15dfd53ea0a8ece4d4bc399924571c1ab2d1c
1845+
React-FabricImage: 3e7fa7e5bd260008741e60f7ca4f8d5417b5fa7f
1846+
React-graphics: fe19a38958a23f951ef36613a34a6e867a6ef8f9
1847+
React-hermes: 1f47d1f8b218565fd980eb00121d40e0ba2edcea
1848+
React-ImageManager: 941a294408b8a35cf929cf38d74deb83522c4556
1849+
React-jserrorhandler: c06aabbbcd49aad9ddaa360b1fedaa7a4a0e820e
1850+
React-jsi: 0422dc0b680234b3eabee952c20e23ca63e10b3d
1851+
React-jsiexecutor: a61443a46b9616f17142d8f63d2e788f9b634be6
18521852
React-jsinspector: aee04d04ef553d5e30e52a4de2af958cb060069f
1853-
React-logger: 87a4232dd55485435edfa6803ff0de0b5c9eea1a
1854-
React-Mapbuffer: 94db5977cd64330f9e715c19026c9a267d8358a5
1855-
react-native-branch: 021b9c261f732d0950e9a304284779d48bf81109
1856-
react-native-context-menu-view: dcec18eb8882e20596dbb75802e7d19cb87dac02
1857-
react-native-cookies: f54fcded06bb0cda05c11d86788020b43528a26c
1858-
react-native-get-random-values: 21325b2244dfa6b58878f51f9aa42821e7ba3d06
1859-
react-native-netinfo: 3aa5637c18834966e0c932de8ae1ae56fea20a97
1860-
react-native-safe-area-context: b97eb6f9e3b7f437806c2ce5983f479f8eb5de4b
1861-
react-native-webview: ad868affda04ff2b204de83546193bc0325a8280
1853+
React-logger: ef76a6d8e04672f19be9b3a49f6ecc4c7141399b
1854+
React-Mapbuffer: 30deaceab523707646f5f35efad961133e4e1f25
1855+
react-native-branch: 5d4ecda7bae040542f6c9f651a05d3df23d8b35a
1856+
react-native-context-menu-view: c7477ad2a9b5005eb45dd168c2dcdd64526dba77
1857+
react-native-cookies: d648ab7025833b977c0b19e142503034f5f29411
1858+
react-native-get-random-values: d16467cf726c618e9c7a8c3c39c31faa2244bbba
1859+
react-native-netinfo: 5364263f903da576bdef9c84a76fe243ab06812c
1860+
react-native-safe-area-context: 435f4c13ac75ceed6135382ee77d57d1a5b5b2d6
1861+
react-native-webview: dc76301066fed23a66b1198f990056d2f8c67d20
18621862
React-nativeconfig: 44cd3076b158c39cb6758f238cd3e65953e989c0
1863-
React-NativeModulesApple: af58ca346cf42c3bb4dab9173b6edd0c83c2a21c
1863+
React-NativeModulesApple: d8f0d34218e897ff56525e4446ba4d5e8f74f9c8
18641864
React-perflogger: c93b6a895eca3f9196656bb20ce0e15ad597a4e9
18651865
React-RCTActionSheet: 258842f426709dccbc2af31ca42b0a1807d76ad7
1866-
React-RCTAnimation: 78c40269e35864f541b7486d17bd82a353c99fbc
1867-
React-RCTAppDelegate: d98ec2cdfb161d7a8496990e9649f94018025922
1868-
React-RCTBlob: 593a5dbc58c45e3cccc37ad4498b10766ace26e6
1869-
React-RCTFabric: c589babe0224cb137f64bfa4770e92d752c18012
1870-
React-RCTImage: a0cdbb81db012ebc42c7dbaabdcb15f488c7c391
1871-
React-RCTLinking: 82b6b0a5b2d5c8d3a28997e70bda46bac4be4c6e
1872-
React-RCTNetwork: 45e30079bcb987724028c9a93c0110b6d82e4a1f
1873-
React-RCTSettings: e67cbe694fe45b080b96b1394d4e45dff1b3ae04
1874-
React-RCTText: 14a54686a1fa0b51b76660c7700980fdec6c3093
1875-
React-RCTVibration: 00561f3d12dca44ed55af9060752bf8cf3fb0bfc
1876-
React-rendererdebug: 9e62f84756f080d88ed01b8063355c3a042934ed
1866+
React-RCTAnimation: e173f27b6e20108354df11ee0ae5a9f7fe09930f
1867+
React-RCTAppDelegate: 8c1e725f4be6d5fb55e7ea62b76c929eddcb859e
1868+
React-RCTBlob: 2135cb24f3fa9f4617d7cae03aee10724d5122bb
1869+
React-RCTFabric: 51dbbcfa09f76183d2fe9d305eedf0f4f7343333
1870+
React-RCTImage: 345d59868e372e90a40f30f9775c8f34c50b5ebb
1871+
React-RCTLinking: d9623fb24075a5a7b9d5f263297135c5128ea37c
1872+
React-RCTNetwork: 4dfc12857609eae588c212268656bf0ff3ebe1f3
1873+
React-RCTSettings: 5fa0803b17f29d87dc8d4649a1e5a32d4d081237
1874+
React-RCTText: f23cca90ce571720460ee8e3525ff7e5f1af5ad0
1875+
React-RCTVibration: efd2a82f8ecac6e7b363689322215735d1cbcf9e
1876+
React-rendererdebug: ea0f77385485b5251a0e61133e3b5f709ef02e9b
18771877
React-rncore: e7f10bc6dbd75fa137583bd3b2bc4880203dbc1d
18781878
React-runtimeexecutor: bf98e8973ed4c45139fbbaf2c34af44053acc9a9
1879-
React-runtimescheduler: 7a4ccc1854c5918dee508536fad93172b4c49629
1880-
React-utils: 59bbef368c9ba8b6e27416b46933cd03a35f2841
1881-
ReactCommon: 656e520d76937c8d781ef82a7186a4af7160d814
1882-
recaptcha-enterprise-react-native: 7d63c5bdde3b48996b984a86ac2b536a1d8f5f16
1879+
React-runtimescheduler: e6288bce4309ba16280ce54690b4d7109091ff43
1880+
React-utils: 28bc17e3e21dc06646b45a003718e0fe6034c66f
1881+
ReactCommon: e7f772a7660fc683a6ba0a0e0bebd45f4977ee57
1882+
recaptcha-enterprise-react-native: 82f186a0ab29c91c4d4bd08f7758f849e91b4558
18831883
RecaptchaEnterprise: dc302910b77963a0cc6f6908407e30b35268a755
18841884
RecaptchaInterop: 7d1a4a01a6b2cb1610a47ef3f85f0c411434cb21
1885-
RNCAsyncStorage: 618d03a5f52fbccb3d7010076bc54712844c18ef
1886-
RNCClipboard: 090462274cc05b02628bd158baf6d73c3abe8441
1887-
RNDeviceInfo: db5c64a060e66e5db3102d041ebe3ef307a85120
1888-
RNFBApp: 91311b27bc9a33e23b76a62825afd1635501018a
1889-
RNFBCrashlytics: c3219ef7a0c779f2428236215781c38e7892f6f9
1890-
RNFBPerf: 2c926ff255c704a644dd53572008cba47c67ada0
1891-
RNFlashList: 4b4b6b093afc0df60ae08f9cbf6ccd4c836c667a
1892-
RNGestureHandler: 79c035e2243d3b7f4f353e7eb32869eace6b596c
1893-
RNReanimated: 4b1bce37b188450e3a2d03c925edd5fb11d4bb2d
1894-
RNScreens: a4d9ce8f68f833f4e42410140eafd88e38bba163
1895-
RNSVG: 3f65a03e0c61a8495dee92bf82545ed9041cbf3b
1885+
RNCAsyncStorage: a03b770a50541a761447cea9c24536047832124d
1886+
RNCClipboard: c20b93d3a1b47ce86dcffa5c0af5dd59938e47e1
1887+
RNDeviceInfo: addb9b427c2822a2d8e94c87a136a224e0af738c
1888+
RNFBApp: e905ce948d9290555d9ab1303449827eb5119b5c
1889+
RNFBCrashlytics: e9459c8656ccbbb53d12afe47b4a96194c858745
1890+
RNFBPerf: ae6cfdac3e06eab3d4d092944e979e95a69b0179
1891+
RNFlashList: 1076a3fb7c4608a8cdf265f0783592b8fc41b6a7
1892+
RNGestureHandler: 9852b7617e28551f5d339309c73ebf221ba1013d
1893+
RNReanimated: 1b07d2def747e4e5510ecd8460b2862029ee3df2
1894+
RNScreens: 1174f55dd2f72abe45a4e48bf20e552feb051600
1895+
RNSVG: a9e095acf2e207f2ef491870523ed455636cf3b8
18961896
SDWebImage: 750adf017a315a280c60fde706ab1e552a3ae4e9
18971897
SDWebImageAVIFCoder: 8348fef6d0ec69e129c66c9fe4d74fbfbf366112
18981898
SDWebImageSVGCoder: 15a300a97ec1c8ac958f009c02220ac0402e936c
18991899
SDWebImageWebPCoder: af09429398d99d524cae2fe00f6f0f6e491ed102
19001900
SocketRocket: f32cd54efbe0f095c4d7594881e52619cfe80b17
19011901
sqlite3: f163dbbb7aa3339ad8fc622782c2d9d7b72f7e9c
1902-
tentap: 2cf2e387dd284bf867010eb7d0f91618fb35b673
1902+
tentap: 2a4256b6641a27d72d2b5fe2eb94cd1a203e4975
19031903
UMAppLoader: 79d3ee6aa2447a1fe2e8b0d07acf2de106e55b58
1904-
Yoga: 4dbfeceb9bb0f62899d0a53d37a1ddd58898d3f2
1904+
Yoga: fb61b2337c7688c81a137e5560b3cbb515289f91
19051905

19061906
PODFILE CHECKSUM: 0cb7a78e5777e69c86c1bf4bb5135fd660376dbe
19071907

1908-
COCOAPODS: 1.15.2
1908+
COCOAPODS: 1.16.2

packages/app/ui/components/Activity/ActivityScreenView.tsx

+4-3
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import React, { useCallback, useEffect, useMemo, useState } from 'react';
77
import { FlatList, RefreshControl, StyleProp, ViewStyle } from 'react-native';
88
import { View, useStyle } from 'tamagui';
99

10-
import { NavigationProvider } from '../../contexts';
10+
import { NavigationProvider, useStore } from '../../contexts';
1111
import { GroupPreviewAction, GroupPreviewSheet } from '../GroupPreviewSheet';
1212
import { ActivityHeader } from './ActivityHeader';
1313
import { ActivityListItem } from './ActivityListItem';
@@ -33,7 +33,8 @@ export function ActivityScreenView({
3333
bucketFetchers: store.BucketFetchers;
3434
refresh: () => Promise<void>;
3535
}) {
36-
const activitySeenMarker = db.activitySeenMarker.useValue();
36+
const store = useStore();
37+
const { data: activitySeenMarker } = store.useActivitySeenMarker();
3738
const [activeTab, setActiveTab] = useState<db.ActivityBucket>('all');
3839
const currentFetcher = bucketFetchers[activeTab];
3940

@@ -49,7 +50,7 @@ export function ActivityScreenView({
4950
setTimeout(() => {
5051
store.advanceActivitySeenMarker(newestTimestamp);
5152
}, 1000);
52-
}, [newestTimestamp]);
53+
}, [newestTimestamp, store]);
5354

5455
useEffect(() => {
5556
if (

packages/shared/src/api/settingsApi.ts

+3
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ function getBucket(key: string): string {
2323
switch (key) {
2424
case 'messagesFilter':
2525
return 'talk';
26+
case 'activitySeenTimestamp':
27+
return 'groups';
2628
default:
2729
throw new Error(`Invalid setting key: ${key}`);
2830
}
@@ -92,6 +94,7 @@ export const toClientSettings = (
9294
messagesFilter: settings.desk.talk?.messagesFilter,
9395
gallerySettings: settings.desk.heaps?.heapSettings,
9496
notebookSettings: JSON.stringify(settings.desk.diary),
97+
activitySeenTimestamp: settings.desk.groups?.activitySeenTimestamp,
9598
};
9699
};
97100

packages/shared/src/db/migrations/0000_outgoing_valkyrie.sql packages/shared/src/db/migrations/0000_sour_wonder_man.sql

+2-1
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,8 @@ CREATE TABLE `settings` (
326326
`messages_nav_state` text,
327327
`messages_filter` text,
328328
`gallery_settings` text,
329-
`notebook_settings` text
329+
`notebook_settings` text,
330+
`activity_seen_timestamp` integer
330331
);
331332
--> statement-breakpoint
332333
CREATE TABLE `thread_unreads` (

packages/shared/src/db/migrations/meta/0000_snapshot.json

+38-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"version": "6",
33
"dialect": "sqlite",
4-
"id": "6dc0c522-044d-4399-9e6d-6c46177eeac3",
4+
"id": "fa25c16a-e15a-45be-9783-6405cc7a2e14",
55
"prevId": "00000000-0000-0000-0000-000000000000",
66
"tables": {
77
"activity_event_contact_group_pins": {
@@ -639,7 +639,21 @@
639639
}
640640
},
641641
"indexes": {},
642-
"foreignKeys": {},
642+
"foreignKeys": {
643+
"group_members_chat_id_channels_id_fk": {
644+
"name": "group_members_chat_id_channels_id_fk",
645+
"tableFrom": "group_members",
646+
"tableTo": "channels",
647+
"columnsFrom": [
648+
"chat_id"
649+
],
650+
"columnsTo": [
651+
"id"
652+
],
653+
"onDelete": "cascade",
654+
"onUpdate": "no action"
655+
}
656+
},
643657
"compositePrimaryKeys": {
644658
"group_members_chat_id_contact_id_pk": {
645659
"columns": [
@@ -2033,7 +2047,21 @@
20332047
"isUnique": false
20342048
}
20352049
},
2036-
"foreignKeys": {},
2050+
"foreignKeys": {
2051+
"posts_channel_id_channels_id_fk": {
2052+
"name": "posts_channel_id_channels_id_fk",
2053+
"tableFrom": "posts",
2054+
"tableTo": "channels",
2055+
"columnsFrom": [
2056+
"channel_id"
2057+
],
2058+
"columnsTo": [
2059+
"id"
2060+
],
2061+
"onDelete": "cascade",
2062+
"onUpdate": "no action"
2063+
}
2064+
},
20372065
"compositePrimaryKeys": {},
20382066
"uniqueConstraints": {},
20392067
"checkConstraints": {}
@@ -2180,6 +2208,13 @@
21802208
"primaryKey": false,
21812209
"notNull": false,
21822210
"autoincrement": false
2211+
},
2212+
"activity_seen_timestamp": {
2213+
"name": "activity_seen_timestamp",
2214+
"type": "integer",
2215+
"primaryKey": false,
2216+
"notNull": false,
2217+
"autoincrement": false
21832218
}
21842219
},
21852220
"indexes": {},

packages/shared/src/db/migrations/meta/_journal.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
{
66
"idx": 0,
77
"version": "6",
8-
"when": 1739215059171,
9-
"tag": "0000_outgoing_valkyrie",
8+
"when": 1742234785697,
9+
"tag": "0000_sour_wonder_man",
1010
"breakpoints": true
1111
}
1212
]

packages/shared/src/db/migrations/migrations.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// This file is required for Expo/React Native SQLite migrations - https://orm.drizzle.team/quick-sqlite/expo
22

33
import journal from './meta/_journal.json';
4-
import m0000 from './0000_outgoing_valkyrie.sql';
4+
import m0000 from './0000_sour_wonder_man.sql';
55

66
export default {
77
journal,

packages/shared/src/db/schema.ts

+1
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ export const settings = sqliteTable('settings', {
5151
messagesFilter: text('messages_filter'),
5252
gallerySettings: text('gallery_settings'),
5353
notebookSettings: text('notebook_settings', { mode: 'json' }),
54+
activitySeenTimestamp: timestamp('activity_seen_timestamp'),
5455
});
5556

5657
export const contacts = sqliteTable('contacts', {

packages/shared/src/store/activityActions.ts

+10-2
Original file line numberDiff line numberDiff line change
@@ -133,9 +133,17 @@ export async function setDefaultNotificationLevel(
133133
}
134134

135135
export async function advanceActivitySeenMarker(timestamp: number) {
136-
const existingMarker = await db.activitySeenMarker.getValue();
136+
const currentUserId = api.getCurrentUserId();
137+
const settings = await db.getSettings(currentUserId);
138+
const existingMarker = settings?.activitySeenTimestamp ?? 1;
137139
if (timestamp > existingMarker) {
138-
db.activitySeenMarker.setValue(timestamp);
140+
// optimistic update
141+
db.insertSettings({
142+
userId: currentUserId,
143+
activitySeenTimestamp: timestamp,
144+
});
145+
146+
await api.setSetting('activitySeenTimestamp', timestamp);
139147
}
140148
}
141149

0 commit comments

Comments
 (0)