ぼざクリタグ広場 https://hub.nizika.monster
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

71 lines
2.1 KiB

  1. import { useState } from 'react'
  2. import { useDialogue } from '@/components/dialogues/DialogueProvider'
  3. import { Button } from '@/components/ui/button'
  4. import { Dialog,
  5. DialogContent,
  6. DialogDescription,
  7. DialogHeader,
  8. DialogTitle } from '@/components/ui/dialog'
  9. import { Input } from '@/components/ui/input'
  10. import { toast } from '@/components/ui/use-toast'
  11. import { apiPost } from '@/lib/api'
  12. import type { User } from '@/types'
  13. type Props = { visible: boolean
  14. onVisibleChange: (visible: boolean) => void
  15. setUser: (user: User) => void }
  16. export default ({ visible, onVisibleChange, setUser }: Props) => {
  17. const dialogue = useDialogue ()
  18. const [inputCode, setInputCode] = useState ('')
  19. const handleTransfer = async () => {
  20. if (!(await dialogue.confirm ({
  21. title: '引継ぎを行ってもよろしいですか?',
  22. description: '現在のアカウントからはログアウトされます.',
  23. confirmText: '引継ぐ',
  24. variant: 'danger' })))
  25. return
  26. try
  27. {
  28. const data = await apiPost<{ valid: boolean; user: User }> (
  29. '/users/verify', { code: inputCode })
  30. if (data.valid)
  31. {
  32. localStorage.setItem ('user_code', inputCode)
  33. setUser (data.user)
  34. toast ({ title: '引継ぎ成功!' })
  35. onVisibleChange (false)
  36. }
  37. else
  38. toast ({ title: '認証失敗', description: 'そのコードは使へません.' })
  39. }
  40. catch
  41. {
  42. toast ({ title: '通信エラー', description: 'またあとで試してね.' })
  43. }
  44. }
  45. return (
  46. <Dialog open={visible} onOpenChange={onVisibleChange}>
  47. <DialogContent className="px-6 pp-6 pt-7">
  48. <DialogHeader className="pl-8">
  49. <DialogTitle>ほかのブラウザから引継ぐ</DialogTitle>
  50. <DialogDescription asChild>
  51. <div className="flex gap-2">
  52. <Input placeholder="引継ぎコードを入力"
  53. value={inputCode}
  54. onChange={ev => setInputCode (ev.target.value)}/>
  55. <Button onClick={handleTransfer}>引継ぐ</Button>
  56. </div>
  57. </DialogDescription>
  58. </DialogHeader>
  59. </DialogContent>
  60. </Dialog>)
  61. }