feat(travel): 좌표 없는 커스텀 지역에 항상 "위치 지정" 버튼 표시

지역 변경 직후뿐 아니라, 앨범의 지역이 좌표 미지정 커스텀
지역이면 헤더에 핀 버튼을 상시 노출. 기존 좌표가 있으면
RegionPinPicker에 초기값으로 전달.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-27 07:20:00 +09:00
parent fba101500e
commit b8eb290e4d

View File

@@ -189,6 +189,31 @@ export default function AlbumDetail({
/* ── Derived ── */
const regionAccent = getRegionAccent(album?.region || album?.id || '');
// Determine if the album's region is a custom region missing coordinates
const currentRegionId = savedRegionId || album?.region || album?.id || '';
const needsPin = useMemo(() => {
if (!currentRegionId || !regions?.features) return false;
const feature = regions.features.find((f) => {
const rid = f.properties?.id || f.properties?.name || '';
return rid.toLowerCase() === currentRegionId.toLowerCase();
});
if (!feature) return true; // region not in GeoJSON at all → needs pin
if (feature.properties?.custom && !feature.geometry) return true; // custom without coords
return false;
}, [currentRegionId, regions]);
// Coords of existing pin (for initialCoords in picker)
const existingCoords = useMemo(() => {
if (!currentRegionId || !regions?.features) return null;
const feature = regions.features.find((f) => {
const rid = f.properties?.id || f.properties?.name || '';
return rid.toLowerCase() === currentRegionId.toLowerCase();
});
if (feature?.geometry?.type === 'Point') return feature.geometry.coordinates;
return null;
}, [currentRegionId, regions]);
const photoCountLabel = photoSummary?.total
? `${photoSummary.total} photos`
: photos?.length
@@ -323,7 +348,7 @@ export default function AlbumDetail({
<path d="M7.5 1.5l1 1-5.5 5.5H2V7z" stroke="currentColor" strokeWidth="0.8" strokeLinejoin="round"/>
</svg>
</button>
{regionMsg?.type === 'ok' && savedRegionId && (
{(needsPin || (regionMsg?.type === 'ok' && savedRegionId)) && (
<button
className="album-detail__pin-btn"
onClick={handleOpenPinPicker}
@@ -349,11 +374,11 @@ export default function AlbumDetail({
</div>
{/* Pin Picker */}
{pinPickerOpen && savedRegionId && (
{pinPickerOpen && currentRegionId && (
<RegionPinPicker
regionId={savedRegionId}
regionName={savedRegionId}
initialCoords={null}
regionId={currentRegionId}
regionName={album?.regionName || currentRegionId}
initialCoords={existingCoords}
accent={regionAccent}
onSave={handlePinSave}
onClose={() => setPinPickerOpen(false)}