;; disfluid, implementation of the Solid specification ;; Copyright (C) 2021 Vivien Kraus ;; This program is free software: you can redistribute it and/or modify ;; it under the terms of the GNU Affero General Public License as ;; published by the Free Software Foundation, either version 3 of the ;; License, or (at your option) any later version. ;; This program is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU Affero General Public License for more details. ;; You should have received a copy of the GNU Affero General Public License ;; along with this program. If not, see . (define-module (webid-oidc client gui accounts-widget) #:use-module (gi) #:use-module (gi types) #:use-module (gi util) #:use-module (ice-9 match) #:use-module (ice-9 exceptions) #:use-module (ice-9 i18n) #:use-module (ice-9 receive) #:use-module (ice-9 optargs) #:use-module (ice-9 pretty-print) #:use-module (srfi srfi-9) #:use-module (srfi srfi-19) #:use-module (srfi srfi-26) #:use-module (webid-oidc errors) #:use-module ((webid-oidc stubs) #:prefix stubs:) #:use-module ((webid-oidc config) #:prefix config:) #:use-module (webid-oidc web-i18n) #:use-module (webid-oidc client client) #:use-module (webid-oidc client accounts) #:use-module (webid-oidc client gui account-widget) #:use-module ((webid-oidc client gui settings) #:prefix settings:) #:use-module (webid-oidc client gui application-hooks) #:use-module (webid-oidc client gui authorizations-widget) #:use-module (webid-oidc client gui accounts-widget-logic) #:use-module (webid-oidc client application) #:use-module (webid-oidc jwk) #:use-module (webid-oidc oidc-id-token) #:use-module (web uri) #:use-module (web response) #:use-module (rnrs bytevectors) #:use-module (oop goops) #:declarative? #t #:duplicates (merge-generics) #:export ( ->widget )) (push-duplicate-handler! 'merge-generics) ;; This avoids a crash when compiling the module (use-typelibs ("GdkPixbuf" "2.0") ("Gtk" "3.0")) (define srfi-1:map (@ (srfi srfi-1) map)) (define account:->widget (@ (webid-oidc client gui account-widget) ->widget)) (define-method (->widget (application )) (let ((builder (builder:new-from-file (string-append config:uidir "/accounts-widget.glade")))) (let ((accounts-widget (builder:get-object builder "accounts_widget")) (main-account-box (builder:get-object builder "main_account_box")) (other-accounts-box (builder:get-object builder "other_accounts_box")) (identity-provider-entry (builder:get-object builder "identity_provider_entry")) (add-account-button (builder:get-object builder "add_account_button")) (builders (list builder))) (let ((main-widget (let ((acct (main-account application))) (if acct (receive (additional-builder widget) (account:->widget acct #f) (set! builders `(,additional-builder ,@builders)) widget) (label:new (G_ "Please add an account."))))) (other-widgets (srfi-1:map (lambda (account) (receive (additional-builder widget) (account:->widget account #t) (set! builders `(,additional-builder ,@builders)) widget)) (other-accounts application)))) (define (add-account-activated . _) (add-account-button-clicked (entry:get-text identity-provider-entry) (lambda () (widget:set-sensitive identity-provider-entry #f) (widget:set-sensitive add-account-button #f)))) (box:pack-end main-account-box main-widget #t #t 0) (for-each (cute box:pack-end other-accounts-box <> #t #t 0) other-widgets) (connect identity-provider-entry activate add-account-activated) (connect add-account-button clicked add-account-activated) (values builder accounts-widget)))))