()
| 161 | } |
| 162 | |
| 163 | export default function Invite() { |
| 164 | const router = useRouter() |
| 165 | const params = useParams() |
| 166 | const inviteId = params.id as string |
| 167 | const inviteTokenStorageKey = `inviteToken:${inviteId}` |
| 168 | const searchParams = useSearchParams() |
| 169 | const { data: session, isPending } = useSession() |
| 170 | const queryClient = useQueryClient() |
| 171 | const [invitation, setInvitation] = useState<InvitationDetails | null>(null) |
| 172 | const [isLoading, setIsLoading] = useState(true) |
| 173 | const [error, setError] = useState<InviteError | null>(null) |
| 174 | const [isAccepting, setIsAccepting] = useState(false) |
| 175 | const [accepted, setAccepted] = useState(false) |
| 176 | const [isNewUser, setIsNewUser] = useState(false) |
| 177 | const [token, setToken] = useState<string | null>(null) |
| 178 | |
| 179 | useEffect(() => { |
| 180 | const errorReason = searchParams.get('error') |
| 181 | const isNew = searchParams.get('new') === 'true' |
| 182 | setIsNewUser(isNew) |
| 183 | |
| 184 | const tokenFromQuery = searchParams.get('token') |
| 185 | if (tokenFromQuery) { |
| 186 | setToken(tokenFromQuery) |
| 187 | sessionStorage.setItem(inviteTokenStorageKey, tokenFromQuery) |
| 188 | } else { |
| 189 | const storedToken = sessionStorage.getItem(inviteTokenStorageKey) |
| 190 | if (storedToken) { |
| 191 | setToken(storedToken) |
| 192 | } |
| 193 | } |
| 194 | |
| 195 | if (errorReason) { |
| 196 | setError(getInviteError(errorReason)) |
| 197 | setIsLoading(false) |
| 198 | } |
| 199 | }, [searchParams, inviteId, inviteTokenStorageKey]) |
| 200 | |
| 201 | useEffect(() => { |
| 202 | if (!session?.user) return |
| 203 | |
| 204 | async function fetchInvitation() { |
| 205 | setIsLoading(true) |
| 206 | try { |
| 207 | const data = await requestJson(getInvitationContract, { |
| 208 | params: { id: inviteId }, |
| 209 | query: { token: token ?? undefined }, |
| 210 | }) |
| 211 | setInvitation(data.invitation) |
| 212 | setError(null) |
| 213 | } catch (fetchError) { |
| 214 | logger.error('Error fetching invitation:', fetchError) |
| 215 | const code = |
| 216 | fetchError instanceof ApiClientError |
| 217 | ? codeFromApiClientError(fetchError) |
| 218 | : 'network-error' |
| 219 | setError(getInviteError(code)) |
| 220 | } finally { |
nothing calls this directly
no test coverage detected