-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpage.tsx
More file actions
108 lines (96 loc) · 3.37 KB
/
page.tsx
File metadata and controls
108 lines (96 loc) · 3.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
'use client';
import { ExploreHeader, MenuHeader } from '@/components/header';
import MapView from '@/components/map/MapView';
import * as S from './page.styles';
import { useEffect, useMemo, useState } from 'react';
import { getCurrentPosition } from '@/utils/getCurrentPosition';
import { LocationState } from '@/types/map.type';
import BottomSheet from '@/components/bottomSheet/BottomSheet';
import { SHEET_CONTEXT_TYPE, SheetContext } from '@/components/bottomSheet/constants';
import { DEFAULT_LOCATION, DEFAULT_ZOOM } from './constants';
import { useSelectableAlbums } from '@/hooks/queries/useSelectableAlbums';
import { useAlbumPhotos } from '@/hooks/queries/useAlbumPhotos';
import { useMapPhotos } from '@/hooks/queries/useMapPhotos';
import type { AlbumDetailData } from '@/types/album.type';
const calculateBbox = (viewState: LocationState): string => {
const offset = 0.05;
const west = viewState.longitude - offset;
const south = viewState.latitude - offset;
const east = viewState.longitude + offset;
const north = viewState.latitude + offset;
return `${west},${south},${east},${north}`;
};
export default function MapPage() {
const [viewState, setViewState] = useState<LocationState | null>(null);
const [sheetContext, setSheetContext] = useState<SheetContext>({
type: SHEET_CONTEXT_TYPE.HOME,
});
const selectedAlbumId =
sheetContext.type === SHEET_CONTEXT_TYPE.ALBUM_DETAIL ? sheetContext.albumId : null;
const { albumList } = useSelectableAlbums();
const { albumDetail } = useAlbumPhotos(selectedAlbumId);
const { mapPins } = useMapPhotos({
zoom: viewState?.zoom ?? DEFAULT_ZOOM,
bbox: viewState ? calculateBbox(viewState) : '',
albumId: selectedAlbumId,
});
const albumDetailById = useMemo<Record<number, AlbumDetailData>>(() => {
if (!albumDetail) return {};
return { [albumDetail.id]: albumDetail };
}, [albumDetail]);
useEffect(() => {
const init = async () => {
try {
const pos = await getCurrentPosition();
setViewState({
latitude: pos.coords.latitude,
longitude: pos.coords.longitude,
zoom: DEFAULT_ZOOM,
});
} catch (err) {
console.log(err);
setViewState(DEFAULT_LOCATION);
}
};
init();
}, []);
const selectedAlbumTitle = albumDetail?.title;
const handleSelectAlbum = (albumId: number) => {
setSheetContext({ type: SHEET_CONTEXT_TYPE.ALBUM_DETAIL, albumId });
};
const handleCloseAlbumDetail = () => {
setSheetContext({ type: SHEET_CONTEXT_TYPE.ALBUM_LIST });
};
return (
<S.Wrapper>
<S.HeaderContainer>
{sheetContext.type === SHEET_CONTEXT_TYPE.ALBUM_DETAIL ? (
<MenuHeader
title={selectedAlbumTitle ?? '앨범'}
onClickBack={handleCloseAlbumDetail}
/>
) : (
<ExploreHeader
title="서울특별시 마포구"
onClickProfile={() => {}}
onClickExplore={() => {}}
/>
)}
</S.HeaderContainer>
{viewState && (
<MapView
locationState={viewState}
pins={mapPins}
selectedAlbumId={selectedAlbumId}
/>
)}
<BottomSheet
context={sheetContext}
albums={albumList}
albumDetailById={albumDetailById}
onChangeContext={setSheetContext}
onSelectAlbum={handleSelectAlbum}
/>
</S.Wrapper>
);
}