fix(market): search your zone by a coarse prefix, not the exact cell
Discovery searched the full 5-char geohash (~2.4 km) with an exact Nostr tag match, so two devices in adjacent cells never found each other even though publish emits the full NIP-52 prefix ladder. Search now coarsens the area to a configurable precision (SocialSettings.searchPrecision, default 4 ~20 km) via searchPrefix(), with a human-worded 'how far' selector (Very close / Around here / My region -> 5/4/3) in the market setup sheet. Also: surface a clear 'couldn't reach the servers' message when no relay accepts a share (instead of 'shared 0'), and add wss://relay.comunes.org as the first default relay (reliable community home; public relays are backup). Tests: settings precision (default/clamp/roundtrip), searchPrefix helper, neighbour-cell discovery regression (offers_cubit + commons_core nostr transports), and the range-selector widget test.
This commit is contained in:
parent
1fb8e37536
commit
97b9223cb2
16 changed files with 268 additions and 10 deletions
|
|
@ -4,6 +4,7 @@ import 'package:commons_core/commons_core.dart';
|
|||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:tane/data/variety_repository.dart';
|
||||
import 'package:tane/db/enums.dart';
|
||||
import 'package:tane/services/discovery_area.dart';
|
||||
import 'package:tane/services/offer_mapper.dart';
|
||||
import 'package:tane/services/offer_outbox.dart';
|
||||
import 'package:tane/state/offers_cubit.dart';
|
||||
|
|
@ -152,6 +153,31 @@ void main() {
|
|||
await cubit.close();
|
||||
});
|
||||
|
||||
test('a neighbour in an adjacent cell is found via the coarsened prefix',
|
||||
() async {
|
||||
// Regression: A publishes at 'sp3e9', B lives one ±2.4 km cell over at
|
||||
// 'sp3e8'. Searching B's full 5-char area misses it; searching the
|
||||
// precision-4 prefix ('sp3e') finds it, because publish emits the ladder.
|
||||
final transport = FakeOfferTransport();
|
||||
await transport.publish(OfferMapper.fromSharedLot(
|
||||
lotId: 'lot-1',
|
||||
authorPubkeyHex: 'ab' * 32,
|
||||
summary: 'Tomate rosa',
|
||||
sharing: OfferStatus.shared,
|
||||
areaGeohash: 'sp3e9',
|
||||
));
|
||||
final cubit = OffersCubit(transport);
|
||||
|
||||
await cubit.discover(searchPrefix('sp3e8', 4)); // 'sp3e'
|
||||
await pumpEventQueue();
|
||||
expect(cubit.state.offers, hasLength(1));
|
||||
|
||||
await cubit.discover('sp3e8'); // full precision → the old, broken behaviour
|
||||
await pumpEventQueue();
|
||||
expect(cubit.state.offers, isEmpty);
|
||||
await cubit.close();
|
||||
});
|
||||
|
||||
test('a different area finds nothing', () async {
|
||||
final transport = FakeOfferTransport();
|
||||
await transport.publish(OfferMapper.fromSharedLot(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue