Jewelry AIのストア画面

成功と表示された復元が伝えているのは、呼び出しが失敗しなかったことだけです

「購入を復元」をタップすると、ストアプロバイダーの復元が呼び出され、その完了を待ってから、サーバーからウォレットが読み直されます。購入とは違い、この一連の流れのどこにも残高が変わったかどうかを確かめる処理はありません。返ってくるメッセージが説明しているのは、結果ではなく呼び出しのほうです。

ボタンが実行するもの、その順番

「購入を復元」には、順番に起きる二つの処理が結び付けられています。画面はストアプロバイダーの復元を呼び出して待機し、その呼び出しが戻るとサーバーからウォレットを読み直します。どちらもapps/jewelry-mobile/src/app/store/index.tsxで確認でき、待機付きの復元の呼び出しに続いてウォレットの再読み込みが行われます。

購入は違う扱いを受けます。購入は、画面が何かを返す前にクレジットの変化と突き合わせて確認されます。復元の経路には、これに当たる確認がありません。呼び出しの前のウォレットと、呼び出しのあとのウォレットを比べる場面はどこにもないのです。

そこから言えることは狭く、そして正確です。呼び出しがエラーなく戻れば、成功メッセージが表示されます。メッセージが説明しているのは呼び出しです。アカウントを説明しているのではなく、アカウントから導かれたものでもありません。

復元のコントロールは、自分が押せるかどうかを自分で決めているわけではありません。ストア画面の他の部分と、有効か無効かの状態を共有しています。

ストアの商品情報が準備できていない限り、リンクは無効です。
apps/jewelry-mobile/src/app/store/index.tsxにあるこのコントロールの無効条件は availability !== 'ready' || busy です。商品情報を読み込めないとき、復元のリンクは画面の他の部分と一緒に閉じたままになります。同じ条件は購入がまだ実行中の間も復元を閉じたままにしますが、それは購入の流れに属する挙動で、ここでは扱いません。
商品情報を取得できない利用者は、復元を始めることもできません。
この二つはインターフェースの上で結び付けられています。商品情報を出せなかった画面は、復元を始められない画面でもあります。二つの事柄がどれほど無関係であってもです。
この依存関係は画面側の制限であって、技術的な要件ではありません。
復元のロジック自体は、商品情報が読み込まれていることに依存していません。この要件はボタンの無効条件のなかにだけあり、それは復元ではなく画面の性質です。
商品情報の読み込みが失敗した理由は、別の問いです。
それには固有の原因があり、別のページが扱う内容です。ここで改めて導き直すことはしません。

復元のあとに、自分の画面を読む

この流れは、読む対象を二つ残します。両者の関係は次のとおりです。

状況選択理由
メッセージは成功と伝え、ウォレットの表示は控えておいた値と違っている。画面の表示を結果として扱う。ウォレットは呼び出しのあとにサーバーから読み直されるため、画面の値は取り直したばかりの値です。一方でメッセージは、呼び出しがエラーにならなかったことしか伝えていません。
メッセージは成功と伝え、ウォレットの表示は変わっていない。この二つを矛盾として読まない。メッセージは、エラーなく戻った呼び出しから生まれたものです。残高が動いたという主張では最初からありません。
復元のリンクがタップできない。結論を出す前に、ストア画面の状態を確かめる。商品情報が準備できていない間このコントロールは無効になります。つまり流れは実行されておらず、アカウントについては何も試されていません。
特定の種類の商品について、ストアが何を返したのかを知りたい。このページの範囲外として扱う。検証されたのは、この画面が行う呼び出しとそれに続く再読み込みであって、ストアプロバイダー自身の挙動ではありません。

段階ごとに見た流れ

どの段階も何かを実行しますが、確認している内容は、次の段階が約束しているように見えるものより少なくなっています。

段階起きること確認されること
リンクの状態ストアの商品情報が準備できている間だけコントロールが有効になる何かが実行される前の、商品情報の準備状況
復元の呼び出しストアプロバイダーの復元が動き、画面はそれを待つ呼び出しがエラーを返したかどうか
ウォレットの再読み込みウォレットがサーバーから読み直される先の表示と突き合わせられるものは何もない
メッセージ成功メッセージが表示されるエラーがなかったこと以外は何も

何も戻ってこなかったと結論づける前に

メッセージと画面とアカウントを互いに切り離しておくための、五つの確認です。

  • タップした時点で、復元のリンクが実際に押せる状態だったことを確かめる。
  • タップ前のウォレットの表示を控えておく。あとの再読み込みは、事前の表示があってはじめて役に立つ。
  • メッセージは、アカウントではなく呼び出しについての記述として読む。
  • 二つのメッセージを比べるのではなく、二つのウォレットの表示を比べる。
  • 商品情報を読み込めなかった理由と、復元が何をしたのかという問いを分けておく。

このページで決着しないこと

ここまでの挙動は、アプリの一つの画面から読み取ったものです。以下はすべてその外側にあります。

  • ストアプロバイダー自身が何を返すのか、商品の種類によって扱いをどう変えるのか。これはストア内部の挙動であり、検証された範囲に含まれていません。
  • 支払いのあと、サーバー上でクレジットがどのように、どの順序で、どれくらいの速さで作られるのか。調べたのは、クライアント側の待機と表示の挙動だけです。
  • ストアの商品情報の読み込みが失敗する理由。それには固有の原因があり、別のページが扱います。
  • キャンセルされた購入や失敗した購入がどうなるのか。その流れは別に扱われます。
  • ウォレットと取引履歴の画面の挙動。今回の調査の対象ではありません。
  • 価格、金額、プラン、通貨に関すること。いずれもこのページの範囲には入りません。

よくある質問

「購入を復元」でクレジットは戻ってきますか。

検証されているのは、ボタンがストアプロバイダーの復元の呼び出しを実行し、そのあとサーバーからウォレットを読み直すという点です。何かが戻ってくるかどうかはこの流れでは確認されておらず、このページから述べられることでもありません。成功メッセージが伝えているのは、呼び出しがエラーにならなかったことだけです。

復元のリンクがグレーアウトしています。アカウントに問題があるのでしょうか。

ストア画面の商品情報が準備できていない間、このコントロールは無効になります。グレーアウトしたリンクは、アカウントではなく画面についての情報です。リンクが押せるようになるまで、何も試されていません。

復元は成功したと出たのに、画面は何も変わりませんでした。失敗したのでしょうか。

メッセージは呼び出しがエラーなく戻ったときに表示されるので、画面が変わらないことはメッセージと矛盾しません。情報を持っている比較は、タップの前と後に読んだウォレットの表示のほうです。

新しいスマートフォンを設定しています。復元を実行すると何が分かりますか。

呼び出しが実行され、エラーにならなかったことが分かります。そして、サーバーから読み直したばかりのウォレットの値が手元に残ります。ストアが何を返したのかは分かりません。それは、このページが書かれた対象の外にあります。